メニーコア時代のプログラミングモデルを考える(その3)~ソフトウェア・トランザクショナル・メモリ

最近注目を集めているのが「ソフトウェア・トランザクショナル・メモリ」だ。

これも各スレッドのプログラムは、自身のタイミングでオブシェクトの更新が行えるが、オブジェクトの更新の調停をシステム側でまとめて処理するのが特徴となる。ここでいうシステムとは自前で実装してもよいが、ランタイムライブラリで処理される場合もある。調停システム側は、ある同一のオブジェクトの更新に関して衝突や競合があることを認めると、この更新を不可として再実行を要請する。

このアルゴリズム自体は20年前の大規模データベースにおける高高率なデータアクセス法として考案された「トランザクション」をマルチスレッド・プログラミングに応用したものになる。

弱点としては、このトランザクション処理に、プロセッサ性能の30%を消費してしまい、相対的に他方式と比べて最大パフォーマンスが低くなる可能性が挙げられる。

このソフトウェア・トランザクショナル・メモリを採用したプログラミング言語にHaskellなどがある

しかし、ソフトウェア・トランザクショナル・メモリ方式では、オブジェクトの更新に際して排他制御のためのロック、アンロックをする必要がないというところに美点があり、各スレッドのプログラムは、あまり他スレッドのオブジェクト更新状況を気にしない設計にできる。各プログラマはほとんどシングルスレッド・プログラミングをしている感覚で開発できるため、大規模なマルチスレッド・プログラミングに向いているとされる。

TIM SEENEY氏としても、このソフトウェア・トランザクショナル・メモリを本命視する発言をした

メニーコア時代のプログラミングモデルを考える(その4)~純関数型プログラミング

「純関数型プログラミングも、メニーコア時代のマルチスレッド・プログラミングには有効だ」(TIM SWEENEY氏)

これはプログラム側からはグローバルメモリ更新やI/O操作も行わないアルゴリズムに基づいてプログラミングをしていくもので、作用媒介となるのは関数からの戻り値だけとする。

「純関数型プログラミングも、メニーコア時代のマルチスレッド・プログラミングには有効だ」(TIM SWEENEY氏)

各関数中に含まれる計算は、他の関数に影響を及ぼさないので、状況が許す限り順不同に行ったり、あるいは同時並列に実行させることも可能となる。この部分にはオートメーション化が可能であり、例えばコンパイラに並列実行させるようなコードを吐かせることは可能だとしている。プログラマ側としてはシングルスレッドのプログラミングを書いているのと同じで、吐き出される実行コードは並列化に対応している……といったマジックが期待できるわけだ。

ただ、この純関数型プログラミングでは、グローバルメモリの更新が行えない点で、多様なデータマネージメントを行うような、いわゆるゲームロジックを司るプログラム開発には適用できない。しかし、個々の独立性の高いデータ処理を行うような、すなわちデータ並列コンピューティング的なテーマの「物理シミュレーション」、「衝突判定」、「ピクセル陰影処理」についてはこの手法は適合できるであろうとTIM SWEENEY氏はいう。

特定用途には純関数型プログラミングが有効か。並列化したコードを吐くコンパイラの実現も十分可能