gesvda_batch (USM ストライドバージョン)

gesvda_batch (USM ストライドバージョン)#

一般行列のバッチに対して切り捨て SVD 因数分解を計算します。このルーチンは、oneapi::mkl::lapack 名前空間に属します。

説明#

このルーチンは、一般行列 Ai のバッチに対して、切り捨て SVD 分解 (またはランクを下げた近似値) を次のように計算します。

Ai = Ui * Si * ViT

ここで、UiVi は直交行列、Si は対角線上に特異値を持つ対角行列です。特異値は非負であり、降順でリストされます。特定の行列の切り捨て SVD では、指定された列数を持つ行列が生成されます。列数は、ユーザーが定義するか、ユーザー定義の許容しきい値を使用して実行時に決定されます。

各行列の近似値は、2つの低ランク行列の積 (例えば、低ランク積) として得ることもできます。

Ai = Pi * Qi

説明:

Pi = Ui * Si, Qi = ViT

行数が列数以上の場合、

Pi = Ui, Qi = Si` *ViT

が返ります。

このルーチンは、切り捨て SVD を計算する 3 つの方法を提供します。

  1. 入力配列 rank を使用して切り捨て SVD を計算します。rank[i] は、各行列 Ai のパラメーター UiViSi で計算される特異値とベクトルの数を指定します。

  2. 許容されるしきい値を使用して切り捨て SVD を計算します。SVD を計算する際、ユーザー定義の許容値より小さい特異値はゼロとして扱われ、ゼロに設定されます。

  3. 有効ランクを使用して切り捨て SVD を計算します。有効ランクは、ユーザー定義の許容されるしきい値と最大特異値の積よりも小さい特異値をゼロとして扱うことによって決定されます。

このルーチンは特異値のみを計算する場合にも使用できます。

API#

構文#

namespace oneapi::mkl::lapack { 
  void gesvda_batch(sycl::queue &queue, 
  int64_t *iparm, 
  int64_t *irank, 
  int64_t m, 
  int64_t n, 
  T *a, 
  int64_t lda, 
  int64_t stride_a, 
  RealT *s, 
  int64_t stride_s, 
  T * u, 
  int64_t ldu, 
  int64_t stride_u, 
  T * vt, 
  int64_t ldvt, 
  int64_t stride_vt, 
  RealT tolerance, 
  RealT *residual, 
  int64_t batch_size, 
  T *scratchpad, 
  int64_t scratchpad_size, 
  const std::vector<sycl::event> &events = {}) 
}

gesvda_batch は次の精度とデバイスをサポートしています。

T

デバイスサポート

float

CPU、GPU*

double

CPU、GPU*

std::complex<float>

CPU、GPU*

std::complex<double>

CPU、GPU*

*インターフェイスのサポートのみ。すべての計算は CPU 上で実行されます。

入力パラメーター#

queue

計算が実行されるデバイスキュー。

iparm

切り捨て SVD を計算するオプションを指定する 16 次元の配列。また、返される SVD 分解形式のタイプも指定します。以下の表では、iparm パラメーターの個々のコンポーネントをすべて説明しています。デフォルト値はアスタリスク (*) で示されます。注: iparm[4]-iparm[15] は将来のために予約されています。

コンポーネントの説明

iparm[0] は特異値をゼロとして扱う基準を指定します

iparm[0]=-1 の場合、デフォルトの iparm 値 (iparm[0-2]=0, iparm[3]=1) が使用されます

iparm[0]=0* の場合、切り捨て SVD は入力配列 irank を使用して計算されます

iparm[0]=1 の場合、切り捨て SVD はパラメーター tolerance を使用して計算されます

iparm[0]=2 の場合、切り捨て SVD は実効ランクを使用して計算されます。有効ランクは、ユーザー定義の許容されるしきい値と最大特異値の積よりも小さい特異値をゼロとして扱うことによって決定されます。

iparm[1] は特異ベクトルを計算するオプションを指定します

iparm[1]=0* の場合、特異値と特異ベクトルの両方が計算されます

iparm[1]=1 の場合、特異値のみが計算されます

iparm[2] は返される SVD 分解のタイプを指定します

iparm[2]=0* の場合、切り捨て SVD は 3 つの行列の積となります

Ai = Ui * Si * ViT

が計算されます。

iparm[2]=1 の場合、切り捨てられた a は低ランクの積となり、

Ai = Pi * Qi

が計算されます。

iparm[3] は残差はベクトルを計算するオプションを指定します

iparm[2]=0 の場合、残差ベクトルは計算されません

iparm[2]=1* の場合、残差ベクトルは計算されません

irank

iparm[0]=0 または iparm[0]=-1 の場合、要素 irank[i] は、各行列 Ai について Ui, ViT および Si で計算される特異値および/または特異ベクトルの数を指定します。

m

行列 Ai の行数 。

n

行列 Ai の列数 。

a

入力行列 Ai を保持する配列。

lda

a の先頭次元; max(1, m) 以上である必要があります。

stride_a

バッチ配列 a 内の行列 Ai の先頭間のストライド。max(1, lda * n) 以上である必要があります。

stride_s

配列 s 内の行列 Si の先頭間のストライド。min(m,n) 以上である必要があります。

ldu

Ui の先頭次元; max(1, m) 以上である必要があります。

stride_u

バッチ配列 u 内の行列 Ui の先頭間のストライド。max(1, ldu * m) 以上である必要があります。

ldvt

ViT の先頭次元。max(1, n) 以上である必要があります。

stride_vt

バッチ配列 ViT 内の行列 vt の先頭間のストライド。max(1, ldvt * n) 以上である必要があります。

tolerance

許容されるしきい値を指定します。これは、iparm[0]=1 および iparm[0]=2 の場合にのみ、切り捨て SVD の計算に使用されます。それ以外では使用されません。

batch_size

バッチ内の問題数。

scratchpad

ルーチンが中間結果を保存するスクラッチパッド・メモリー。

scratchpad_size

T タイプの浮動小数点要素数のスクラッチパッド・メモリーのサイズ。サイズは、gesvda_batch_scratchpad_size (ストライドバージョン) 関数が返す値よりも小さくてはなりません。

出力パラメーター#

irank

iparm[0]=-1 または iparm[0]=0 の場合、要素 irank[i] は行列 Ai の計算された特異値および/または特異ベクトルの数です。

a

残差ベクトルが不要な場合、終了時に変更されません。それ以外の場合は残差行列を含みます

iparm[2]=0 の場合、Ai - Ui * Si * ViT で、

iparm[2]=1 の場合、Ai - Pi * Qi

s

特異値 Si のバッチを格納するサイズ min(m,n)*batch_size の配列。

u

u は、iparm[2]=0 の場合は Ui のバッチを格納し、iparm[2]=1 の場合は Pi のバッチを格納する、stride_u*batch_size 以上のサイズの配列です。

vt

vt は、iparm[2]=0 の場合は ViT のバッチを格納し、iparm[2]=1 の場合は Qi のバッチを格納する、stride_vt*batch_size 以上のサイズの配列です。

residual

batch_size 次元の配列。iparm[3]=1 の場合、residual[i] は行列のフロベニウス・ノルムです:

|| Ai - Ui * Si * ViT ||

iparm[2]=0 の場合、および

|| Ai - Pi * Qi ||

iparm[2]=1 の場合。

例外#

例外

説明

mkl::lapack::batch_exception

この例外は、計算中に問題が発生した場合にスローされます。例外オブジェクトの info() メソッドを使用して、問題の情報コードを取得できます。

info = -n の場合、n 番目のパラメーターの値が不正です。

info = 1 の場合、内部メモリーの割り当てに失敗しました。

info = 2 の場合、入力パラメーターに無効な値が含まれています。

info = 3 の場合、特異値の計算中にアルゴリズムにエラーが発生しました。

info = 4 の場合、ルーチンは空の構造体または行列配列を検出しました。

戻り値#

計算が完了したことを確認するために待機する出力イベント。