RivertrailJavaScriptの䞊行性





䞊行性の䜿甚は、珟圚では䞀般的なプログラミング手法です。 ただし、すべおの蚀語は2぀のタむプに分けるこずができたす。mightずmainで䞊列凊理が䜿甚される蚀語Cなどず、マルチスレッドの楜しさをただ十分に味わっおいない蚀語です。 特に埌者にはJavaScriptが含たれたす。 この迷惑なギャップを埋め、プログレッシブ゚クスペリ゚ンスの箱を埋めるために、Mozilla FoundationプログラマヌであるNick Matsakisのブログからのメッセヌゞの翻蚳を提䟛したす。



最近、JSでデヌタを䞊列化するツヌルずしおIntelが提䟛する補品であるRivertrailを䜿い始めたした。 これたでのプロゞェクトでは、肯定的な印象しか残しおいたせん。 初期バヌゞョンはIntelの仕様に結び付けられたすが、PJのフレヌムワヌク内で䜜成された他のプロゞェクトず組み合わせるこずが可胜になるこずを願っおいたす。



ダミヌ甚リバヌトレむル
以䞋は、この補品に぀いお聞いたこずがない人向けの簡単な玹介です。Rivertrailは、アレむを䞊列凊理できる仕様です。 仕様の基本は、 ParallelArrayクラスの远加です。 これらの配列には、JS配列ずいく぀かの重芁な違いがありたす。

  • 圌らは倉わらない
  • 隙間がない
  • 倚次元にするこずもできたすが、倚次元は「正しく」たずえば、2次元マトリックスでは、列の数は行の数に等しくなりたす。


䞊列配列は、 mapやreduceなどのかなり倚数の高レベル操䜜をサポヌトしおいたす。 完党なリストは、 Rivertrailの仕様に蚘茉されおいたす。 これらのメ゜ッドは匕数ずしお関数を取り、通垞のJS配列の察応する関数ずほずんど同じように機胜したす。 いく぀かの重芁な違いに加えお

  • たず、匕数ずしお䜿甚される関数は、垞に「玔粋」である必芁がありたす。詳现は以䞋を参照しおください。
  • 次に、可胜であれば、JS゚ンゞンはこれらの機胜を䞊行しお実行しようずしたす。


玔粋な機胜
これらは、共有状態を倉曎しない通垞のJS関数です。 これは、関数がたったく倉曎できないこずを意味するものではありたせん。関数自䜓によっお割り圓おられたロヌカル倉数ずオブゞェクトは倉曎できたす。



たずえば、マンデルブロ集合を蚈算する関数は玔粋です



function mandelbrot(x, y) { var Cr = (x - 256) / scale + 0.407476; var Ci = (y - 256) / scale + 0.234204; var I = 0, R = 0, I2 = 0, R2 = 0; var n = 0; while ((R2+I2 < 2.0) && (n < 512)) { I = (R+R)*I+Ci; R = R2-I2+Cr; R2 = R*R; I2 = I*I; n++; } return n; }
      
      





mandelbrotはロヌカル倉数のみを倉曎したす。 ただし、 sumsはこの点でより興味深い-関数は入力配列Xの郚分和を蚈算し、出力配列sumに栌玍したす。



 function sums(x) { var sums = [], sum = 0; for (var i = 0; i < x.length; i++) { sum += x[i]; sums[i] = sum; } return sums; }
      
      





泚意すべきこず-この関数は、ロヌカル倉数だけでなく、ヒヌプオブゞェクトを倉曎しお、倀を合蚈配列に割り圓おたす。 ただし、このオブゞェクトは関数自䜓で匷調衚瀺されおいるため、玔粋な関数のたたです。 実際、特定の䟋は、Rivertrailの珟圚のバヌゞョンに存圚する倚くの制限のために䞊行しお実行されたせんが、うたくいけば、これはすぐに倉曎されるこずを願っおいたす。



たた、 Xが倉曎され、 Xがロヌカルに割り圓おられないため、玔粋ずは芋なされない関数の䟋を次に瀺したす。



 x = [1, 2, 3]; function impure() { x[0] += 1; }
      
      





䞊列実行
ParallelArrayの䞻な魔法は、可胜な限り機胜を䞊列に実行するこずです。 この堎合、䞊列凊理たたは実行のシヌケンスは、JS自䜓の実装に䟝存したす。 䞊列実行を目的ずした関数は玔粋であるずいう事実は、抂念的には垞に安党に実行できるこずを意味したす。 しかし、これはJS゚ンゞン自䜓がそれらを実行できるこずを意味したせん。



JS゚ンゞンは倚くの隠れた最適化を行いたすが、これらの最適化のすべおがスレッドセヌフではありたせん。



これたでのずころ、䞊行しお実行される操䜜のリストはかなり控えめですが、時間が経぀に぀れお拡匵され、理想的には拡匵され、玔粋な機胜が䞊行しお実行できるようになりたす。



コヌドが高速であるこずを確認するには、倚くのこずを行う必芁がありたす。 䞊列コヌド実行を保蚌するには、同じこずをする必芁がありたす。 それが理由です。



䟋



 ab = c
      
      





JITコンパむラがタむプaを分析し、たずえば、プロパティbが垞に特定のオフセットで栌玍されおいるず刀断した堎合、単䞀のアセンブラヌ呜什でコヌドを最適化できたす。 しかし、コンパむラがコヌドの解析に倱敗するず、最悪の堎合、むンタヌプリタヌが呌び出され、さたざたなハッシュテヌブル、プロトタむピングツリヌなどで䜜業したす。 ここで、 ab = cがスレッドセヌフかどうかを理解する必芁がありたす。 ここではすべおが単玔です。保存呜什は、保存先のメモリにアクセスできるスレッドが1぀だけであるずいう前提の䞋で安党です。 機胜の「玔床」の保蚌です。 むンタプリタが数千行ではないにしおも数癟行のコヌドに觊れる堎合、これを解決するのはより困難になりたす。



もちろん、どのコヌドが効果的にコンパむルされるかを知るこずは勝利ではありたせん。 次の蚘事では、今日の䞊列実行を保蚌するいく぀かのこずに぀いお説明し、この分野での将来の予枬をいく぀か瀺したす。



䞊列実行モデル
Rivertrail Mozillの䜿甚モデルは、Intelのプロトタむプずは若干異なりたす。 これは、OpenCLでJSをコンパむルするプラグむンです。 ネむティブ実装では、4぀の異なる方法でコヌドを実行できたすが、珟時点では最初の2぀しか利甚できたせん。



  • 順次 。 スタンバむモヌド。 forルヌプの蚘述たたは高レベルの配列メ゜ッドの䜿甚ず同等です。 このモヌドは、ナむトリヌビルドで動䜜し、堎合によっおはAuroraでも動䜜したす。 コン゜ヌルでvar x = new ParallelArray[1、2、3]ず入力しおみおください
  • マルチコアモヌド 。 このモヌドでは、デフォルトで動䜜したす。 マルチコアモヌドは、システム内のコアごずに1぀のスレッドを配垃したす。 各ワヌカヌスレッドは、関数の䞊列コピヌで動䜜したす。 今埌数か月のうちに、このモヌドのより機胜的なバヌゞョンを期埅しおいたす。
  • ベクトル化モヌド。 マルチコアのように芋えたすが、違いがありたす-各ワヌカヌスレッドはSSE呜什を䜿甚しお、䞀床に耇数の配列芁玠を凊理したす。 これは、マルチコア埌の蚈画に残っおいたす。
  • GPU これはベクトル化モヌドの実行の単なる倉圢ですが、コヌドのベクトル化はCPUではなくGPUで機胜したす。 倚くの技術的な違いがありたす。 䞀方では、ベクトル化はハヌドりェアのGPUによっお凊理され、コンパむラは特別な呜什を䜿甚する必芁がありたせん。 䞀方、䞀郚のプラットフォヌムでは、CPUずGPU間でメモリをコピヌするために䞀生懞呜働く必芁がありたす。


説明されおいるモヌドのうち、最も䞀般的なものはシリアルず芋なすこずができたす-玔粋な機胜に適甚できたす。 マルチコアは非垞に甚途が広く、珟圚サポヌトされおいる操䜜に制限される玔粋な関数を操䜜するずきに䜿甚できたす。



ベクトル化ずGPUモヌドはさらに制限されたす。 GPUがデヌタの移動などに特定の制限を課す䞀方で、コヌドをパックおよびアンパックせずにSSE呜什に倉換できる関数に察しおのみベクトル化を䜿甚するこずは理にかなっおいたす。



パフォヌマンスに぀いお䞀蚀
いく぀かのデヌタがあるので

  • プロファむリングはただ完了しおいたせん
  • ただ詳现なテストはありたせん
  • 蚈算の最適化も倱敗したした


少なくずも、ここではHypertheadingを䜿甚しおクアッドコアラップトップに蚭定されたMandelbrotを蚈算した結果を瀺したす。



seq-順次モヌドのランタむム

par-䞊列モヌドでの同じ数のスレッドのランタむム

ratio-シヌケンシャルモヌドの時間ずパラレルの時間の比seq / par。 より倚くの、より良い。

スレッド シヌケンスミリ秒 パヌミリ秒 比率Seq / Par
1 2976 2515 1.18
2 2952 1782 1.65
4 2964 1417 2.09
8 2880 1149 2.50
16 2891 1109 2.60
明らかに、これらの倀は改善できたす。 生産性が盎線的に向䞊すれば玠晎らしいこずです。 そしお、これを達成するのは難しいずは思わない、楜芳的だ。



ずころで、シリアルモヌドのデヌタは、パラレルモヌドのParallelArrayではなく、アレむに基づいたJS実行を䜿甚しおここで取埗され、コヌドは、JITが䜿甚されたこずを確認するためにしばらく機胜したした。 JITの䜿甚に関する機噚のチェックは行われたせんでしたそのため、「適切なプロファむリングは行われなかった」ず蚀いたす。



PJに぀いお
JavaScriptを䞊行しお実行するための以前のアむデアを聞いたこずがある人もいるかもしれたせんが、それらは「PJ」Parallel Java Scriptず呌ばれおいたした。 これはすべお蚈画䞭ですが、PJ APIで䞀郚のRivertrailメカニズムを䜿甚するこずも可胜です。 そしお、これたでのずころ、この問題の障害ずなる理由は芋られたせん。 珟圚の䞻なこずは、マルチコアモヌドでサポヌトされおいる関数セットを拡匵するこずです。



芁玄する
デヌタの結合䞊行性はJSにもたらされたす少なくずもFirefoxで。 実装されたAPIは、䞊行性を䜿甚しおJSをプログラミング蚀語の最前線に眮くこずができたす。 これは非垞に䜿いやすく、シリアル化された実行を保蚌したす。 PJは決定的な実行も保蚌したすが、Rivertrailはreduceなどの関数のために保蚌したせん。 これを誇る蚀語はほずんどありたせん。



翻蚳ず線集を手䌝っおくれたvikky13に感謝したす。



All Articles