在 javascript 用 SIMD 來計算,讓網頁的程式更快

大家覺得現在 JavaScript 的程式效率怎麼樣呢?如果對於計算速度不是很滿意的話,那這個消息對你可能就很重要了~

這邊主要是 Intel 和 Google 和 Mozilla 這兩家瀏覽器開發廠商合作、試著要讓瀏覽器上面執行 JavaScript 程式的時候,也可以透過 SIMD(Single Instruction, Multiple Data、單一指令流多資料流)的形式、來使用 CPU 上的指令集進行向量化的計算、藉此來加速。而在目前的測試結果裡面,效能是可以增加到本來的 2.7 – 11.8 倍的!

詳細的資料可以參考《SIMD in JavaScript》這邊。

基本上,SIMD(維基百科)的概念在目前的 CPU 上算是相當普片的,早期的 MMX、SSE,或是現在的 AVX,屬於這一類的指令集;而這類的指令集的特色,在於它可以一次用相同的命令來處理多組資料(一般應該是 4 的倍數)、藉此來加速計算。

而一般來說,這種計算方式,應該是被稱為「向量化」(vectorization、維基百科);下面的示意圖,就是 Intel 提供的「純量計算」(左圖)和 SIMD 的向量計算(右圖)的比較。在傳統的純量計算方法裡面,x/y/z/w 這四組值的計算是分別進行的,而在使用 SIMD 計算時,則可以一次把這四組值的加法一次計算完~所裡他是可以更有效能、也可以更快地完成計算的。

這類向量化的計算,由於必須要把資料一組一組來做相同的處理,所以不是在任何場合都適用;但是在矩陣的計算、3D 的投影計算、或是影像的處理方面,都是相當普遍的~像是本頁最上方的長條圖,就是一些這類計算的加速效能;可以看到,在計算 4 x 4 矩陣的 inverse 的時候,速度甚至可以到 10 倍左右呢~

所以如果是有用到這個領域的處理的話,這東西應該會是相當有幫助的!

而由於他的資料必須要是好幾個組在一起的,所以也必須要用特別的型別才行。在目前來說,主要應該就是 SIMD.float32x4SIMD.int32x4 這兩種,分別代表了四個 32bit float 數字的向量、以及四個 32bit int 數字的向量。

計算的部分呢,大致上會像下面這樣的形式(還有其他的功能):

  • float32x4.abs(v)
  • float32x4.neg(v)
  • float32x4.sqrt(v)
  • float32x4.add(v, w)
  • float32x4.mul(v, w)
  • float32x4.equal(v, w)

而最簡單的向量加法的寫法,基本上就是下面這樣的形式:

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);

不過,這東西現在還不算標準,目前主流瀏覽器的正式版應該都還不支援,所以 Heresy 不太確定現在到底要怎樣可以使用?而如果根據《提升 JavaScript 效率,Intel 、Google、Mozilla 將以 SIMD 對代碼加速》這篇的介紹,FireFox 的 Nightly 版本、以及 Google 的 Chromium,應該會是最快支援的。

目前在 GitHub 上有 ecmascript_simd 這個專案,有提供一個實作,不過在 Chrome 上雖然可以正常運作,但是基本上沒有加速效果。 ^^"
不過如果要參考 SIMD.js 的程式什麼寫的話,應該是可以看看。

其他參考:


說實話…Heresy 看到這個消息的第一個反應,是「JavaScript 你到底要走到哪裡去?」…

在以往,網頁的內容是非常單純的,絕大部份的電腦,就算是舊電腦,也大多可以用來瀏覽網頁;但是在 Flash 程式日漸肥大、現在又有 HTML5、WebGL、甚至 WebCL 這些標準…網頁其實已經不一定是輕鬆可以處理掉的事情了,在以後,更有可能會是一般電腦上、計算量最大的程式…

話說,會不會哪天可以在 JavaScript 裡面寫組合語言?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *