バーゼル大学 (UB: Universität Basel) が提供する PARDISO* とインテル® MKL の PARDISO API における相違点の概要

インテル® oneMKL
この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Summary of the API differences between University of Basel (UB) PARDISO* and Intel® MKL PARDISO」(http://software.intel.com/en-us/articles/summary-of-the-api-differences-between-university-of-basel-ub-pardiso-and-intel-mkl-pardiso/) の日本語参考訳です。

バーゼル大学 (UB: Universität Basel) からリリースされた PARDISO* 4.0 は、インテル® マス・カーネル・ライブラリー (インテル® MKL) 10.3 以前の PARDISO と下位互換性がないため、インテル® MKL で利用可能な PARDISO の実装とは一部の API の互換性がありません。この記事では、2 つのインターフェイスの相違点を、インターフェイス、機能、エラーの面から表にまとめています。ここでは、UB PARDISO* (http://pardiso-project.org/) とインテル® MKL PARDISO のオンライン・ドキュメントのみを基に比較した結果を紹介しています。 この記事には、次の内容が含まれます。
  • 表 1 – 外部関数の相違点
  • 表 2 – UB PARDISO* 4.0 以上およびインテル® MKL 10.3 以上でサポートされている機能
  • 表 3 – iparm の入出力値の説明
  • 表 4 – 出力エラーの相違点
注: UB PARDISO* とインテル® MKL PARDISO の機能およびインターフェイスはバージョンにより異なるため、比較する際にはそれぞれのバージョンを正確に把握することが重要です。
IA-64 システムの場合: インテル® MKL 10.3 は、IA-64 ベースのシステムをサポートしていません。IA-64 システムを使用している場合は、インテル® MKL 10.3 と同じ機能 (ただし、入力データにおけるゼロベースの配列インデックスのサポートは除く) を備えたインテル® MKL 10.2.7 をお使いください。

表 1: インターフェイスの相違点

機能の説明 UB PARDISO* MKL PARDISO
  メインルーチン、 C および Fortran インターフェイス C: PARDISO (pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &perm, &nrhs, iparm, &msglvl, b, x, &error, &dparm); double dparm [64];   Fortran: pardiso (pt, maxfct, mnum, mtype, phase, n, a, ia, ja, perm, nrhs, iparm, msglvl, b, x, error ,dparm) REAL*8 dparm(64) dparm は UB 4.0.0 以上に追加 C: PARDISO (pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &perm, &nrhs, iparm, &msglvl, b, x, &error);   Fortran: pardiso (pt, maxfct, mnum, mtype, phase, n, a, ia, ja, perm, nrhs, iparm, msglvl, b, x, error)
  DSS インターフェイス (一般的な機能を提供する単純な PARDISO インターフェイス)
サポートされていません。
C、Fortran:  dss_create(handle, opt ); dss_define_structure(handle, opt, rowIndex, nRows, nCols, columns, nNonZeros); dss_reorder(handle, opt, perm); dss_factor_real(handle, opt, rValues ); dss_factor_complex(handle, opt, cValues); dss_solve_real(handle, opt, rRhsValues, nRhs, rSolValues); dss_solve_complex(handle, opt, cRhsValues, nRhs, cSolValues); dss_delete(handle, opt); dss_statistics(handle, opt, statArr, retValues); mkl_cvt_to_null_terminated_str (destStr, destLen, srcStr); インテル® MKL 10.3 以上で実装
  ILP64 サポート (すべての整数データは integer*8 として定義される)
サポートされていません。
C: pardiso_64 (pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &perm, &nrhs, iparm, &msglvl, b, x, &error);   Fortran: pardiso_64 (pt, maxfct, mnum, mtype, phase, n, a, ia, ja, perm, nrhs, iparm, msglvl, b, x, error)   インテル® MKL 10.3 以上で実装 
  外部関数による PARDISO 環境の制御
サポートされていません。
pardiso_setenv(); pardiso_getenv();   インテル® MKL 10.3 以上で実装
  PARDISO の初期ステップでのデフォルト値の設定 pardisoinit(pt, mtype, solver, iparm, dparm, error); UB PARDISO* 4.0.0 以上で実装  pardisoinit(pt, mtype, iparm); インテル® MKL 10.3 Update 5 以上で実装
  ユーザーデータの確認と PARDISO 統計の出力 pardiso_chkmatrix() pardiso_chkvec() pardiso_printstats() UB 4.1.2 以上で実装  サポートされていません。 インテル® MKL 10.3 以上で iparm スイッチによる行列チェッカーを実装

表 2: UB PARDISO 4.0.0 以上およびインテル® MKL 10.3 以上で統合された機能

機能名 UB PARDISO* 4.0.0 以上 MKL PARDISO (インテル® MKL 10.3 以上)
  ILP64 サポート (すべての整数データは integer*8 として定義される) により、大規模な線形代数方程式の解を算出 サポートされていません。   サポートされています。
  転置/共役行列で表される問題の解の算出   サポートされています。   インテル® MKL 10.3 Update 5 以上でサポートされています。
  2 段階の並列因数分解   サポートされています。UB PARDISO 4.1.2 以上では完全にサポートされています。   サポートされています。
  並列に解を算出   サポートされています。   インテル® MKL 10.3 Update 5 以上でサポートされています。
  順方向/逆方向算出の分割   (iparm(26) で) サポートされています。   (phase=331,332,333 で) サポートされています。
入力データにおけるゼロベースの配列インデックスのサポート サポートされていません。   サポートされています (10.2.6 を除く)。
  スーパーノードのサイズの制御   サポートされています。 サポートされていません。
  右辺と解がスパースの場合の部分解   右辺 (rhs) と解がスパースの場合のみサポートされています。 サポートされています。  多くのオプションを利用できます:右辺 (rhs) と解がスパースの場合、rhs がスパースで解が密の場合、rhs が密で解がスパースの場合 (インテル® MKL 10.3 Update 3 以上)。
  PARDISO のクラスターサポート   対称不定値行列のサポート (UB PARDISO* 4.1.2 以上)
サポートされていません。
  PARDISO のアウトオブコア・サポート(ハードディスクを使用して RAM に収まらない大規模行列で表された問題の解を算出)
サポートされていません。
  サポートされています。
  再帰的反復線形ソルバー   サポートされています。 サポートされていません。代わりに、OOC モードを使用してください。
実対称不定値行列の行列式 サポートされています。 サポートされていません。
プロセッサー数に関係なく解が同じになる サポートされています。 サポートされていません。
ユーザーにより入力された行列の正当性チェック 追加の関数によりサポートされています (UB PARDISO* 4.1.2 以上)。  iparm(27) スイッチによりサポートされています。

表 3: IPARM の入出力値の相違点

C/Fortran の iparm の入力値 UB PARDISO* 4.0.0 以上 MKL PARDISO (インテル® MKL 10.3 以上)
iparm[1]/iparm(2) =0、最小次数アルゴリズムが適用されます。  =2、入れ子アルゴリズムが適用されます。 =0、最小次数アルゴリズムが適用されます。  =2、入れ子アルゴリズムが適用されます。 =3、並列入れ子アルゴリズムが適用されます。
iparm[2]/iparm(3) プロセッサー数。 使用されていません (計算スレッド数の設定には、MKL 環境変数 MKL_NUM_THREADS が使用されます)。
iparm[11]/iparm(12) =0、Ax=b の解を算出します。  =1、ATx=b の解を算出します。 =0、Ax=b の解を算出します。  =1、ATx=b の解を算出します。 =2、A*x=b の解を算出します。 (インテル® MKL 10.3 Update 5 以上)
iparm[16]/iparm(17) 因数分解と解のフェーズで必要なメモリー。フェーズ 22 の後に返されます。 因数分解と解のフェーズで必要なメモリー。フェーズ 22 の後に返されます。  注: インテル® MKL 10.3 Update 5 以上では、このパラメーターはフェーズ 11 で計算され、利用できるようになります。
iparm[23]/iparm(24) = 0、PARDISO は 1 レベルの因数分解アルゴリズムを使用します。  = 1、PARDISO は 2 レベルの因数分解アルゴリズムを使用します。 デフォルト値。 = 0、PARDISO は 1 レベルの因数分解アルゴリズムを使用します。デフォルト値。  = 1、PARDISO は 2 レベルの因数分解アルゴリズムを使用します。
iparm[24]/iparm(25) = 0、PARDISO は解の算出ステップに並列アルゴリズムを使用します。デフォルト値。  = 1、PARDISO は順方向、逆方向にシーケンシャルに解を算出します。 = 0、PARDISO は解の算出ステップに並列アルゴリズムを使用します。  = 1、PARDISO は順方向、逆方向にシーケンシャルに解を算出します。デフォルト値。 注: インテル® MKL 10.3 Update 5 以上で実装。
iparm[25]/iparm(26) 解の算出ステップを分割します。 使用されていません (解の算出ステップの分割は phase=331,332,333 で使われています)。 
iparm[26]/iparm(27) 使用されていません (UB PARDISO* 4.1.2 以上で外部関数 pardiso_chkmtrx による行列チェッカーを実装)。 = 0、行列チェッカーは無効にされています。  = 1、行列チェッカーは有効にされています。
iparm[27]/iparm(28) = 0、METIS* 再配置の逐次バージョンが使用されます。  = 1、METIS* 再配置の並列バージョンが使用されます。 = 0、PARDISO の倍精度バージョンが使用されます。  = 1、PARDISO の単精度バージョンが使用されます。 注: METIS* 再配置の逐次/並列バージョンは iparm[1]/iparm(2) により制御されます。
iparm[28]/iparm(29) = 0、因数分解の 64 ビット・バージョンが使用されます。  = 1、因数分解の 32 ビット・バージョンが使用されます。 使用されていません。 注: インテル® MKL PARDISO の単精度/倍精度バージョンは iparm[27]/iparm(28) により制御されます。このバージョンが、UB PARDISO* の因数分解の 32 ビット/64 ビット・バージョンの代わりに使用されます。
iparm[29]/iparm(30) PARDISO のスーパーノードの最大サイズを制御する入力パラメーター。 ゼロ/負のピボットの数を返す出力パラメーター。
iparm[30]/iparm(31) = 0、Ax=b の部分解の算出を無効にします。デフォルト値。  = 1、右辺はスパースであると仮定され、perm[i-1]/perm(i)=1 は右辺の i 番目のコンポーネントがゼロ以外であることを示し、解ベクトルのこのコンポーネントが計算されます。 = 0、Ax=b の部分解の算出を無効にします。デフォルト値。  = 1、右辺はスパースであると仮定され、perm[i-1]/perm(i)=1 は右辺の i 番目のコンポーネントがゼロ以外であることを示し、解ベクトルのこのコンポーネントが計算されます。 = 2、右辺はスパースであると仮定され、perm[i-1]/perm(i)=1 は右辺の i 番目のコンポーネントがゼロ以外であることを示し、解ベクトルのすべてのコンポーネントが計算されます。 = 3、右辺は任意の型です。perm[i-1]/perm(i)=1 の場合、解ベクトルの i 番目のコンポーネントが計算されます (オプション 3 はインテル® MKL 10.3 Update 3 以上でサポートされています)。
iparm[31]/iparm(32) =0、再帰反復アルゴリズムは無効にされています。=1、再帰反復アルゴリズムは有効にされています。 使用されていません。
iparm[32]/iparm(33) 入力: =1、実対称不定値行列の行列式を計算し、その結果を dparm(33)/ dparm[32] で返します。出力: パラメーターは、実対称不定値行列の行列式の自然対数を返します。 使用されていません。
iparm[33]/iparm(34) = 0、プロセッサー数に関係なく同じ解を算出するオプションは無効にされています。  = 1、プロセッサー数に関係なく同じ解を算出するオプションは有効にされています。 使用されていません。
iparm[34]/iparm(35) 使用されていません。 = 0、1 ベースの配列インデックス。列と行のインデックスは ia、ja、perm は 1 から始まります。  デフォルト値。 = 1、ゼロベースの配列インデックス。列と行のインデックスは ia、ja、perm は 0 から始まります。
iparm[50]/iparm(51) 並列分散メモリーソルバーを使用します。 使用されていません。
iparm[51]/iparm(52) 並列分散メモリーソルバーの計算ノード数。 使用されていません。
iparm[59]/iparm(60) 使用されていません。 = 0、インコア PARDISO が使用されます。  = 1、行列の因数を格納するのに必要なメモリーの合計が環境変数 MKL_PARDISO_OOC_MAX_CORE_SIZE と MKL_PARDISO_OOC_MAX_SWAP_SIZE の合計よりも小さい場合、インコア PARDISO が使用されます。そうでない場合、アウトオブコア (OOC) PARDISO が使用されます。 = 2、アウトオブコア (OOC) PARDISO が使用されます。OOC PARDISO は、行列の因数をディスク上のファイルに保存することで、非常に大きな問題を解くことができます。そのため、OOC PARDISO では RAM の使用量が大幅に軽減されます。
iparm[60]/iparm(61) 使用されていません。 解析および因数分解フェーズのピークメモリー総量を返す出力パラメーター。 インテル® MKL 10.3 Update 5 以上では使用されていません。 
iparm[61]/iparm(62) 使用されていません。 解析および因数分解フェーズで消費された倍精度のメモリー総量を返す出力パラメーター。 インテル® MKL 10.3 Update 5 以上では使用されていません。 
iparm[62]/iparm(63) 使用されていません。 OOC PARDISO で内部浮動小数点配列に必要な最小メモリー量を返す出力パラメーター。このパラメーターはフェーズ 1 で計算されます。

表 4: 出力されるエラー値の相違点

エラー値 UB PARDISO* インテル® MKL PARDISO
-9 使用されていません。 OOC に必要な十分なメモリーがありません。
-10 ライセンスファイル pardiso.lic が見つかりません。 OOC 一時ファイルを開けません。
-11  ライセンスが失効しています。 OOC データファイルの読み取り/書き込みを行うことができません。
-12  ユーザー名またはホスト名が正しくありません。 使用されていません。
-100  反復ソルバーは、クリロフ部分空間反復の最大数に達しました。 使用されていません。
-101 25 回のクリロフ部分空間反復では十分に収束していません。 使用されていません。
-102 クリロフ部分空間反復のエラーです。 使用されていません。
-103 クリロフ部分空間反復で問題が発生しました。 使用されていません。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました