gemm_batch#
一般行列の行列-行列積のグループを計算します。
説明
gemm_batch ルーチンは gemm のバッチバージョンであり、1 回の呼び出しで複数の gemm 操作を実行します。各 gemm 演算は、一般行列の行列 - 行列積を計算します。
gemm_batch は次の精度をサポートします。
Ta
(A 行列)
|
Tb
(B 行列)
|
Tc
(C 行列)
|
Ts
(alpha/beta)
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gemm_batch (バッファーバージョン)#
gemm_batch のバッファーバージョンは、ストライド API のみをサポートします。
ストライド API#
ストライド API 操作は次のように定義されます。
for i = 0 … batch_size – 1
A、B、C は、a、b、c 内のオフセット i * stridea、i * strideb、i * stridec にある行列です。
C = alpha * op(A) * op(B) + beta * C
end for説明:
op(
X) は、op(X) =X、op(X) =XT、または op(X) =XH のいずれかですalphaとbetaはスカラーですA、B、Cは行列ですop(
A) はmxk、op(B)はkxn、Cはmxnです。
ストライド API の場合、a、b および c バッファーにすべての入力行列が含まれます。行列間のストライドは、ストライド・パラメーターで指定されます。a、b、c バッファー内の行列の合計数は、batch_size パラメーターで指定されます。
構文#
namespace oneapi::mkl::blas::column_major {
void gemm_batch(sycl::queue &queue,
oneapi::mkl::transpose transa,
oneapi::mkl::transpose transb,
std::int64_t m,
std::int64_t n,
std::int64_t k,
Ts alpha,
sycl::buffer<Ta,1> &a,
std::int64_t lda,
std::int64_t stridea,
sycl::buffer<Tb,1> &b,
std::int64_t ldb,
std::int64_t strideb, Ts beta,
sycl::buffer<Tc,1> &c,
std::int64_t ldc,
std::int64_t stridec,
std::int64_t batch_size,
compute_mode mode = compute_mode::unset)
}namespace oneapi::mkl::blas::row_major {
void gemm_batch(sycl::queue &queue,
oneapi::mkl::transpose transa,
oneapi::mkl::transpose transb,
std::int64_t m,
std::int64_t n,
std::int64_t k,
Ts alpha,
sycl::buffer<Ta,1> &a,
std::int64_t lda,
std::int64_t stridea,
sycl::buffer<Tb,1> &b,
std::int64_t ldb,
std::int64_t strideb,
Ts beta,
sycl::buffer<Tc,1> &c,
std::int64_t ldc,
std::int64_t stridec,
std::int64_t batch_size,
compute_mode mode = compute_mode::unset)
}入力パラメーター#
- queue
ルーチンを実行するキュー。
- transa
行列
Aに適用される転置演算 op(A) を指定します。詳細はデータタイプを参照してください。- transb
行列
Bに適用される転置演算 op(B) を指定します。詳細はデータタイプを参照してください。- m
行列 op(
A) と行列Cの行数。最小値はゼロです。- n
行列 op(
B) と行列Cの列数。最小値はゼロです。- k
行列 op(
A) の列数と行列 op(B) の行数。最小値はゼロです。- alpha
行列 - 行列積のスケーリング係数。
- a
入力行列
Aを保持するバッファー。バッファーのサイズはstridea*batch_size以上である必要があります。- lda
行列
Aの先頭次元。正である必要があります。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
m以上である必要がありますk以上である必要があります行優先
k以上である必要がありますm以上である必要があります- stridea
連続する 2 つの行列
A間のストライド。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
lda*k以上である必要がありますlda*m以上である必要があります行優先
lda*m以上である必要がありますlda*k以上である必要があります- b
入力行列
Bを保持するバッファー。バッファーのサイズはstrideb*batch_size以上である必要があります。- ldb
行列
Bの先頭次元。正である必要があります。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
k以上である必要がありますn以上である必要があります行優先
n以上である必要がありますk以上である必要があります- strideb
連続する 2 つの行列
B間のストライド。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
ldb*n以上である必要がありますldb*k以上である必要があります行優先
ldb*k以上である必要がありますldb*n以上である必要があります- beta
行列
Cのスケーリング係数。- c
入力/出力行列
Cを保持するバッファー。バッファーのサイズはstridec*batch_size以上である必要があります。- ldc
行列
Cの先頭次元。正である必要があります。列優先
m以上である必要があります行優先
n以上である必要があります- stridec
連続する 2 つの行列
C間のストライド。列優先
ldc*n以上である必要があります行優先
ldc*m以上である必要があります- batch_size
実行する行列乗算演算の数を指定します。最小値はゼロです。
- mode
オプション。計算モードの設定。計算モードを参照してください。
出力パラメーター#
- c
出力バッファーは、
alpha* op(A) * op(B) +beta*C形式のbatch_sizegemm操作によって上書きされます。
注
beta = 0 の場合、gemm_batch を呼び出す前に行列 C を初期化する必要はありません。
gemm_batch (USM バージョン)#
gemm_batch の USM バージョンは、グループ API とストライド API をサポートします。
グループ API#
グループ API の整数ポインターの Ti タイプは、std::int64_t または std::int32_t のいずれかです。
グループ API 操作は次のように定義されます。
idx = 0
for i = 0 … group_count – 1
for j = 0 … group_size – 1
A、B、C は a[idx]、b[idx]、c[idx] の行列です。
C = alpha[i] * op(A) * op(B) + beta[i] * C idx = idx + 1
end for
end for説明:
op(
X) は、op(X) =X、op(X) =XT、または op(X) =XH のいずれかですalphaとbetaはスカラーですA、B、およびCは行列ですop(
A) はmxk、op(B) はkxn、そしてCはmxnです。
グループ API の場合、a、b、c 配列にはすべての入力行列へのポインターが含まれます。a、b および c の行列の合計数は次のように与えられます。
グループ API は、ポインター入力とスパン入力の両方をサポートします。
ポインターの代わりにスパンを使用する利点は、配列のサイズを可変にでき、実行時にスパンのサイズを照会できることです。出力行列を除く各 gemm パラメーターでは、スパンのサイズは 1、グループの数、または合計バッチサイズにすることができます。出力行列の場合、すべての計算が独立していることを保証するには、スパンのサイズが合計バッチサイズである必要があります。
スパンのサイズに応じて、gemm 計算の各パラメーターは次のように使用されます。
span size = 1 |
パラメーターはすべての |
span size = |
パラメーターはすべての |
span size = |
各 |
構文#
namespace oneapi::mkl::blas::column_major {
sycl::event gemm_batch(sycl::queue &queue,
const oneapi::mkl::transpose *transa,
const oneapi::mkl::transpose *transb,
const Ti *m,
const Ti *n,
const Ti *k,
const Ts *alpha,
const Ta **a,
const Ti *lda,
const Tb **b,
const Ti *ldb,
const Ts *beta,
Tc **c,
const Ti *ldc,
std::int64_t group_count,
const Ti *group_size,
compute_mode mode = compute_mode::unset,
const std::vector<sycl::event> &dependencies = {})
sycl::event gemm_batch(sycl::queue &queue,
const sycl::span<oneapi::mkl::transpose> &transa,
const sycl::span<oneapi::mkl::transpose> &transb,
const sycl::span<std::int64_t> &m,
const sycl::span<std::int64_t> &n,
const sycl::span<std::int64_t> &k,
const sycl::span<Ts> &alpha,
const sycl::span<const Ta*> &a,
const sycl::span<std::int64_t> &lda,
const sycl::span<const Tb*> &b,
const sycl::span<std::int64_t> &ldb,
const sycl::span<Ts> &beta,
sycl::span<Tc*> &c,
const sycl::span<std::int64_t> &ldc,
size_t group_count,
const sycl::span<size_t> &group_sizes,
compute_mode mode = compute_mode::unset,
const std::vector<sycl::event> &dependencies = {})
}namespace oneapi::mkl::blas::row_major {
sycl::event gemm_batch(sycl::queue &queue,
const oneapi::mkl::transpose *transa,
const oneapi::mkl::transpose *transb,
const Ti *m,
const Ti *n,
const Ti *k,
const Ts *alpha,
const Ta **a,
const Ti *lda,
const Tb **b,
const Ti *ldb,
const Ts *beta,
Tc **c,
const Ti *ldc,
std::int64_t group_count,
const Ti *group_size,
compute_mode mode = compute_mode::unset,
const std::vector<sycl::event> &dependencies = {})
sycl::event gemm_batch(sycl::queue &queue,
const sycl::span<oneapi::mkl::transpose> &transa,
const sycl::span<oneapi::mkl::transpose> &transb,
const sycl::span<std::int64_t> &m,
const sycl::span<std::int64_t> &n,
const sycl::span<std::int64_t> &k,
const sycl::span<Ts> &alpha,
const sycl::span<const Ta*> &a,
const sycl::span<std::int64_t> &lda,
const sycl::span<const Tb*> &b,
const sycl::span<std::int64_t> &ldb,
const sycl::span<Ts> &beta,
sycl::span<Tc*> &c,
const sycl::span<std::int64_t> &ldc,
size_t group_count,
const sycl::span<size_t> &group_sizes,
compute_mode mode = compute_mode::unset,
const std::vector<sycl::event> &dependencies = {})
}入力パラメーター#
- queue
ルーチンを実行するキュー。
- transa
group_countoneapi::mkl::transpose値の配列またはスパン。transa[i]は グループi内の行列Aに適用される転置演算 op(A) を指定します。詳細はデータタイプを参照してください。- transb
group_countoneapi::mkl::transpose値の配列またはスパン。transb[i]は グループi内の行列Bに適用される転置演算 op(B) を指定します。詳細はデータタイプを参照してください。- m
group_count整数の配列またはスパン。m[i]はグループi内の行列 op(A) と行列Cの行数を指定します。すべてのエントリーは 0 以上である必要があります。- n
group_count整数の配列またはスパン。n[i]はグループi内の行列 op(B) と行列Cの列数を指定します。すべてのエントリーは 0 以上である必要があります。- k
group_count整数の配列またはスパン。k[i]はグループi内の行列 op(A) の列数と行列 op(B) の行数を指定します。すべてのエントリーは 0 以上である必要があります。- alpha
group_countスカラー要素は配列またはスパン。alpha[i]はグループi内の行列 - 行列積のスケーリング係数を指定します。- a
入力行列
Aのtotal_batch_countポインターの配列、またはtotal_batch_count入力行列Aのスパン。行列ストレージを参照してください。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
配列
A[i]のサイズはlda[i]*k[i]以上でなければなりません配列
A[i]のサイズはlda[i]*m[i]以上でなければなりません行優先
配列
A[i]のサイズはlda[i]*m[i]以上でなければなりません配列
A[i]のサイズはlda[i]*k[i]以上でなければなりません- lda
group_count整数の配列またはスパン。lda[i]はグループi内の行列Aの先頭次元を指定します。正である必要があります。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
m[i]以上である必要がありますk[i]以上である必要があります行優先
k[i]以上である必要がありますm[i]以上である必要があります- b
入力行列
Bのtotal_batch_countポインターの配列、またはtotal_batch_count入力行列Bのスパン。行列ストレージを参照してください。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
配列
B[i]のサイズはldb[i]*n[i]以上でなければなりません配列
B[i]のサイズはldb[i]*k[i]以上でなければなりません行優先
配列
B[i]のサイズはldb[i]*k[i]以上でなければなりません配列
B[i]のサイズはldb[i]*n[i]以上でなければなりません- ldb
group_count整数の配列またはスパン。ldb[i]はグループi内の行列Bの先頭次元を指定します。正である必要があります。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
k[i]以上である必要がありますn[i]以上である必要があります行優先
n[i]以上である必要がありますk[i]以上である必要があります- beta
group_countスカラー要素は配列またはスパン。beta[i]はグループi内の行列Cのスケーリング係数を指定します。- c
入力/出力行列
Cのtotal_batch_countポインターの配列、またはtotal_batch_count入力/出力行列Cのスパン。行列ストレージを参照してください。列優先
配列
C[i]のサイズはldc[i]*n[i]以上でなければなりません行優先
配列
C[i]のサイズはldc[i]*m[i]以上でなければなりません- ldc
group_count整数の配列またはスパン。ldc[i]はグループi内の行列Cの先頭次元を指定します。正である必要があります。列優先
m[i]以上である必要があります行優先
n[i]以上である必要があります- group_count
グループの数最小値はゼロです。
- group_size
group_count整数の配列またはスパン。group_size[i]はグループi内のgemm操作の数を指定します。group_size内の各要素は 0 以上である必要があります。- mode
オプション。計算モードの設定。詳細は計算モードを参照してください。
- dependencies
オプション。計算を開始する前に待機するイベントのリスト (存在する場合)。省略した場合、依存関係はデフォルトでなくなります。
modeとdependenciesはそれぞれ省略できます。dependencies を提供するのにmodeを指定する必要はありません。
出力パラメーター#
- c
alpha* op(A) * op(B) +beta*C形式のtotal_batch_countgemm演算によって上書きされる出力行列Cへのポインター配列。
注
beta = 0 の場合、gemm_batch を呼び出す前に行列 C を初期化する必要はありません。
戻り値#
計算が完了したことを確認するために待機する出力イベント。
例#
USM バージョンの gemm_batch の使用方法の例は、oneMKL インストール・ディレクトリーの次の場所にあります。
share/doc/mkl/examples/sycl/blas/source/gemm_batch.cppストライド API#
ストライド API 操作は次のように定義されます。
for i = 0 … batch_size – 1
A、B、C は、a、b、c 内のオフセット i * stridea、i * strideb、i * stridec にある行列です。
C = alpha * op(A) * op(B) + beta * C
end for説明:
op(
X) は、op(X) =X、op(X) =XT、または op(X) =XH のいずれかですalphaとbetaはスカラーですA、B、およびCは行列ですop(
A) はmxk、op(B) はkxn、そしてCはmxnです。
ストライド API の場合、a、b および c 配列にすべての入力行列が含まれます。行列間のストライドは、ストライド・パラメーターで指定されます。a、b および c 配列内の行列の合計数は、batch_size パラメーターで指定されます。
構文#
namespace oneapi::mkl::blas::column_major {
sycl::event gemm_batch(sycl::queue &queue,
oneapi::mkl::transpose transa,
oneapi::mkl::transpose transb,
std::int64_t m,
std::int64_t n,
std::int64_t k,
oneapi::mkl::value_or_pointer<Ts> alpha,
const Ta *a,
std::int64_t lda,
std::int64_t stridea,
const Tb *b,
std::int64_t ldb,
std::int64_t strideb,
oneapi::mkl::value_or_pointer<Ts> beta,
Tc *c,
std::int64_t ldc,
std::int64_t stridec,
std::int64_t batch_size,
compute_mode mode = compute_mode::unset,
const std::vector<sycl::event> &dependencies = {})
}namespace oneapi::mkl::blas::row_major {
sycl::event gemm_batch(sycl::queue &queue,
oneapi::mkl::transpose transa,
oneapi::mkl::transpose transb,
std::int64_t m,
std::int64_t n,
std::int64_t k,
oneapi::mkl::value_or_pointer<Ts> alpha,
const Ta *a,
std::int64_t lda,
std::int64_t stridea,
const Tb *b,
std::int64_t ldb,
std::int64_t strideb,
oneapi::mkl::value_or_pointer<Ts> beta,
Tc *c,
std::int64_t ldc,
std::int64_t stridec,
std::int64_t batch_size,
compute_mode mode = compute_mode::unset,
const std::vector<sycl::event> &dependencies = {})
}入力パラメーター#
- queue
ルーチンを実行するキュー。
- transa
行列
Aに適用される転置演算 op(A) を指定します。詳細はデータタイプを参照してください。- transb
行列
Bに適用される転置演算 op(B) を指定します。詳細はデータタイプを参照してください。- m
行列 op(
A) と行列Cの行数。最小値はゼロです。- n
行列 op(
B) と行列Cの列数。最小値はゼロです。- k
行列 op(
A) の列数と行列 op(B) の行数。最小値はゼロです。- alpha
行列 - 行列積のスケーリング係数。
value_or_pointerデータタイプの詳細については、スカラー引数を参照してください。- a
入力行列
Aへのポインター。配列のサイズはstridea*batch_size以上である必要があります。- lda
行列
Aの先頭次元。正である必要があります。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
m以上である必要がありますk以上である必要があります行優先
k以上である必要がありますm以上である必要があります- stridea
連続する 2 つの行列
A間のストライド。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
lda*k以上である必要がありますlda*m以上である必要があります行優先
lda*m以上である必要がありますlda*k以上である必要があります- b
入力行列
Bへのポインター。配列のサイズはstrideb*batch_size以上である必要があります。- ldb
行列
Bの先頭次元。正である必要があります。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
k以上である必要がありますn以上である必要があります行優先
n以上である必要がありますk以上である必要があります- strideb
連続する 2 つの行列
B間のストライド。transa=transpose::nontranstransa=transpose::transまたはtrans=transpose::conjtrans列優先
ldb*n以上である必要がありますldb*k以上である必要があります行優先
ldb*k以上である必要がありますldb*n以上である必要があります- beta
行列
Cのスケーリング係数。value_or_pointerデータタイプの詳細については、スカラー引数を参照してください。- c
入力/出力行列
Cへのポインター。配列のサイズはstridec*batch_size以上である必要があります。- ldc
行列
Cの先頭次元。正である必要があります。列優先
m以上である必要があります行優先
n以上である必要があります- stridec
連続する 2 つの行列
C間のストライド。列優先
ldc*n以上である必要があります行優先
ldc*m以上である必要があります- batch_size
実行する行列乗算演算の数を指定します。最小値はゼロです。
- mode
オプション。計算モードの設定。詳細は計算モードを参照してください。
- dependencies
オプション。計算を開始する前に待機するイベントのリスト (存在する場合)。省略した場合、依存関係はデフォルトでなくなります。
modeとdependenciesはそれぞれ省略できます。dependencies を提供するのにmodeを指定する必要はありません。
出力パラメーター#
- c
alpha* op(A) * op(B) +beta*C形式のbatch_sizegemm演算によって上書きされる出力行列Cへのポインター。
注
beta = 0 の場合、gemm_batch を呼び出す前に行列 C を初期化する必要はありません。
戻り値#
計算が完了したことを確認するために待機する出力イベント。