not good but great

プログラミング、アート、映画・本の感想について書きます。

Firefox NightlyでSIMD.JSを実行する

SIMD.JSで高速化


SIMD.JSというものを使えば、JSのパフォーマンスが上がるというツイートを発見しました。MozillaGoogle、そしてIntelが共同で開発したみたいです。

SIMDとは?

そもそも「SIMD」って何だよと思い、調べることにしました。

SIMD is the ability of a CPU to apply an operand to vectors of values, instead of single values. For example, a CPU may be able to add two vectors v and w by adding their components, hence applying the single instruction addition to multiple data:
v + w = 〈v1, …, vn〉+ 〈w1, …, wn〉
= 〈v1+w1, …, vn+wn〉

僕の浅い理解ですが、SIMDではスカラーではなくベクトル演算することによって、演算を並列で行うことができます。並列化によって、速度があがるのだと思います。CPUの詳しい仕組みに沿った説明はよくわからないので、下のリンクを参考にしてみてください。
・参考
JavaScript gains support for SIMD
Bringing SIMD to JavaScript | 01.org
SIMD - Wikipedia

SIMDを試す

Firefox Nightly Buildsをダウンロードしました。
Mozilla Firefox 91.0a1 (Nightly) / 90.0beta (Beta) / 89.0.1 (Release) / 78.11.0 ESR for Windows, Mac and Linux :: ソフトウェア更新情報 - 出張所 (softinfo)

var a = SIMD.float32x4(1.0,2.0,3.0,4.0);
var b = SIMD.float32x4(5.0,6.0,7.0,8.0);
var c = SIMD.float32x4.add(a,b);
console.log(c);
//TypedObject { x: 6, y: 8, z: 10, w: 12, signMask: 0 } _display:24

c = SIMD.float32x4.mul(a,b);
console.log(c);
//TypedObject { x: 5, y: 12, z: 21, w: 32, signMask: 0 } _display:27

ベクトル演算の要領で、aとbを足す、掛けるを行っています。

var a = SIMD.float32x4(1.0,2.2,3.0,4.0);
var b = SIMD.float32x4(1.0,6.0,7.0,4.0);
c = SIMD.float32x4.equal(a,b);
console.log(c);
//TypedObject { x: -1, y: 0, z: 0, w: -1, signMask: 9 }

c = SIMD.float32x4.abs(a);
console.log(c);
//TypedObject { x: 1, y: 2.200000047683716, z: 3, w: 4, signMask: 0 }

c = SIMD.float32x4.neg(a);
console.log(c);
//TypedObject { x: -1, y: -2.200000047683716, z: -3, w: -4, signMask: 15 }

c = SIMD.float32x4.sqrt(a);
console.log(c);
//TypedObject { x: 1, y: 1.483239769935608, z: 1.7320507764816284, w: 2, signMask: 0 }

両者を比較してbooleanを返す、絶対値を返すなどをやっています。

「2.2」の絶対値が「2.200000047683716」になってる理由はわかりません・・・・調べる気力が出ませんでした