GeMM
GeMM (General Matrix Multiply)メソッドは、2つの行列の一般的な乗算を実装します。演算はC ← α A B + β Cとして定義されます。ここで、A行列とB行列はオプションで転置できます。行列ABの通常の乗算(MatMul)では、alphaスカラーは1に等しいと想定され、ベータはゼロに等しくなります。
効率におけるGeMMとMatMulの主な違いは、MatMulは常に新しい行列/ベクトルオブジェクトを作成するのに対し、GeMMは既存の行列オブジェクトで動作し、再作成しないことです。したがって、GeMMを使用して対応する行列にメモリを事前に割り当てると、同じ行列サイズで作業している間、メモリの再割り当ては行われません。これは、たとえば、ストラテジーテスターで最適化を実行する場合やニューラルネットワークをトレーニングする場合など、バルクコンピューティングにおけるGeMMの重要な利点となります。
MatMulと同様に、GeMMにも4つのオーバーロードがあります。ただし、4番目のオーバーロードのセマンティクスは、垂直ベクトルと水平ベクトルの乗算を可能にするために変更されています。
既存の行列/ベクトルオブジェクトでは、メモリを事前に割り当てる必要はありません。メモリは、最初のGeMM呼び出しで割り当てられ、ゼロで埋められます。
行列と行列の乗算: matrix C[M][N] = α * ( matrix A[M][K] * matrix B[K][N]) + β * matrix C[M][N]
bool matrix::GeMM(
|
ベクトルと行列の乗算: vector C[N] = α * ( vector A[K] * matrix B[K][N]) + β * vector C[N]
bool vector::GeMM(
|
行列とベクトルの乗算: vector C[M] = α * ( matrix A[M][K] * vector B[K] * ) + β * vector C[M]
bool vector::GeMM(
|
ベクトルとベクトルの乗算: matrix C[M][N] = α * ( vector A[M] * vector B[N] * ) + β * matrix C[M][N]. このオーバーロードは、スカラーを返すMatMulとは異なり、行列を返します。
bool matrix::GeMM(
|
パラメータ
A
[in] 行列/ベクトル
B
[in] 行列/ベクトル
alpha
[in] AB積のアルファ乗数
beta
[in] 結果のC行列のベータ乗数
フラグ
[in] 行列A、B、Cが転置されるかどうかを決定するENUM_GEMM列挙値
戻り値
成功の場合はtrue、それ以外の場合はfalse
GeMMメソッドのフラグの列挙
ID |
説明 |
---|---|
TRANSP_A |
転置行列Aを使用 |
TRANSP_B |
転置行列Bを使用 |
TRANSP_C |
転置行列Cを使用 |
注意事項
float、double、complex型の行列とベクトルは、パラメータAとBとして使用できます。GeMMメソッドのテンプレートバリアントは次のとおりです。
bool matrix<T>::GeMM(const matrix<T> &A,const matrix<T> &B,T alpha,T beta,ulong flags);
|
基本的に、一般的な行列乗算関数は次のように記述されます。
C[m,n] = α *Sum(A[m,k]*B[k,n]) + β*C[m,n] |
行列AはM x K、行列BはK x N、行列CはM x Nです。
したがって、行列は乗算に対応している必要があります。つまり、1番目の行列の列数は2番目の行列の行数と等しくなければなりません。行列の乗算は可換ではありません。一般に、1番目の行列に2番目の行列を掛けた結果は、2番目の行列に最初の行列を掛けた結果と等しくありません。
例:
void OnStart()
|
参照