スパース BLAS SYCL* の機能#
次の表は、インテル® oneMKL における SYCL* スパース BLAS API の現在のサポートをまとめたものです。
表では、操作の説明でスパース・オブジェクトとデンス・オブジェクトに次の記号を使用します。
スカラー値 = \(\alpha\)、\(\beta\)、\(d\)、
デンスベクトル = \(x\)、\(y\)、
デンスベクトル = \(xs\)、\(ys\)、
デンス行列 = \(X\)、\(Y\) と
スパース行列 = \(A\)、\(B\)、\(C\)、
単位行列 = \(I\)。
いくつかの操作では、スパース行列を、スパース行列 \(A\) の厳密に下側 (\(L\))、対角 (\(D\))、および厳密に上側 (\(U\)) の部分を持つ \(A=L+D+U\) に分解します。操作で使用するデータ部分の選択は、入力パラメーターによって制御されます。
操作に \((L+D)\) または \((L+I)\) を選択する場合は \(\text{uplo::lower}\)
操作に \((D+U)\) または \((I+U)\) を選択する場合は \(\text{uplo::upper}\)
いくつかの三角演算では、スパース行列の主な対角データを無視し、演算で対角上のデータに置き換えることができます。
\(\text{diag::nonunit}\) はデータで提供された \(D\) を使用し、
\(\text{diag::unit}\) は \(D\) を無視し、代わりに恒等式 \(I\) を使用します。
最後に、\(\text{op}()\) 演算は 3 つの “transpose” 演算の 1 つを表します。
\(\text{op}\left(A\right) = A\) \(\text{transpose::nontrans}\) を使用する場合
\(\text{op}\left(A\right) = A^{T}\) \(\text{transpose::trans}\) を使用する場合
\(\text{op}\left(A\right) = A^{H}\) \(\text{transpose::conjtrans}\) を使用する場合
通常はすべてサポートされる予定ですが、実際のサポートリストと制限は各 API の個別の説明ページで提供されます。
レベル 1#
スパースベクトルとその他のベクトルを含むスパース BLAS 操作。
現在、oneMKL にはスパースベクトルまたはスパースレベル 1 演算をサポートする SYCL スパース BLAS API はありません。
レベル 2#
スパース行列とベクトルを含むスパース BLAS 演算。
通称 |
oneapi::mkl:: 名前空間を持つ SYCL* API 名 |
操作 |
CSR サポート |
COO サポート |
|---|---|---|---|---|
SpMV |
sparse::gemv() |
\(y=\alpha\cdot\text{op}\left(A\right)\cdot x + \beta\cdot y\) |
CPU/GPU |
CPU/GPU |
sparse::symv() + uplo::lower |
\(y=\alpha\cdot\left(L+D+L^T\right)\cdot x + \beta\cdot y\) |
CPU/GPU |
なし |
|
sparse::symv() + uplo::upper |
\(y=\alpha\cdot\left(U^T+D+U\right)\cdot x + \beta\cdot y\) |
CPU/GPU |
なし |
|
sparse::trmv() + uplo::lower + diag::nonunit |
\(y=\alpha\cdot\text{op}\left(L+D\right)\cdot x + \beta\cdot y\) |
CPU/GPU |
CPU |
|
sparse::trmv() + uplo::lower + diag::unit |
\(y=\alpha\cdot\text{op}\left(L+I\right)\cdot x + \beta\cdot y\) |
CPU/GPU |
CPU |
|
sparse::trmv() + uplo::upper + diag::nonunit |
\(y=\alpha\cdot\text{op}\left(D+U\right)\cdot x + \beta\cdot y\) |
CPU/GPU |
CPU |
|
sparse::trmv() + uplo::upper + diag::unit |
\(y=\alpha\cdot\text{op}\left(I+U\right)\cdot x + \beta\cdot y\) |
CPU/GPU |
CPU |
|
SpMV + dot fusion |
sparse::gemvdot() |
\(y=\alpha\cdot\text{op}\left(A\right)\cdot x + \beta\cdot y\) \(d=\text{dot}\left(y,x\right)\) |
CPU/GPU |
CPU |
SpSV または SpTRSV |
sparse::trsv() + uplo::lower + diag::nonunit |
|
CPU/GPU |
CPU |
sparse::trsv() + uplo::lower + diag::unit |
|
CPU/GPU |
CPU |
|
sparse::trsv() + uplo::upper + diag::nonunit |
|
CPU/GPU |
CPU |
|
sparse::trsv() + uplo::upper + diag::unit |
|
CPU/GPU |
CPU |
|
レベル 3#
1 つ以上のスパース/デンス行列を含むスパース BLAS 演算。
通称 |
oneapi::mkl:: 名前空間を持つ SYCL* API 名 |
操作 |
CSR サポート |
COO サポート |
|---|---|---|---|---|
SpMM (Dn <- Sp * Dn) |
sparse::gemm() |
\(Y=\alpha\cdot\text{op}\left(A\right)\cdot\text{op}(X) + \beta\cdot Y\) |
CPU/GPU |
CPU |
SpSM または SpTRSM |
sparse::trsm() + uplo::lower + diag::nonunit |
|
CPU/GPU |
CPU |
sparse::trsm() + uplo::lower + diag::unit |
|
CPU/GPU |
CPU |
|
sparse::trsm() + uplo::upper + diag::nonunit |
|
CPU/GPU |
CPU |
|
sparse::trsm() + uplo::upper + diag::unit |
|
CPU/GPU |
CPU |
|
SpGEAM (Sp <- Sp + Sp) |
sparse::omatadd() |
\(C=\alpha\cdot\text{op}\left(A\right) + \beta\cdot\text{op}\left(B\right)\) |
CPU/GPU |
なし |
SpGEMM (Sp <- Sp * Sp) |
sparse::matmat() |
\(C=\text{op}\left(A\right)\cdot\text{op}\left(B\right)\) |
CPU/GPU |
なし |
SpGEMMD (Dn <- Sp * Sp) |
sparse::matmatd() |
\(C=\alpha\cdot\text{op}\left(A\right)\cdot\text{op}\left(B\right) + \beta\cdot C\) |
GPU |
なし |
補助関数#
スパース行列ハンドルを処理できる操作。
通称 |
oneapi::mkl:: 名前空間を持つ SYCL* API 名 |
操作 |
CSR サポート |
COO サポート |
|---|---|---|---|---|
スパースコピーまたはスパース行列転置 |
sparse::omatcopy() |
\(B=\text{op}\left(A\right)\) |
CPU/GPU |
CPU/GPU |
スパース行列変換 |
sparse::omatconvert() |
\(B=\text{convert}\left(A\right)\)、ここで \(B\) と \(A\) は異なるスパース行列形式で表されます |
CPU/GPU |
CPU/GPU |
スパース行列ソート |
sparse::sort_matrix() |
スパース行列形式の自然な順序による \(A=\text{sort}\left(A\right)\) |
CPU/GPU |
なし (下記の注記を参照) |
行列の主対角線を更新 |
sparse::update_diagonal_data() |
\(A\) を新しく提供された対角値 \(D\) でインプレースで更新する |
GPU |
なし |
注
COO 形式には自然なスパース順序がありません。これは、各行内で列インデックスがソートされた CSR 形式の自然な順序付けである SortInRows の場合もあれば、各列内で行インデックスがソートされた CSC 形式の自然な順序付けである SortInColumns の場合もあります。COO 形式に使用する順序を指定する新しい API またはオーバーロードが将来提供される予定です。