NB :この記事は簡単な紹介です。Brook+でのプログラミングのすべての側面がここで取り上げられることを期待しないでください:-)
鉄について
Brook +はHD2xxxカード(制限付き)で動作しますが、通常は3xxxシリーズで動作します。 アドバタイズで4870 800個のプロセッサがあることがわかった場合、実際には160個あり、それぞれがサイクルごとに5つの命令を実行します(3番目のシリーズは、同時に実行される命令に重大な制限があり、4番目のプロセッサはほとんどすべてを持つことができます)。 すべてがかなり「低レベル」であるCUDAとは異なり、Brook +ではコンパイラーがすべてを行い、すべてがキャッシュされ、最も不適切な瞬間にすぐに動作を停止します。 プラス-AMDのメモリキャッシュはキャッシュされますが、nVidiaはキャッシュされません。
どこから始めますか?
いつものように、動作するSDKの例から始めた方が良いです(Visual Studio 2005の例についてお話します。Linuxもサポートされています)。 SDKは、 http : //ati.amd.com/technology/streamcomputing/sdkdwnld.htmlからダウンロードできます。 samples.slnを開き、hello_brookプロジェクトから開始できます。
hello_brook.brファイルのカスタムビルドルールに注意してください。プロジェクトで使用する必要がある.hおよび.cppファイルを生成します。
mkdir brookgenfiles | "$(BROOKROOT)\sdk\bin\brcc_d.exe" -o "$(ProjectDir)\brookgenfiles\$(InputName)" "$(InputPath)"
なぜなら プリプロセッサはサポートされていません。自分で個別に呼び出すことができます。次のようになります。
cl /P /C file.br
copy file.i file_pp.br
"$(BROOKROOT)\sdk\bin\brcc_d.exe" -k -p cal file_pp.br
最後の行の-p calは、GPUコアのみが生成され、CPU部分が省略されることを意味します(長時間コンパイルできるため、必ずしも必要ではありません)。
プログラム構成
kernel void your_kernel(float input<>, out float output<>, float val)
{
if (input > val)
{
output = 1.0f;
}
else
{
output = 0.0f;
}
}
このようなものと呼ばれる:
unsigned int dim [] = {800 * 100};
:: brook :: Stream inputStream(1、dim);
::小川::ストリームoutputStream(1、dim);
inputStream.read(_input);
your_kernel(inputStream、outputStream、123.35);
outputStream.write(_output);
CUDAとは異なり、各ストリームのデータをすぐに設定することに注意してください。 それだけです:-)作業するとき、.brファイルの配列と構造は適切にサポートされていないことに注意してください:-)また、関数本体の先頭でのみ変数を定義する必要があることを忘れないでください、これはC ++では使用できません:-)
Brook +は他の起動オプションもサポートします:ソースデータが一般的な配列から取得されるとき、ストリームの「座標」が決定されるとき(CUDAのように)、累積カーネル(つまり、配列のすべての数の合計を考慮することができます)。 これについては、ドキュメントまたはSDKの例で読むことができます。
最適化
通常、最適化方法はCUDAと一致します。
- 異なるスレッドが異なるパスを通るコード内の可能な限り少ないブランチ。 このようなコードは並行して実行されません。
- なぜなら 各プロセッサーはスーパースカラーであるため、コードには常に少なくとも5つの独立した命令があることを確認する必要があります。 これを実現する最も簡単な方法は、サイクルを手動で5倍に拡大することです(将来、#pragma unroll(5)でこれを行えることを願っています)
- できるだけ少ないメモリを使用してください。 使用するメモリが少ないほど、キャッシュは落ち着きます:-)
動かない?
まず、SDKとともにBrook + _Documentationフォルダーのドキュメントを読む必要があります。 その後、 公式フォーラムで質問することができます-残念ながら、そこにいる開発者はあまり購読されていません。 ロシア語では、例えばフォーラムで私に尋ねることができます。そこで私は答えます:-)また、多くの人々がgpgpu.ruに住んでいます 。
おわりに
要約すると、Brook +を使用すると、それほど便利ではない環境で追加のプログラミング作業を行うことで、大量のメモリを必要としない並列化されたタスクで驚異的なパフォーマンスを実現できます。
この紹介が、Brook +プログラミングの理解に役立つことを願っています。 問題/質問がある場合-私はお手伝いさせていただきます。 さて、私たちの前にOpenCLとSIMD x86の紹介があります