sleef icon indicating copy to clipboard operation
sleef copied to clipboard

Anyone working on adding WebAssembly as a target?

Open warvstar opened this issue 3 years ago • 5 comments

If not, is there any advice for starting to implement a new SIMD target?

warvstar avatar Jan 29 '21 14:01 warvstar

It should be possible to implement it in a similar way to the CUDA target.

shibatch avatar Jan 30 '21 00:01 shibatch

But WebAssembly doesn't have FMA. SLEEF is not so fast if FMA is not available.

shibatch avatar Jan 30 '21 05:01 shibatch

I guess the inlinable header for SSE2 is already usable?

shibatch avatar Jan 30 '21 05:01 shibatch

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$

shibatch avatar Feb 02 '21 00:02 shibatch

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$

shibatch avatar Feb 02 '21 01:02 shibatch