simd
simd copied to clipboard
Double-precision SIMD conversions
Currently WebAssembly SIMD specification is missing all kinds of double-precision f64x2 conversions. The instruction set needs at least the following conversions to be usable:
- SIMD double-precision to single-precision floating-point
- SIMD single-precision to double-precision floating-point
- SIMD double-precision to 32-bit integer
- SIMD 32-bit integer to double-precision
Can you clarify what you mean by "to be usable?" Are there real-world applications that would require these conversions for which scalarizing them would be insufficient?
Without these instructions SIMD specification is functionally incomplete: it doesn't cover many basic C/C++ operations (conversions between double type and other types). Double-precision computations are mostly used in scientific computing, and so are conversions between double and int/float:
- Conversions from
doubletointare used when storing data in quantized representation and in table-based algorithms (need to real indices tointindex for table lookup). - Conversions from
inttodoubleare used when loading data in quantized representation and in random number generation (the raw output of RNGs is typicallyint, but numerically algorithms need real values). - Conversions between
doubleandfloatare used in mixed-precision algorithms, where less sensitive parts of the application are computed in single precision and the more sensitive parts - in double precision. E.g. iterative algorithms may first run in single precision to convergence, and then starting with the single-precision solution run double precision iterations.
What have you been doing intrinsics wise in the absence of these instructions? Are you scalarizing them?
I took a quick peek at the suggested conversions, it looks like on x86 they map to pretty straightforward instructions (cvt* family), and also we have the scalar instructions in Wasm already. So symmetry wise and codegen wise they seem pretty okay.
XNNPACK doesn't use double-precision, so I didn't need to find a work-around. The emmintrin.h header in Emscripten implements these functions through scalarization.
+1 for these being useful, the math library being built for Highway requires these.