最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

GPU プログラミングのパラダイム

GPU 高速化コンピューティングは異種混合プログラミング モデルに従います。ソフトウェア アプリケーションの高度に並列化できる部分は、物理的に切り離された GPU デバイスで実行されるカーネルにマッピングされ、逐次コードの残りの部分はそのまま CPU で実行されます。各カーネルには複数のワーカーまたはスレッドが割り当てられ、これらはブロックとグリッドに整理されます。カーネル内のすべてのスレッドは互いに同時に実行されます。

GPU Coder™ の目的は、逐次的な MATLAB® プログラムを利用し、そこから分割および最適化された CUDA® コードを生成することです。このプロセスには以下が含まれます。

  • CPU/GPU 分割 — CPU で実行されるコードのセグメントと、GPU で実行されるセグメントを識別します。GPU Coder で CUDA カーネルを識別するさまざまな方法については、カーネルの作成を参照してください。CPU と GPU 間でのメモリ転送コストは、カーネル作成アルゴリズムでは重要な考慮事項になります。

  • カーネルの分割が完了した後、GPU Coder は CPU 分割と GPU 分割の間におけるデータの依存関係を解析します。CPU と GPU 間で共有されるデータは (cudaMalloc API または cudaMallocManaged API を使用して) GPU メモリに割り当てられます。解析では、cudaMemcpy を使用して CPU と GPU 間でデータをコピーしなければならない位置の最小セットも特定されます。また、CUDA でユニファイド メモリを使用する場合、同じ解析パスにより、関数を適切に動作させるために cudaDeviceSync 呼び出しを挿入しなければならない最小限のコードの位置も特定されます。

  • 次に、各カーネル内において、GPU Coder でデータを共有メモリにマッピングするか、定数メモリにマッピングするかを選択できます。うまく使用すれば、これらのメモリが GPU メモリの階層構造の一部となり、メモリ帯域幅が大きくなる可能性があります。GPU Coder で共有メモリにマッピングする方法については、ステンシル処理を参照してください。GPU Coder で定数メモリにマッピングする方法については、coder.gpu.constantMemory を参照してください。

  • 分割、メモリ割り当て、およびメモリ転送のステートメントを準備したら、その分割とメモリ割り当ての決定に従った CUDA コードを GPU Coder で生成できます。生成されたソース コードは、MEX ターゲットへとコンパイルして、MATLAB 内から呼び出すか、外部プロジェクトと統合するために共有ライブラリに呼び出すことができます。GPU Coder オプションについては、GPU Coder 構成プロパティを参照してください。