oneapi::mkl::sparse::trsm#

三角形のスパース行列で複数の右辺 (RHS) を持つ線形方程式系を解きます。

説明#

oneapi::mkl::sparse::trsm ルーチンは疎な三角方程式を解きます

\[\text{op}(A)\cdot Y = \alpha \cdot \text{op}(X)\]

ここで、\(A\)\(m\)\(m\) 列の疎な三角行列であり、\(\text{op()}\) は行列修飾子です:

\[\begin{split}\text{op}(A) = \begin{cases} A,& \text{ oneapi::mkl::transpose::nontrans}\\ A^{T},& \text{ oneapi::mkl::transpose::trans}\\A^{H},& \text{ oneapi::mkl::transpose::conjtrans} \end{cases}\end{split}\]

デンス行列 \(X\)\(Y\)row-major (行優先) または column-major (列優先) のレイアウトで格納され、sparse::trsm() 演算を計算するのに適切な行数と columns 数を持ちます。つまり、\(\text{op}(X)\)\(Y\)\(m\) 行 x \(columns\) 列の次元になります。行列 \(x\) は入力の右辺のデータであり、 \(y\) は結果の出力行列です。

与えられた行列を下部、対角部、上部に分解した \(A = L + D + U\) を、oneapi::mkl::uplo::lower または oneapi::mkl::uplo::upper のいずれかを選択して三角行列を解くと、oneapi::mkl::diag::nonunit の場合はそれぞれ \(\text{op}(L+D)\) または \(\text{op}(D+U)\) を使用して適切な順方向置換または逆方向置換が行われます。また、oneapi::mkl::diag::unit を使用する場合は、\(\text{op}(L+I)\) または \(\text{op}(I+U)\) を使用して順方向置換または逆方向置換が行われます。ここで、\(I\) は単位行列です。

  • サポートされている <DATA_TYPE><INT_TYPE> データタイプと整数タイプの一覧については、Sparse BLAS でサポートされているデータと整数タイプを参照してください。また、スローされる可能性のある例外の詳細については、エラー処理を参照してください。

  • RHS をインプレースで更新するため、RHS (\(X\)) と解 (\(Y\)) の両方に同じ配列を渡すことは意味をなしますが、現在、インプレースの sparse::trsm() 操作はサポートされていません。

API#

構文

SYCL* バッファーを使用:

namespace oneapi::mkl::sparse { 
    void trsm ( 
        sycl::queue &queue, 
        oneapi::mkl::layout layout_val, 
        oneapi::mkl::transpose opA, 
        oneapi::mkl::transpose opX, 
        oneapi::mkl::uplo uplo_val, 
        oneapi::mkl::diag diag_val, 
        const DATA_TYPE alpha, 
        oneapi::mkl::sparse::matrix_handle_t A, 
        sycl::buffer<DATA_TYPE, 1> &X, 
        const std::int64_t columns, 
        const std::int64_t ldx, 
        sycl::buffer<DATA_TYPE, 1> &Y, 
        const std::int64_t ldy); 
}

USM ポインターを使用:

namespace oneapi::mkl::sparse { 
    sycl::event trsm( 
        sycl::queue &queue, 
        oneapi::mkl::layout layout_val, 
        oneapi::mkl::transpose opA,
        oneapi::mkl::transpose opX, 
        oneapi::mkl::uplo uplo_val, 
        oneapi::mkl::diag diag_val, 
        const DATA_TYPE alpha, 
        oneapi::mkl::sparse::matrix_handle_t A, 
        const DATA_TYPE *X, 
        const std::int64_t columns, 
        const std::int64_t ldx, 
        DATA_TYPE *Y, 
        const std::int64_t ldy, 
        const std::vector<sycl::event> &dependencies = {}); 
}

インクルード・ファイル#

  • oneapi/mkl/spblas.hpp

入力パラメーター#

queue

SYCL* カーネルの実行に使用される SYCL* コマンドキューを指定します。

layout_val

デンス行列のメモリー内の保存方式を指定します。このレイアウトは、デンス行列 XY の両方に適用されることに注意してください。

opA

スパース入力行列 \(A\) に対する演算 op() を指定します。

oneapi::mkl::transpose::nontrans

非転置、\(\text{op}(A) = A\)

oneapi::mkl::transpose::trans

転置、\(\text{op}(A) = A^{T}\)

oneapi::mkl::transpose::conjtrans

共役転置、\(\text{op}(A) = A^{H}\)

現在、サポートされている操作は oneapi::mkl::transpose::nontrans のみです。

opX

デンス入力行列 \(X\) に対する演算 op() を指定します。

oneapi::mkl::transpose::nontrans

非転置、\(\text{op}(X) = X\)

oneapi::mkl::transpose::trans

転置、\(\text{op}(X) = X^{T}\)

oneapi::mkl::transpose::conjtrans

共役転置、\(\text{op}(X) = X^{H}\)

現在、サポートされている操作は oneapi::mkl::transpose::nontrans のみです。

uplo_val

行列のどの部分を処理するか指定します。

oneapi::mkl::uplo::lower

下三角行列部分を処理します。

oneapi::mkl::uplo::upper

上三角行列部分を処理します。

diag_val

計算に使用する対角線が単位であるか、または提供された行列データに基づくかを指定します。

oneapi::mkl::diag::nonunit

対角要素は、スパース行列で指定されている様に使用されます。

oneapi::mkl::diag::unit

三角解アルゴリズムでは、対角要素に値 1 が代入されます。

oneapi::mkl::diag::nonunit を選択した場合、すべての対角値がスパース行列のスパース・プロファイルに存在する必要があり、ゼロ値であってはなりません。oneapi::mkl::diag::unit の場合、これは必要ではありません。これに違反した場合、onemkl::invalid_value() タイプの例外がスローされます。

alpha

スカラー \(\alpha\) を指定します。

A

スパース行列 (\(A\)) およびその他の内部データを含むオブジェクトへのハンドル。oneapi::mkl::sparse::set_<sparse_matrix_type>_data ルーチンの 1 つを使用して作成されます。

<sparse_matrix_type> でサポートされるケースは、CPU と GPU デバイスでは csr、CPU デバイスでは coo のみです。

X

右辺のデンス行列の SYCL* バッファーまたはデバイスがアクセス可能な USM ポインター。\(\text{op}(X)\) は、指定された X の layout に基づいて、先頭次元ストライドが ldx の列 columns \(m\) 次元になります。

例えば、\(\text{op}(X) = X\)、つまり opX == oneapi::mkl::transpose::nontrans の場合、

layout=oneapi::mkl::layout::col-major

layout=oneapi::mkl::layout::row-major

\(\text{op}(X)\) の nrows

ldx

m

\(\text{op}(X)\) の ncols

columns

ldx

columns

\(\text{op}(X)\) および \(Y\) 行列の列数。

ldx

X 行列の先頭次元を指定します。正の値で、実際に使用可能な行 (layout_val=oneapi::mkl::layout::row_major の場合) または列 (layout_val=oneapi::mkl::layout::col_major の場合) の X 次元以上である必要があります。

ldy

Y 行列の先頭次元を指定します。正の数値で、layout_val=oneapi::mkl::layout::row-major の場合 columns 以上で、layout_val=oneapi::mkl::layout::col-major の場合 \(\text{op}(A)\) 以上の行数である必要があります。

dependencies

oneapi::mkl::sparse::trsm ルーチンが依存するイベントのリストを含む、std::vector<sycl::event> タイプのベクトル。

出力パラメーター#

Y

三角関数のデンス行列解を求める SYCL* バッファーまたはデバイスがアクセス可能な USM ポインター。\(Y\) は、指定された Y の layout に基づいて、先頭次元ストライドが ldy の列 columns \(m\) 次元になります。

layout=oneapi::mkl::layout::col-major

layout=oneapi::mkl::layout::row-major

\(Y\) の nrows

ldy

m (\(\text{op}(A)\)\(A\) の行数)

\(Y\) の ncols

columns

ldy

戻り値 (USM のみ)#

sycl::event

trsm ルーチンの完了を待機したり、依存関係として追加される SYCL* イベント。

#

SYCL* バッファーまたは USM ポインターで oneapi::mkl::sparse::trsm を使用する例は、oneMKL インストール・ディレクトリーの以下の場所にあります。

share/doc/mkl/examples/sycl/sparse_blas/source/csr_trsm.cpp
share/doc/mkl/examples/sycl/sparse_blas/source/csr_trsm_usm.cpp