sleef
sleef copied to clipboard
Anyone working on adding WebAssembly as a target?
If not, is there any advice for starting to implement a new SIMD target?
It should be possible to implement it in a similar way to the CUDA target.
But WebAssembly doesn't have FMA. SLEEF is not so fast if FMA is not available.
I guess the inlinable header for SSE2 is already usable?
I tried it. It compiles, but does not run.
[oxygen]~/work/wasm/tmp$ cat hellowasm.c
#include <stdio.h>
#include <emmintrin.h>
#include "sleefinline_sse2.h"
int main(int argc, char **argv) {
double a[] = {2, 10};
double b[] = {3, 20};
__m128d va, vb, vc;
va = _mm_loadu_pd(a);
vb = _mm_loadu_pd(b);
vc = Sleef_powd2_u10sse2(va, vb);
double c[2];
_mm_storeu_pd(c, vc);
printf("pow(%g, %g) = %g\n", a[0], b[0], c[0]);
printf("pow(%g, %g) = %g\n", a[1], b[1], c[1]);
}
[oxygen]~/work/wasm/tmp$ emcc -msimd128 -msse2 hellowasm.c
[oxygen]~/work/wasm/tmp$ node --experimental-wasm-simd a.out.js
failed to asynchronously prepare wasm: CompileError: WebAssembly.instantiate(): Compiling function #4 failed: i16x8.replace_lane[1] expected type i32, found local.get of type s128 @+981
CompileError: WebAssembly.instantiate(): Compiling function #4 failed: i16x8.replace_lane[1] expected type i32, found local.get of type s128 @+981
RuntimeError: abort(CompileError: WebAssembly.instantiate(): Compiling function #4 failed: i16x8.replace_lane[1] expected type i32, found local.get of type s128 @+981) at Error
at jsStackTrace (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1740:19)
at stackTrace (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1757:16)
at abort (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1449:44)
at /import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1641:7
/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:117
throw ex;
^
RuntimeError: abort(RuntimeError: abort(CompileError: WebAssembly.instantiate(): Compiling function #4 failed: i16x8.replace_lane[1] expected type i32, found local.get of type s128 @+981) at Error
at jsStackTrace (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1740:19)
at stackTrace (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1757:16)
at abort (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1449:44)
at /import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1641:7) at Error
at jsStackTrace (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1740:19)
at stackTrace (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1757:16)
at process.abort (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1449:44)
at process.emit (events.js:315:20)
at processPromiseRejections (internal/process/promises.js:209:33)
at processTicksAndRejections (internal/process/task_queues.js:98:32)
at process.abort (/import/hydrogen.naist.jp/home/n-sibata/private/work/wasm/tmp/a.out.js:1455:11)
at process.emit (events.js:315:20)
at processPromiseRejections (internal/process/promises.js:209:33)
at processTicksAndRejections (internal/process/task_queues.js:98:32)
[oxygen]~/work/wasm/tmp$
It works with the latest node.js.
[oxygen]~/work/wasm/tmp$ emcc -O3 -msimd128 -msse2 hellowasm.c
[oxygen]~/work/wasm/tmp$ ../node-v15.7.0-linux-x64/bin/node --experimental-wasm-simd a.out.js
pow(2, 3) = 8
pow(10, 20) = 1e+20
[oxygen]~/work/wasm/tmp$