- Commit
- 64c1ff4ad588df2ce4d12fd7d5a770a7e07f7527
- Parent
- 58dab933c84bed23a74bd8b86003c1435f0ba771
- Author
- Pablo Escobar Gaviria <gark.garcia@protonmail.com>
- Date
Create a pure Wasm implementation.
An exercise on polyglossy: the same problem solved on multiple languages
Create a pure Wasm implementation.
5 files changed, 89 insertions, 23 deletions
Status | File Name | N° Changes | Insertions | Deletions |
Modified | C++/main.cpp | 3 | 1 | 2 |
Modified | C/main.c | 33 | 12 | 21 |
Added | Wasm/.gitignore | 1 | 1 | 0 |
Added | Wasm/main.wasm | 0 | 0 | 0 |
Added | Wasm/main.wat | 75 | 75 | 0 |
diff --git a/C++/main.cpp b/C++/main.cpp @@ -72,4 +72,4 @@ int main(int argc, char *argv[]) return SUCCESS; } else return INVALID_INPUT; -}- \ No newline at end of file +}
diff --git a/C/main.c b/C/main.c @@ -23,14 +23,14 @@ int err = SUCCESS; // Global error condition int *sums_cache; // Shared memory between threads +unsigned int max = 0; // Memory structure to pass arguments to threads using the pthreads library -struct iter_info +typedef struct { int start; - int interval; - int max; -}; + int step; +} iter_info; // Find the number of processors on host machine int get_num_cores() @@ -76,10 +76,10 @@ int sum_digits(unsigned n) return sum; } -int get_counterexpl_iter(struct iter_info *iter) +int get_counterexpl_iter(iter_info *iter) { - for (int a = iter->start; a <= iter->max; a += iter->interval) - for (int b = a; b <= iter->max; b++) + for (int a = iter->start; a <= max; a += iter->step) + for (int b = a; b <= max; b++) { if ((sums_cache[a + b] - (sums_cache[a] + sums_cache[b])) % 9 != 0) { @@ -95,20 +95,12 @@ int main(int argc, char *argv[]) { if (argc > 1) { - // Check if argv[1] is numeric - int i = 0; - while (argv[1][i] != '\0') - { - if (argv[1][i] < '0' || argv[1][i] > '9') - return INVALID_INPUT; - - i++; - } + max = strtoul(argv[1], NULL, 10); + if (max <= 0) return INVALID_INPUT; - unsigned int max = strtoul(argv[1], NULL, 10); int n_threads = get_num_cores(); pthread_t thread_ids[n_threads]; - struct iter_info thread_iters[n_threads]; + iter_info thread_iters[n_threads]; // Create the sums cache int sums_c = 2 * max; @@ -121,9 +113,7 @@ int main(int argc, char *argv[]) // of cores on the host machine for (int i = 0; i < n_threads; i++) { - thread_iters[i].start = i; - thread_iters[i].max = max; - thread_iters[i].interval = n_threads; + thread_iters[i] = (iter_info){i, n_threads}; err = pthread_create(&thread_ids[i], NULL, get_counterexpl_iter, &thread_iters[i]); if (err) fprintf(stderr, "Unable to create thread : %d\n", err); @@ -139,3 +129,4 @@ int main(int argc, char *argv[]) } else return INVALID_INPUT; } +
diff --git a/Wasm/.gitignore b/Wasm/.gitignore @@ -0,0 +1 @@ +test
diff --git a/Wasm/main.wasm b/Wasm/main.wasm Binary files differ.
diff --git a/Wasm/main.wat b/Wasm/main.wat @@ -0,0 +1,75 @@ +(module + ;; Check if the is any counterexample in {(x, y) | 0 <= x <= a, 0 <= y <= x} + (func (export "counterexempl") (param $a i32) (result i32) + (local $b i32) + + (block $break_0 ;; while a != 0 + (loop $while_0 + (br_if $break_0 (i32.eqz (local.get $a))) + (local.set $b (local.get $a)) ;; b = a + + (block $break_1 ;; while b != 0 + (loop $while_1 + (br_if $break_1 (i32.eqz (local.get $b))) + (if (call $test (local.get $a) (local.get $b)) ;; if test(a, b) + (block (i32.const 1) (return)) ;; return 1 + (block ;; else + (local.set $b (i32.sub (local.get $b) (i32.const 1))) ;; b -= 1 + (br $while_1) ;; continue + ) + ) + ) + ) + + (local.set $a (i32.sub (local.get $a) (i32.const 1))) ;; a -= 1 + (br $while_0) ;; continue + ) + ) + + (i32.const 0) ;; return 0 + ) + + ;; Calculates the sums of the digits of a non-negative integer. + (func $sum_digits (param $n i32) (result i32) + (local $sum i32) + (local.set $sum (i32.const 0)) + + (block $break + (loop $while + ;; Break if n == 0i32 + (br_if $break (i32.eqz (local.get $n))) + + ;; sum += n % 10 + (local.set $sum + (i32.add + (local.get $sum) + (i32.rem_u (local.get $n) (i32.const 10)) + ) + ) + + ;; n /= 10 + (local.set $n (i32.div_u (local.get $n) (i32.const 10))) + + ;; Go to `while` + (br $while) + ) + ) + + (local.get $sum) ;; return sum + ) + + ;; Checks if (sum_digits(a + b) - (sum_digits(a) + sum_digits(b))) % 9 != 0 + (func $test (export "test") (param $a i32) (param $b i32) (result i32) + (i32.ne + (i32.const 0) + (i32.rem_s + (i32.sub + (call $sum_digits (i32.add (local.get $a) (local.get $b))) + (i32.add (call $sum_digits (local.get $a)) (call $sum_digits (local.get $b))) + ) + (i32.const 9) + ) + ) + ) +) +