Main Content

gpucoder.matrixMatrixKernel

行列-行列演算を含む関数の最適化された GPU 実装

説明

C = gpucoder.matrixMatrixKernel(fun,A,B) は、GEMM のような演算を含む関数からカーネルを生成します。たとえば、以下を使用して 2 つのイメージ間の特徴点をマッチさせます。

  • 差の絶対値の和 (SAD) — F() = @(a,b)abs(a-b)

  • 差の二乗の和 (SSD) — F() = @(a,b)(a-b).*(a-b)

C = gpucoder.matrixMatrixKernel(___,orientation) のオプション引数 orientation は、A および B 行列の向きを指定します。

C = gpucoder.matrixMatrixKernel(___,vectorizedSim) には、MATLAB® シミュレーション時および CPU コード生成時におけるベクトル化された演算の使用を指定するオプションの引数 vectorizedSim があります。関数ハンドル fun はベクトル入力をサポートし、A から 1 つの行または列、B から 1 つの列または行を取り、arrayfun(FUN, A, B) と等価のベクトルを出力しなければなりません。

すべて折りたたむ

この例では、シンプルな行列-行列乗算を実行し、matrixMatrixKernel 設計パターンを使用して、CUDA® コードを生成します。

1 つのファイル内に、2 つの行列入力 f1 および f2 を受け入れるエントリポイント関数 matMul_nn を記述します。MATLAB 関数 @times を使用して、f1 および f2 を要素ごとに乗算します。@ 記号は、関数 times のハンドルを作成します。gpucoder.matrixMatrixKernel() ステートメントを挿入します。入力行列は転置しないため、'nn' オプションを使用します。

function scores = matMul_nn(f1, f2)
    scores = gpucoder.matrixMatrixKernel(@times, f1, f2, 'nn',true);
end

関数 codegen を使用して CUDA MEX 関数を生成します。

codegen -config coder.gpuConfig('mex') ...
    -args {ones(1024,1024,'double'),ones(1024,1024,'double')} ...
    -report matMul_nn

生成された CUDA コードは 2 つのカーネルを含みます。出力行列 scores を初期化するための matMul_nn_kernel1 と、times 演算を実行する matrixMatrixKernel です。以下は、生成コードのスニペットです。

  cudaMemcpy(*gpu_f2, cpu_f2, 8388608UL, cudaMemcpyHostToDevice);
  matMul_nn_kernel1<<<dim3(2048U, 1U, 1U), dim3(512U, 1U, 1U)>>>(*gpu_f2,
                                                                 *gpu_B);
  cudaMemcpy(*gpu_f1, cpu_f1, 8388608UL, cudaMemcpyHostToDevice);
  matrixMatrixKernel<<<1024U, 64U>>>(*gpu_f1, *gpu_B, *gpu_scores);
  cudaMemcpy(cpu_scores, *gpu_scores, 8388608UL, cudaMemcpyDeviceToHost);

入力引数

すべて折りたたむ

入力配列の要素に適用する関数。関数ハンドルとして指定します。fun は、ユーザー定義関数のハンドルです。行列 A から 1 つの行または列を、行列 B から 1 つの行または列を受け取り、入力と同じ型のベクトルを出力します。その後、出力ベクトルが合計され、C の単一のスカラー値が計算されます。

データ型: function_handle

数値入力 A および B は、同じサイズか、互換性のあるサイズでなければなりません。たとえば、AMK 列の行列、BKN 列の行列の場合、CMN 列の行列になります。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | half

2 つの文字からなる文字ベクトルまたは string で、行列乗算の前に行列 A および B で実行される演算を示します。可能な値は、標準 ('N')、転置 ('T')、または複素共役転置 ('C') です。

以下の値が使用可能です。

  • 'nn' - 行列 A および B は正規です。

  • 'nt' - 行列 B は転置されます。

  • 'tn' - 行列 A は転置されます。

  • 'tt' - 行列 A および B の両方が転置されます。

MATLAB シミュレーションおよび CPU コード生成の際に、ベクトル化された演算を使用するかどうかを指定します。

出力引数

すべて折りたたむ

積。スカラー、ベクトル、または行列として返されます。配列 D には、入力 A と同じ数の行と、入力 B と同じ数の列があります。

バージョン履歴

R2017b で導入