Et forslag om at gøre parallelle instruktioner tilgængelige i Webassembly vil nu bliver implementeret i Googles V8-Javascriptmotor.
Det skriver udviklerbloggen Infoq.
Webassembly er en ny standard for bytekode og en tilhørende virtuel maskine, som kan afvikles lige godt i alle de fire store browsere. Udviklingsarbejdet blev igangsat i 2015 og byggede videre på ideerne i Asm.js.
I det nye forslag skal parallelisme udnyttes via SIMD-instruktioner i chips som CPU og GPU'er. SIMD står for 'single instruction, multiple data' og udfører samme operationer på flere data, altså vektor-beregninger, på godt dansk.
SIMD-operationer understøttes af de fleste moderne CPU-arkitekturer, skiver Infoq, men er implementeret på forskellige måder.
Derfor sigter det nuværende Webassembly-SIMD-forslag at definere et reduceret sæt af operationer, der kan understøttes bredt på nuværende hardware.
Teknikken kan give ydelsesforbedringer i forbindelse med lyd- og video-behandling, machinelearning og andre omårder.
Således ganges elementerne i to arrays, i C, der kan transpiles til Webassembly-bytecode:
#include <wasm_simd128.h> void multiply_arrays(int* out, int* in_a, int* in_b, int size) { for (int i = 0; i < size; i += 4) { v128_t a = wasm_v128_load(&in_a[i]); v128_t b = wasm_v128_load(&in_b[i]); v128_t prod = wasm_i32x4_mul(a, b); wasm_v128_store(&out[i], prod); } }
Men optimeringer via LLVM-compileren gør, at almindelige løkke-udtryk automatisk kan oversættes til SIMD-instruktioner, som herunder:
void multiply_arrays(int* out, int* in_a, int* in_b, int size) { for (int i = 0; i < size; i++) { out[i] = in_a[i] * in_b[i]; } }
Faciliteten er tilgængelig i Chromes beta-kanal Canary og kan aktiveres med flaget
--enable-features = WebAssembleSimd
. SIMD-instruktionerne findes også i sproget Dart.