スパース BLAS SYCL* の機能

スパース 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

\(y\) を解く:

\(\text{op}\left(L+D\right)\cdot y = \alpha\cdot x\)

CPU/GPU

CPU

sparse::trsv() + uplo::lower + diag::unit

\(y\) を解く:

\(\text{op}\left(L+I\right)\cdot y = \alpha\cdot x\)

CPU/GPU

CPU

sparse::trsv() + uplo::upper + diag::nonunit

\(y\) を解く:

\(\text{op}\left(D+U\right)\cdot y = \alpha\cdot x\)

CPU/GPU

CPU

sparse::trsv() + uplo::upper + diag::unit

\(y\) を解く:

\(\text{op}\left(I+U\right)\cdot y = \alpha\cdot x\)

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

\(Y\) を解く:

\(\text{op}\left(L+D\right)\cdot Y = \alpha\cdot\text{op}(X)\)

CPU/GPU

CPU

sparse::trsm() + uplo::lower + diag::unit

\(Y\) を解く:

\(\text{op}\left(L+I\right)\cdot Y = \alpha\cdot\text{op}(X)\)

CPU/GPU

CPU

sparse::trsm() + uplo::upper + diag::nonunit

\(Y\) を解く:

\(\text{op}\left(D+U\right)\cdot Y = \alpha\cdot\text{op}(X)\)

CPU/GPU

CPU

sparse::trsm() + uplo::upper + diag::unit

\(Y\) を解く:

\(\text{op}\left(I+U\right)\cdot Y = \alpha\cdot\text{op}(X)\)

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 またはオーバーロードが将来提供される予定です。