コンピューティングにおいて、Brookプログラミング言語とその実装であるBrookGPUは、グラフィックス処理ユニット(GPGPU)上で汎用コンピューティングを可能にするための初期の影響力のある試みでした。 [ 1 ] [ 2 ]スタンフォード大学のグラフィックスグループで開発されたBrookは、 ATIやNvidiaなどのGPUの並列性を活用するように設計されたストリームプログラミング言語のコンパイラおよびランタイムシステムでした。
BrookGPUは、 ANSI Cの派生言語であるBrookストリームプログラミング言語で記述されたプログラムをコンパイルします。計算バックエンドとしてOpenGL v1.3以降、DirectX v9以降、またはAMDのClose to Metalをターゲットにすることができ、 Microsoft WindowsとLinuxの両方で動作しました。デバッグ時には、 CPU上で仮想グラフィックカードをシミュレートすることもできました。
最後の主要なベータ版リリース(v0.4)は2004年10月でしたが、その後開発が再開され、2007年11月にv0.5ベータ1がリリースされた時点で再び開発は停止しました。
v0.5の新機能には、大幅にアップグレードされ高速化されたOpenGLバックエンドが含まれています。これは、PBuffersの代わりにframebufferオブジェクトを使用し、独自のベンダー拡張機能を使用する代わりに、標準のOpenGLインターフェースに合わせてコードを統一しています。GLSLのサポートが追加され、これまでDirectX 9でのみサポートされていたすべての機能(複雑な分岐やループなど)がOpenGLで利用できるようになりました。特に、これによりBrookはLinuxでもWindowsと同等の機能を発揮できるようになりました。
v0.5シリーズのその他の改善点としては、マルチバックエンドの使用が挙げられます。これにより、異なるスレッドが異なるBrookプログラムを同時に実行できるようになり(マルチGPU構成の利用を最大限に活用できます)、 CPUバックエンドではSSEとOpenMPがサポートされます(これにより、最新のCPUをほぼ最大限に活用できます)。
デスクトップCPUとGPGPUを同等に比較することは、アルゴリズムと構造の違いにより問題がある。[ 3 ]
例えば、2.66 GHz Intel Core 2 Duo は、 SSE とストリーミング メモリ アクセスを最適に使用してプリフェッチャが完全に機能する場合、最大 25 GFLOPs (1 秒あたり 250 億回の単精度浮動小数点演算) を実行できます。しかし、従来 (シェーダー プログラムの長さ制限のため)、ほとんどの GPGPU カーネルは、大量のデータに対して比較的少量の作業を並列に実行する傾向があるため、デスクトップ CPU で GPGPU アルゴリズムを直接実行する際の大きな問題は、一般的に CPU がほとんどの時間をRAM の待機に費やすため、メモリ帯域幅が大幅に低下することです。例として、デュアル チャネル PC2-6400 DDR2 RAM は、約 11 Gbit/s のスループットを実現できます。これは、合計帯域幅が 3 GFLOPs であり、読み書き両方が必要であることを考慮すると、最大で約 1.5 GFLOPs です。結果として、メモリ帯域幅が制限されている場合、Brook の CPU バックエンドは 2 GFLOPs を超えることはありません。実際には、特にSSEアクセラレーションが可能な唯一のデータ型であるfloat4以外の場合は、それよりもさらに低くなります。
ATI HD 2900 XT (740 MHz コア、1000 MHz メモリ)では 、Brook は DirectX 9 バックエンドを介して最大 410 GFLOPs を実行できます。[ 4 ] OpenGL は現在 (ドライバとCgコンパイラの制限により) その GPU の GPGPU バックエンドとして効率がかなり低いため、Brook はその GPU で OpenGL を使用した場合、210 GFLOPs しか実行できません。理論上は、これは CPU の約 20 倍の速さに見えますが、先ほど説明したように、それほど簡単ではありません。GPU は現在、大きな分岐と読み書きアクセスのペナルティがあるため、実際のコードではピーク最大値の 3 分の 1 程度が妥当な最大値と予想されます。それでも、この ATI カードは Intel Core 2 Duo の約 5 倍の 125 GFLOPs になります。
しかし、これは処理対象データをGPUとの間で転送するという重要な部分を考慮に入れていません。PCI Express 1.0 x8インターフェースの場合、ATI HD 2900 XTのメモリへの書き込み速度は約730 Mbit/s、読み出し速度は約311 Mbit/sとなり、通常のPCメモリよりもかなり遅くなります。大規模なデータセットの場合、これは適切に調整されたCPU実装と比較してGPUを使用することによる速度向上を大幅に低下させる可能性があります。もちろん、GPUはCPUよりもはるかに速いペースで高速化し、PCI Expressインターフェースも改善されるにつれて、大規模な処理をGPUにオフロードする方が理にかなうようになるでしょう。
{{citation}}: CS1メンテナンス: 日付と年 (リンク)