Main Content

gpucoder.batchedMatrixMultiplyAdd

加算を伴うバッチ行列乗算演算の最適化された GPU 実装

R2020a 以降

説明

[D1,D2] = gpucoder.batchedMatrixMultiplyAdd(A1,B1,C1,A2,B2,C2) は、行列 A1,B1,C1A2,B2,C2 のバッチについて行列-行列乗算と加算を実行します。関数 gpucoder.batchedMatrixMultiplyAdd は次の形式の行列-行列乗算を実行します。

D=αAB+βC

ここで、α および β はスカラー乗算係数、ABC、および D はそれぞれ mk 列、kn 列、mn 列、および mn 列の次元をもつ行列です。A および B は、転置またはエルミート共役にすることもできます。既定の設定では、α および β は 1 に設定され、行列は転置されません。さまざまなスカラー乗算係数を指定し、入力行列の転置演算を実行するには、Name,Value ペアの引数を使用します。

関数 gpucoder.batchedMatrixMultiplyAdd に渡されるすべてのバッチは一様でなければなりません。つまり、すべてのインスタンスは同じ次元 m,n,k でなければなりません。

[D1,...,DN] = gpucoder.batchedMatrixMultiplyAdd(A1,B1,C1,...,AN,BN,CN) は、複数の ABC 行列について、次の形式の行列-行列乗算および加算を実行します。

Di=αAiBi+βCii=1N

___ = gpucoder.batchedMatrixMultiplyAdd(___,Name,Value) は、1 つ以上の Name,Value ペアの引数で指定されたオプションを使用することにより、バッチ行列乗算演算と加算演算を実行します。

すべて折りたたむ

加算を伴うシンプルなバッチ行列-行列乗算を実行し、関数 gpucoder.batchedMatrixMultiplyAdd を使用して、対応する cublas<t>gemmBatched API を呼び出す CUDA® コードを生成します。

1 つのファイル内に、行列入力 A1B1C1A2B2、および C2 を受け入れるエントリポイント関数 myBatchMatMulAdd を記述します。入力行列は転置しないため、'nn' オプションを使用します。

function [D1,D2] = myBatchMatMulAdd(A1,B1,C1,A2,B2,C2,alpha,beta)

[D1,D2] = gpucoder.batchedMatrixMultiplyAdd(A1,B1,C1,A2,B2,C2, ...
    'alpha',alpha,,'beta',beta,'transpose','nn');

end

コード生成で使用する double の行列の型を作成するには、関数 coder.newtype を使用します。

A1 = coder.newtype('double',[12,14],[0 0]);
A2 = coder.newtype('double',[12,14],[0 0]);
B1 = coder.newtype('double',[14,16],[0 0]);
B2 = coder.newtype('double',[14,16],[0 0]);
C1 = coder.newtype('double',[12,16],[0 0]);
C2 = coder.newtype('double',[12,16],[0 0]);
alpha = 0.3;
beta = 0.6;
inputs = {A1,B1,C1,A2,B2,C2,alpha,beta};

CUDA ライブラリを生成するには、関数 codegen を使用します。

cfg = coder.gpuConfig('lib');
cfg.GpuConfig.EnableCUBLAS = true;
cfg.GpuConfig.EnableCUSOLVER = true;
cfg.GenerateReport = true;
codegen -config cfg-args inputs myBatchMatMulAdd

生成された CUDA コードには、入力および出力行列を初期化するためのカーネル myBatchMatMulAdd_kernelNN が含まれます。さらに、コードには cuBLAS ライブラリに対する cublasDgemmBatched API 呼び出しも含まれます。以下のコードは、生成されたコードのスニペットです。

//
// File: myBatchMatMulAdd.cu
//
...
void myBatchMatMulAdd(const double A1[168], const double B1[224], const double
                      C1[192], const double A2[168], const double B2[224], const
                      double C2[192], double alpha, double beta, double D1[192],
                      double D2[192])
{
  double alpha1;
...

  myBatchMatMulAdd_kernel2<<<dim3(1U, 1U, 1U), dim3(224U, 1U, 1U)>>>(*gpu_B2,
    *gpu_B1, *gpu_input_cell_f4, *gpu_input_cell_f3);
  cudaMemcpy(gpu_C2, (void *)&C2[0], 1536UL, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_C1, (void *)&C1[0], 1536UL, cudaMemcpyHostToDevice);
  myBatchMatMulAdd_kernel3<<<dim3(1U, 1U, 1U), dim3(192U, 1U, 1U)>>>(*gpu_C2,
    *gpu_C1, gpu_r3, gpu_r2);
  myBatchMatMulAdd_kernel4<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(gpu_r2,
    *gpu_out_cell);
  myBatchMatMulAdd_kernel5<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(gpu_r3,
    *gpu_out_cell);
...

  cublasDgemmBatched(getCublasGlobalHandle(), CUBLAS_OP_N, CUBLAS_OP_N, 12, 16,
                     14, (double *)gpu_alpha1, (double **)gpu_Aarray, 12,
                     (double **)gpu_Barray, 14, (double *)gpu_beta1, (double **)
                     gpu_Carray, 12, 2);
  myBatchMatMulAdd_kernel6<<<dim3(1U, 1U, 1U), dim3(192U, 1U, 1U)>>>(*gpu_D2,
...

}

入力引数

すべて折りたたむ

オペランド。ベクトルまたは行列として指定します。AB、および C は 2 次元配列でなければなりません。A の列数は B の行数と等しくなければなりません。A の行数は C の行数と等しくなければなりません。B の列数は C の列数と等しくなければなりません。

データ型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
複素数のサポート: あり

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: [D1,D2] = gpucoder.batchedMatrixMultiplyAdd(A1,B1,C1,A2,B2,C2,'alpha',0.3,'beta',0.6,'transpose','CC');

A との乗算に使用されるスカラーの値。既定値は 1 です。

C との乗算に使用されるスカラーの値。既定値は 1 です。

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

出力引数

すべて折りたたむ

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

バージョン履歴

R2020a で導入