Firefox web browser - Faster, more secure & customizable

Mozilla Labs » jetpack » Blog Archive » Elevating JavaScript Performance Through GPU Powerにおいて、FirefoxのJavaScript処理にGPUを活用することでパフォーマンスを向上させるためのアイディアが紹介されている。具体的にはCUDAをJavaScriptから利用できるようにするというもの。APIを拡張する方法とJavaScriptのシンタックスそのものを拡張するという2つのアプローチがあるとし、紹介されているのはAPIを拡張するアプローチ。同アイディアはJetpack 0.5 Contestで優勝したAlexander Miltsev氏の取り組みがベースになっている。

CUDA (Compute Unified Device Architecture)はNVIDIAが提供している同社のグラフィックボードを汎用計算に利用するための環境。

JavaScriptで開発されたWebアプリケーションはより複雑な処理をするものになりつつある。しかしJavaScriptはインタプリタ言語であり、C言語やC++のようなコンパイル言語と比べて高速には動作しない。そのためより多くの計算リソースとパワーが必要という状況にある。

CPUのコア自身は対象とするWebアプリケーションのJavaScript以外にもページレンダリング処理やほかのアプリケーションの実行、OSそのものの処理など多種多様な処理を実施している。この間GPUはレンダリングに関する処理を実施しているのみであり、ここの余剰リソースをJavaScriptの処理にあてることで、システム全体でみた場合のJavaScriptのパフォーマンスを引き上げようというもの。

関数をCUDAカーネルへトランスレートしてGPUで処理

Elevating JavaScript Performance Through GPU Powerでは上記サンプルコードで具体的な実装アイディアを示している。Jetpack.toGPU()に関数を渡すと、それがCUDAカーネル向けにトランスレートされ、GPUで処理が実施されるというアイディアになっている。このアイディアはPython向けのPyCUDAに近いものだと説明がある。

より自動的にCUDAへ処理を割り振るには関数型プログラミングのパラダイムが利用できるという説明もあり、次のように処理を記述した場合にどうやってJetpack.toGPU()が利用できるかというサンプルも紹介されている。

関数型プログラミングの考え方を使った場合の例

先ほどのコードをGPUを使った並列処理へ適用する場合の例

先ほどの記述に複雑さを感じるのであればLINQの記述が簡潔でわかりやすいという説明もあり、LINQの記述方法を使った場合の例や、その記述方法をjQueryに適用した場合の記述例も紹介されている。JetpackやjQueryのみならず、ほかのJavaScriptライブラリも同様の方法でそれほど変更を加えなくともCUDA対応が可能だろうと説明がある。

LINQのアプローチでGPUを使った並列処理を記載する場合の例

先ほどのアプローチをjQueryに適用した場合の例

クライアントであるブラウザでの処理効率を引き上げる方法としてはこれまでActiveXやNetscapeプラグイン、Javaアプレットといったアプローチがあったが、どれもメインストリームにはなることができなかったとも説明されている。Native Clientの取り組みがこうした問題を解決する可能性はあるとしながらも、そうした取り組みがブラウザ間のコンセンサスを得て標準化するまでには長い時間と労力がかかるとしている。