Open Maratyszcza opened 3 years ago
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
:
double
to int
are used when storing data in quantized representation and in table-based algorithms (need to real indices to int
index for table lookup).int
to double
are used when loading data in quantized representation and in random number generation (the raw output of RNGs is typically int
, but numerically algorithms need real values).double
and float
are 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.
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: