組み込みコンピューティングに向けた、ハードウェアアクセラレーションの選択肢SYSTEM DESIGN JOURNAL(5/6 ページ)

» 2016年01月22日 07時00分 公開
[Ron Wilson(Editor-in-Chief, Altera),MONOist]

 当然ながら、CUはCPUよりも多くのALUを搭載しており、しかもベクトル処理ユニットにも1つ搭載しています。また、制御ロジックが少なく、分岐ユニットや分岐予測、投機実行、レジスタの色分けや名前変更のための制御ロジックを全く備えていないことに加え、リオーダリングやアウト・オブ・オーダー実行制御のための制御ロジックもほとんど備えていません。しかし、最も大きな違いはメモリが極少であるということです。L1キャッシュはなく、全てのCUによって共有される L2 が離れた場所に配置されている他、ソフトウェアによって管理される小型スクラッチパッドがあるだけです。

 このメモリ節減アプローチでは、ロード/ストア・ユニットを使用してレジスタをロード/アンロードする必要がある場合は必ず、L2との長いレイテンシまたはDRAMとの果てしないレイテンシに直面することになります。アプリケーションのメモリ使用パターンがかなり規則的である場合や、ロード/ストアごとに多数の計算を実行するアルゴリズムの場合、賢いプリフェッチとマルチスレッディングによってこれらのレイテンシをカバーすることが可能です。あるスレッドがメモリを待機するために停止した場合、別のスレッドを起動してパイプラインに投入します。

 ここで問題となるのは、最初のロード/ストアが完了するまでパイプラインをフルに保つためには、かなりの数のスレッドを起動する必要に迫られる可能性があることです。MIAOWに関する論文を発表したウィスコンシン大学のKaru Sankaralingam准教授は、パイプラインをフルに保つには計算上40スレッドが必要で、各スレッドに保留命令セットとベクトルレジスタバンクを持たせる必要があると述べています。従って、GPUのハードウェア・マルチスレッディングはCPUよりはるかに深くなります。また、各CUが64-wide SIMDマシンである点に注目してください。命令は、64本のパイプライン全てに発行されます。この64個の同じ命令コード群と、不要なALUやレジスタでの処理をブロックするマスク・ビットを合わせて、AMDでは「wavefront」、NVIDIAでは「warp」と呼んでいます。

 この短い説明からでも、GPUの効率的なプログラミングが容易でないことが分かるはずです。アルゴリズムはスレッドが豊富で、非常に広いSIMDデータパスを利用しなければならないことに加え、共有L2キャッシュの酷使を回避しながら、システム内で最も希少なリソースであることが多いDRAMチャンネルを効率よく動作させるメモリアクセスパターンを備えている必要があります。

 CUDAやOpenMP、OpenCL のように並列処理の明示制御が可能な言語を使用する場合でも、プログラマーは多くのことを把握しておかなければなりません。うまくやれば、ALUを最高の効率でタスクに集中させることができますが、やり方がまずいと使用率が低下する他、GPUの速度が高速CPUと同等程度まで低下すると同時に、消費電力が何倍にも増加します。

 また、GPUは厳しいリアルタイム処理、高速のコンテキスト切り替え、タスクレベルの決定タイミングには、最適な環境でないことも明らかです。コンテキストが多すぎることに加え、集中制御なしで実行されることが多すぎるからです。しかし、外部信号を使用してスレッドの優先順位を制御することにより、高性能なリアルタイムシステムを構築できる可能性があるという推論は興味深いところです。

Copyright © ITmedia, Inc. All Rights Reserved.