設計パターン
GPU Coder™ は、効率的に GPU 構造にマッピングされる一部の設計パターンをサポートします。
ステンシル処理
ステンシル カーネル演算は、出力配列の各要素を入力配列の小さな領域の関数として計算します。多くのフィルター処理はステンシル演算として表現できます。例としては、畳み込み、メディアン フィルター処理、有限要素法などがあります。
ステンシル カーネルの GPU Coder 実装では、各スレッドによって出力配列の 1 つの要素が計算されます。与えられた入力要素は、複数の隣接する出力要素を計算するために繰り返しアクセスされるため、GPU Coder は共有メモリを使用することでメモリ帯域幅とデータ局所性を改善します。
関数 stencilfun
を使用して、ステンシル関数用の CUDA® コードを作成します。ステンシル前処理を示す例については、GPU でのステンシル処理を参照してください。
メモ
R2022b 以降は、関数 stencilfun
を使用して、ステンシルのような演算用の CUDA カーネルを生成します。gpucoder.stencilKernel
は推奨されません。
入力サイズが非常に大きい場合、関数 stencilfun
は、MATLAB® のシミュレーションと数値的に一致しない CUDA コードを生成する可能性があります。このような場合、正確な結果が得られるように、入力サイズを小さくすることを検討してください。
行列-行列処理
多くの科学アプリケーションには、汎用行列-行列乗算 (GEMM) など、C = AB
の形式の行列-行列演算が含まれます。ここでは、必要に応じて A
および B
を転置できます。そのような行列-行列演算のコードは通常、以下のパターンを利用します。
for x = 1:M for y = 1:N for z = 1:K C(x,y) = F(A(x,z),B(z,y)); end end end
ここで、F()
はユーザー定義の関数です。これらの演算では、1 つの入力行列からの行と 2 番目の入力行列からの列を使用して、出力行列の対応する要素を計算します。すべてのスレッドは行と列を再度読み込みます。この設計パターンは、データを再利用して各スレッドで複数の出力要素を計算することで、この構造の最適化が実現します。
たとえば、F()
は通常の行列乗算 F()=@mtimes
にすることができます。そのようなパターンでは、GPU Coder は行列-行連演算の非常に効率的で高速な実装を GPU に作成するために MatrixMatrix
カーネルを提供します。
関数 gpucoder.matrixMatrixKernel
を使用して、行列-行列タイプの演算を実行するための CUDA コードを作成します。
参考
coder.gpu.kernel
| coder.gpu.kernelfun
| gpucoder.matrixMatrixKernel
| coder.gpu.constantMemory
| gpucoder.stencilKernel