l'essentiel est invisible pour les yeux

Thursday, November 30, 2006

Cellプログラミングチュートリアル

オリジナルの文章に加えていくつか書いていきます。
Cell Broadband Engine Programming Tutorial Version 1.1

順次更新予定。

2.1 PPE レジスタ

GPRs(General-Purpose Registers)
32個の64ビット幅のGPR(汎用レジスタ)を持つ。

FPR(Floating-Point Registers)
32個の64ビット幅の浮動小数点レジスタを持つ。浮動小数点の形式はIEEE754の倍精度フォーマットに従う。単精度の結果も内部的には倍精度として扱われる。

LR(Link Register)
64bitのLRは分岐先の実行アドレスを扱う。分岐命令は、LK(link bit)に1が設定されている場合次の命令をLRにコピーする。Move To Special-Purpose Register命令は、GPRの内容をLRにコピーする。

CTR(Counter Register)
64bitのCTRは分岐先の実行アドレスかループカウンタのどちらかを保持することが出来る。いくつかの条件分岐命令フォームはCTRの値を減少させ0かどうか判定する。Move To Special-Purpose Register命令はGPRの値をCTRにコピーする。

XER(Fixed-Point Exception Register)
64bit XERレジスタは、整数オペレーションでのキャリーやオーバフローなどの条件、及びインデクス付きロードストア命令で転送されるバイト数を扱う。

CR(Condition Register)
32bitのコンディション・レジスタはテストと分岐のためのメカニズムを提供する。
比較命令か命令を読みこむ事により32ビットCR中の条件コードが初めに設定されて比較命令によって使われる。

FPSCR(Floating-Point Status and Control Register)
プロセッサは、結果と関連した例外に関する全ての浮動小数点演算の後で、32bitのFPSCRを更新する。IEEE 754によって必要とされているステータス情報が含まれる。加えて例外を扱うためのいくつかの情報がある。

VMRs(Vectoor Multimedia Registers)
全てのベクタ演算のためのソースとあて先を処理するための128bit幅のVMRが32個存在する。

VSCR(Vector Status and Control Register)
32bit VSCRはFPSCRと似た方法で読み書きが行われる。2つの定義されたビットを持ち、non-Javvaモードビットとsaturationビットであり、残りのビットは予約済みである。VSCRからVMRレジスタに移動させるための命令が提供されている。

VRSAVE(Vector Save Register)
32bit VRSAVEレジスタはコンテクストスイッチを横切った状態中のユーザ情報や特権のあるソフトウェアをサポートする。



2.2.1.3 Compatibility with Existing PowerPC Code
PowerPCアーキテクチャのPPE version2.0.2は以下のユーザモード命令が実装されている。

fsqrt(.) - 倍精度浮動小数の平方根
fsqrts(.) - 単精度浮動小数の平方根
fres(.) - 単精度浮動小数の逆数
frsqrte(.) - 倍精度浮動少数の逆数
fsel(.) - 浮動少数
mtofrf - CRのフィールドの一つをXFX-formに移動する
bccbr - CBRへの分岐条件

3.5.1 DMA変換

3.5.2 DMAリスト変換

3.5.3 ダブルバッファ

3.5.4 スカラー演算のベクタ演算化



3.5.5.3 分岐ヒントを用いて分岐予測ミスを減少させる
SPUは26段という深いパイプラインを動作周波数を向上させている。SPUのパイプライン処理は深いため、分岐予測が外れた場合には15サイクルのペナルティが発生する。この分岐ペナルティへの対抗策として、プログラマがソフトウェアレベルで分岐予測アドレスを設定する分岐ヒント命令を用意している。ハードウェアレベルレベルでの分岐予測回路はない。

一般的なプロセッサは通常BHT(分岐ヒストリテーブル), BTAC(分岐先アドレスキャッシュ), BTIC(分岐先命令キャッシュ)を用いたハードウェアレベルの分岐予測を持っている。

ブランチヒント命令は3種類提供される。
・ブランチ先のアドレス
・実際のブランチ命令のアドレス
・プリフェッチスケジュール


3.5.5 分岐処理のコストを減少させる。


3.5.6 関数のインライン化とループアンローリング


4. プログラミングモデル
Cellプログラミングでは7つのプログラミングモデルが提唱されている。

0. Function-Offloadモデル
パフォーマンスを要求するような計算処理をRPCを利用してPPE上からPPE上で定義された関数呼ぶようにして、SPE上で実行する事を可能にする。PPEとSPEの通信処理は、IDLコンパイラが生成するスタブクラスが隠蔽してくれる。DMA転送のコストが気になる。

Tutorials:
  1. [Cell] Function-OffloadモデルでHello, World
  2. [Cell] Function-Offloadプログラミングモデル 2

1. デバイス拡張モデル
デバイス拡張モデルは、SPEがI/Oデバイスのように動作するFunction-Offloadモデルの特別なケース。
全てのI/Oデバイスはメモリマップされているため、SPEはI/Oデバイスと対話することができ、SPEのDMA変換は単一のバイトサイズへの変換をサポートする。I/Oデバイスは、SPEのシグナル通知機構を利用しコマンドの完了をSPEに通知することが出来る。

SPEがデバイス拡張モデルを使用しているとき、それらはOSの一部として特権を持ったプログラムとして実行される。このコードは信頼されて、物理的なデバイスのレジスタへのアクセス権限を与えられるかもしれない。例えば、セキュアなファイルシステムはデバイスとして扱われる。OSのデバイスドライバは、ディスクコントローラが仮想デバイス上の全てのファイルの読み込みと書き込みに応じるためや暗号化と複合化のためにSPEを使用して書き込むことが出来る。

2. 演算加速モデル(Computation-Acceleration Model)
演算加速モデルは、小さい粒度でSPEを統合するSPE中心のプログラミングモデル。
このモデルは、アプリケーションの大きな書き換え無しにアプリケーションをスピードアップさせることが出来る。このモデルはSPEと通信するために共有メモリかメッセージ・パッシングモデルを使用する。

3. ストリーミングモデル
ストリーミングモデルでは、データストリームを介して連続または並列にパイプラインで演算がおこなわれる。PPEはストリーム制御として動作し、SPEはストリームデータの処理をする。SPEでは、チップへの読み込みと書き込みの帯域は、チップ外のDMA転送のバンド幅を一桁上回る。もしそれぞれのSPEは大量の仕事を持っているならば、Cell上ではこのモデルは効果的に動作する。なぜなら、データ長い間Cell Broadband Engine上にとどまらせることができるからである。PPEとSPEは、PPEと処理中のSPE間、その他のSPE間のメッセージパッシングをサポートしている。

だけれども、SDKでは一般的なストリーミング言語はサポートしていない。大抵のCellプログラマは、ストリーミングモデルを拡張して使うことを好む。例えば、P104のSection 3.6.3中のオイラー粒子シミュレーションはストリーミングモデルを実装している。粒子シミュレーションはデータパケットを同時にそれぞれのステップを同時にストリームするカーネルからなる。

参考
http://ja.wikipedia.org/wiki/Stream_processing

4. 共有メモリマルチプロセッサモデル

5. 非対称スレッド実行モデル(Asymmetric-Thread Runtime Model)


6. ユーザモードスレッドモデル
ユーザモデルスレッドは、一つのSPEスレッドが並列に動作するユーザレベル関数の集合を管理する。ユーザレベル関数は、マイクロスレッド(ユーザスレッドとユーザレベルのタスクも)と呼ばれる。SPEスレッドはOSによってサポートされる。マイクロスレッドはユーザソフトウェアによって作成されサポートされる。OSは含まれない。しかしながらマイクロスレッドの集合は複数のSPUをまたがって実行することが出来る。

SPUアプリケーションは共有メモリ中のタスクをスケジューリングし、タスクは利用可能なCPUで処理される。例えばゲームプログラミングでは、タスクは更新する必要があるシーンオブジェクトを参照することが出来る。マイクロスレッドはいつでも完了することが出来、新しいマイクロスレッドはいつでも生成される。

このプログラミングモデルの利点は、SPUの集合をSPEスレッド下で実行することで予測可能なオーバヘッドを持つことである。一SPEは、PPEの補助無しにMFCコマンドキューを削除したり格納したりすることは出来ない。


7. SPE プラグイン
SPEプラグインでは、SPEのLS(256KB)にプログラムが収まらないとき、オーバーレイを使用することで大きなプログラムを実行できる。オーバーレイは、SPUコードを動的にロードしSPUプログラムとして動作させる。

SPE Pluginsでは、モジュラ型内のSPUコードをプログラマが管理することができる。実行時に必要とされる特定のSPUコードは動的にロードされる。このモデルはコードをrequireする他のSPEプログラミングモデルとは異なり、読み込まれるコードはあらかじめ知ることはできない。
SPE PluginはSPUプログラムの実行スタックを使用し、グローバルから参照することは出来ない。SPE Pluginは、入力/出力用のパラメータではなく、実行中のSPUプログラムを用いて通信をする。


参考
次世代プロセッサ Cell Broadband Engine