FrontPage  ページ一覧  検索  更新履歴  RSS  ログイン

並列演算一般論

 並列演算は、分割可能な計算にのみ適用できる。たとえば、 x+y, w+v x+y+z は両方とも足し算を2回行うが、前者は2回の計算が完全に独立しているのに対し、後者は1回目の足し算の結果を知らないと2回目の足し算ができない。そのため、前者は並列化可能*1なのに対し、後者は並列化できない。並列化が一般用高速化技法として普及してこなかった理由は、この問題分割の可能性判定が面倒で複雑だったからである。

 この技術ノートでは、さまざまな並列化技法の長所と短所を示し、心理物理学実験での適切な使い方を例示する。

ベクタ演算

 CPU/FPUにおけるベクタ演算機能とは、1サイクルで複数の加減乗除演算を並列に行うことである。この技術は、例えばベクトル和を取る際の演算、

v1 + v2; { x1 + x2 }, { y1 + y2 }, { z1 + z2 }

のようなものを並列化するために実装されてきた。この場合はx, y, zのそれぞれの加算が独立しているので並列化することができる。名前通り元々ベクトル計算のために作られたものであり、座標計算などはこれを使うことで最大3倍の高速化が可能である。R,G,Bが独立の場合の色の計算などに使うことができる。四則演算ではなく数学関数を多用する場合にはそこまでの効果は期待でない。

 Intel系ではPentiumIII以降に搭載されているSSE2、PowerPCならG4以降のAltivecがこれに当たる。この機能を利用するには、アセンブラや専用命令で直接描く方法のほか、コンパイラの自動最適化機能を使うこともできる。Windows版では念のためこの機能は使用していないが、独自にビルドして使うことも可能である。Mac OS X版では、G4世代以降全ての機種でベクタ演算機能付きCPUが使われているので、この機能を利用するスイッチを入れてコンパイルしている。

マルチスレッド

 スレッド化はもともと独立したプログラムを動かすための機能である。プログラムが独立しているため、近年高速化の技法として多用されているマルチコアと相性が良い。ただし、パイプライン段数の深い現代的なコア間で同期をとろうとすると、かなりのクロック数空回しする必要があり、非効率である。したがって、技術的には「関数化できる程度の大きさで」「しばらく時間がかかる」演算がよい。たとえば、全画面ムービーを描くような場合に、それぞれのコマが独立に計算できるのであれば、コマ計算を関数化してマルチスレッドで走らせることには意味がある。一方で、ビデオカードへの命令のように、一つのバスに順序よく書きこまなくてはならないものは、同期の手間が多くかかるため、マルチスレッド化するとむしろ非効率になる。

GPU

 GPUのピクセルバッファは通常8ビットしかないので、1回の演算まではある程度の精度で計算して切れるが、それを保存した時点で8ビットに落とされてしまうため、2回以上演算すると誤差が急激に拡大する。

アルファ演算、アキュムレータ

 いわゆる透明度指定機能で、ある程度Psychlopsは一部サポートしている。中身は「ピクセルごとにアルファ値を掛け算して書き込み先と足し算する」という機能で、コントラスト変調フィルタのような簡単な計算には使うことができる。ただし、バッファが8ビットしかなく、その際の精度落ち問題には気をつける必要がある。

画像演算(プログラマブルシェーダ

 アルファ演算やアキュムレータのような固定機能ではなく、GPUの演算器にプログラムを与えて自由に計算させる技術。OpenGL 2.0 / Direct X10.1 からの本格サポートとなっており、対応機器が出たのは2005年ころからである。現在Psychlopsは普及が進んでいる一部機能についてサポートしている(Figures::ShaderGabor等)

物理演算等(GPGPU)

 GPUを画像に限らず多目的な並列演算計算機とする規格。論理的可能性はすでに示されており実装例もあるが、規格化が進んでいないため、現在Psychlopsで採用する予定はない。

更新日時:2010/04/12 22:25:15
キーワード:
参照:

*1 この程度の単純さであればスーパースカラによって実現される