インテル® MKL 10.3 で追加された新機能
この記事は、インテル® ソフトウェア・ネットワークに掲載されている「What’s new in Intel® MKL?」の日本語参考訳 (一部編集含む) です。
インテル® MKL 10.3 では主に次の機能が追加されました。
- インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) の最適化
- サマリー統計ライブラリー (別ページを開きます)
- 強化された MKL の C 言語サポート: LAPACK への C インターフェイス と PARDISO で C 形式の 0 ベースの配列インデックスをサポート
- Windows* でインテル® MKL のダイナミック・インターフェイスを使用する
- VML のルーチンレベルのモード制御
- 行列-ベクトル積を計算する新しい BLAS ルーチン
- ベクトルの線形部分変換を行う新しいルーチン
- インテル® MKL パッケージの新しいディレクトリー階層
- インテル® MKL のデータ適合コンポーネント
詳細は下記をご覧ください。
インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) の最適化
インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) は、第二世代インテル® Core™ プロセッサー・ファミリーに搭載された新しい拡張命令です。新しいインテル® アーキテクチャーでより優れたパフォーマンスが得られるように、インテル® AVX の最適化がより多くの MKL 関数に拡張されました。
インテル® MKL ではバージョン 10.2 からインテル® AVX の最適化に対応してきましたが、バージョン 10.2 でインテル® AVX コードを有効にするには mkl_enable_instructions() を使用する必要がありました。インテル® MKL 10.3 以降のバージョンでは、インテル® AVX コードが自動でディスパッチされるため、この処理は必要ありません。インテル® MKL 10.3 では、インテル® AVX の最適化サポートが DGEMM/SGEMM、基数 2 の複素-複素 FFT、ほとんどの実数 VML 関数、VSL 分布ジェネレーターに拡張されています。
インテル® Xeon® プロセッサー 6000 系および 7000 系 (サーバー) と比較して、インテル® AVX 対応オペレーティング・システムを実行するインテル® AVX 対応プロセッサーでインテル® MKL 10.3 の達成可能なスピードアップは次のとおりです。
インテル® AVX の DGEMM (M、N、K=8Kx4Kx128) は、インテル® Xeon® プロセッサー 6000 系および 7000 系 (サーバー) よりも 1.8 倍高速。
インテル® AVX の DGEMM/SGEMM は、ピーク性能の 88 ~ 90% を達成。
基数 2 の 1D クラスター FFT で N=1024 の場合、インテル® AVX/NHM は 1.8 倍高速。
インテル® AVX の最適化を使用したインテル® Optimized LINPACK Benchmark は、4 コア、N=20000 の場合、1.86 倍高速 (または全体の効率が 80% を超える)。
LAPACK の C インターフェイス・サポート
インテル® MKL 10.3 では C サポートが拡張され、LAPACK ルーチンの C 言語インターフェイスが追加されました。
詳細は、「C interface to LAPACK」 (英語) を参照してください。
こちら からオンラインドキュメントと LAPACK の C サンプルをご利用になれます。
PARDISO の 0 ベースの配列インデックス
インテル® マス・カーネル・ライブラリー (インテル® MKL) は、提供される多くの関数で C と Fortran の両方のインターフェイスが用意されます。PARDISO ソルバーは、C と Fortran の両方からの呼び出しをサポートしていますが、これまでは (Fortran でより一般的な) 1 ベースの配列インデックスのみ利用できました。C 形式の配列インデックスに慣れ親しんでいる開発者向けに、インテル® MKL 10.3 では疎行列で 0 ベースのインデックスを使用できるようになりました。
疎行列の設定
デフォルトでは、直接法スパースソルバーは 1 ベースのインデックスを使用するため、0 ベースのインデックスを使用する場合は明示的に指定する必要があります。PARDISO では、iparm(35) (配列の 35番目の要素) を設定します。
iparm(35)= 0 => Fortran 形式: 最初の要素は 1 として参照される iparm(35)<>0 => C 形式: 最初の要素は 0 として参照される
これは C では iparm[34] になります。
このスパースソルバーへの DSS インターフェイスを使用する場合は、次のように指定します。
dss_create(handle, MKL_DSS_MSG_LVL_WARNING + MKL_DSS_TERM_LVL_ERROR + MKL_DSS_ZERO_BASED_INDEXING);
0 ベースのインデックスを使用すると、表示されるエラーやその他の出力メッセージで指定したインデックス形式が示されます。
実装の詳細
PARDISO と DSS で 0 ベースのインデックスは、対応する 1 ベースのインデックスの配列にコピーされます。配列が大きくメモリー容量が問題となる場合、メモリーの使用を増やさないように変換が必要になることがあります。
その他のリソース
インテル® MKL のサンプル・サブディレクトリーにあるソルバーのサンプルに C ソースコードのサンプルが追加されました。
Windows* でインテル® MKL のダイナミック・インターフェイスを使用する
インテル® マス・カーネル・ライブラリー (インテル® MKL) 10.3 から、Windows* 向けにダイナミック・ライブラリーが提供されるようになりました (*)。
これにより、インテル® MKL のインターフェイスとスレッドレイヤーを動的に選択することができます。ダイナミック・インターフェイスを使用するには、リンク行で “mkl_rt.lib” ライブラリーを指定するだけです。リンク行は、IA32 とインテル® 64 アーキテクチャーで同じです。
次のように指定します:
icl.exe test.cpp mkl_rt.lib
説明:
mkl_rt.lib は、(IA-32 とインテル® 64 アーキテクチャーで) リンクに使用するダイナミック・インターフェイス・ライブラリーです。IA-32 とインテル® 64 アーキテクチャーの対応するダイナミック・ライブラリーは mkl_rt.dll です。
現在の実装には 1 つ例外があり、ScaLAPACK 機能は mkl_rt.dll に含まれていません。
スレッドレイヤーの設定:
スレッドレイヤーは、環境変数 MKL_THREADING_LAYER または関数 MKL_Set_Threading_Layer(int code) の値に応じて、ランタイムに選択されます。
環境変数 MKL_THREADING_LAYER に設定可能な値は INTEL、SEQUENTIAL、または PGI です。
MKL_Set_Interface_Layer 関数は、ほかのすべての関数呼び出しの前で呼び出す必要があります。この関数が呼び出されると、環境変数は無視されます。
デフォルトの動作はインテルのスレッドレイヤーを使用します。
関数の宣言:
int MKL_Set_Threading_Layer(int code)
変数に設定可能な値:
#define MKL_THREADING_INTEL 0
#define MKL_THREADING_SEQUENTIAL 1
#define MKL_THREADING_PGI 2
エントリーポイント (**):
int mkl_set_threading_layer(int* code)
int mkl_set_threading_layer_(int* code)
int MKL_SET_THREADING_LAYER(int* code)
環境変数 MKL_THREADING_LAYER に設定可能な値は INTEL、SEQUENTIAL、または PGI です。
インターフェイス・レイヤーの設定:
利用可能なインターフェイスは、システムのアーキテクチャーに依存します。
インテル® 64 ベースの Windows* システムでは、環境変数 MKL_INTERFACE_LAYER または関数 MKL_Set_Interface_Layer の値に応じて、インターフェイス・レイヤーがランタイムに選択されます。
MKL_Set_Interface_Layer 関数は、ほかのすべての関数呼び出しの前で呼び出す必要があります。この関数が呼び出されると、環境変数は無視されます。
デフォルトの動作は LP64 インターフェイスと同じです。
関数の宣言:
int MKL_Set_Interface_Layer(int code)
変数に設定可能な値:
#define MKL_INTERFACE_LP64 0
#define MKL_INTERFACE_ILP64 1
エントリーポイント (**):
int mkl_set_interface_layer(int* code)
int mkl_set_interface_layer_(int* code)
int MKL_SET_INTERFACE_LAYER(int* code)
環境変数 MKL_INTERFACE_LAYER に設定可能な値は LP64 または ILP64 です。
注:
(*) — このダイナミック・インターフェイスは Windows* でのみ利用できます。
(**) — Windows* のダイナミック・インターフェイスに関連するものは mkl_service.h ヘッダーファイルで定義されています。
VML のルーチンレベルのモード制御
インテル® マス・カーネル・ライブラリー (インテル® MKL) 10.3 から、VML API が拡張され、ルーチンレベルのモード制御が追加されました。
そのため、次のように、VML の数学関数およびパック/アンパック関数の名前が新しい形式に変更されました。
v[m]>
最初の文字 v は、VML 関数であることを示す接頭辞です。
[m] フィールドは、数学関数のオプションの接頭辞で、関数呼び出しで VML モードを指定するための追加の引数を示します (設定可能な値とその説明は、『インテル® MKL リファレンス・マニュアル』の「vmlSetMode」を参照してください)。> フィールドは、データ型を示す接頭辞で、設定可能な文字は次のとおりです。
s REAL (Fortran インターフェイス)、float (C インターフェイス)
d DOUBLE PRECISION (Fortran インターフェイス)、double (C インターフェイス)
c COMPLEX (Fortran インターフェイス)、MKL_Complex8 (C インターフェイス)
z DOUBLE COMPLEX (Fortran インターフェイス)、MKL_Complex16 (C インターフェイス)
i 正数のインクリメント
v インテックス・ベクトル
m マスクベクトル
アプリケーションから VML 関数を呼び出すには、従来の形式を使用します。例えば、単精度実数型の VML 指数関数は次のように呼び出します。
call vsexp ( n, a, y ) – Fortran インターフェイス
call vmsexp ( n, a, y, mode ) – Fortran インターフェイスでモードを指定する場合
vsExp ( n, a, y ); – C インターフェイス
vmsExp ( n, a, y, mode ); – C インターフェイスでモードを指定する場合
例:
インテル® MKL の exp 関数について見てみましょう。以下に、ベータ版インテル® MKL 10.3 とそれ以前のバージョンの関数の命名規則と呼び出しの違いを示します。
インテル® MKL 10.2 以前の VML exp 関数と sin 関数の呼び出し:
vdExp(const MKL_INT n, const double a[], double r[])
vdExp(const MKL_INT n, const double r[], double r[])
精度を指定するには、別途、精度引数を指定して vmlSetMode() 関数を呼び出す必要があります。
vmlSetMode(VML_LA); /* 低い精度を指定 */
vdExp(1000, a, r);
vmlSetMode(VML_HA); /* 高い精度を指定 */
vdSin(1000, r, r);
インテル® MKL 10.3 以降の VML exp 関数と sin 関数の呼び出し:
vmdExp(const MKL_INT n, const double a[], double r[], MKL_INT64 mode)
vmdSin(const MKL_INT n, const double r[], double r[], MKL_INT64 mode)
精度を指定するには、関数を呼び出すときに精度を引数として渡すだけで済みます。
vmdExp(1000, a, r, VML_LA);
vmdSin(1000, r, r, VML_HA);
注: インテル® MKL 10.3 以降は、どちらの形式もサポートしています。
行列-ベクトル積を計算する新しい BLAS ルーチン
インテル® マス・カーネル・ライブラリー (インテル® MKL) 10.3 から、密行列の 2 つの行列-ベクトル積を計算する BLAS レベル 2 ルーチンが利用できるようになりました。このルーチンは、インテル® MKL のすべてのデータ型 (単精度/倍精度、単精度複素数、倍精度複素数) をサポートします。
現在の実装では、FORTRAN 77 および FORTRAN 95 インターフェイスのみサポートしています。
以下に、倍精度データ型の Fortran77 構文を示します。
call dgem2vu(m, n, alpha, a, lda, x1, incx1, x2, incx2, beta, y1, incy1, y2, incy2);
y1 := alpha*A*x1 + beta*y1
および
y2 := alpha*A’*x2 + beta*y2
値の説明:
alpha と beta はスカラー
x1、x2、y1、および y2 はベクトル
A は m × n 行列
出力引数は y1 と y2 です。
do i = 1, M
B1(i) = B1(i) + A(i,j)*V1(j)
B2(j) = B2(j) + A(i,j)*V2(i)
end do
end do
ループで行列 A(i,j) の要素を再利用するため、DGEMV ルーチンを 2 回続けて呼び出したり、DSYMV ルーチンを呼び出すよりも、パフォーマンスが大幅に向上します。
以下に、DGEM2VU、DGEMV (2 回続けて呼び出した場合)、DSYMV のパフォーマンスの比較結果を示します。

ベクトルの線形部分変換を行う新しいルーチン
インテル® マス・カーネル・ライブラリー (インテル® MKL) 10.3 で、新しい v?LinearFrac 関数が追加されました。この関数は、スカラー引数を使用して、ベクトル a とベクトル b の線形部分変換を行います。乗数 scalea と scaleb をスケーリングし、加数 shifta と shiftb をシフトします。
y[i]=(scalea·a[i]+shifta)/(scaleb·b[i]+shiftb), i=1,2 … n
インテル® MKL 10.3 では現在、v?LinearFrac 関数は extended 精度モードでのみ実装されるため、この関数に対して特定な値は定義されていません。計算結果の正当性は、各入力引数で定義されているしきい値の範囲内で保証されます。
単精度および倍精度の v?LinearFrac 関数の FORTRAN および C サンプルコードは、<インテル® MKL 10.3 のインストール・ディレクトリー>/examples/ ディレクトリーにあります。
詳細は、『インテル® MKL リファレンス・マニュアル』を参照してください。
インテル® MKL パッケージの新しいディレクトリー階層
インテル® マス・カーネル・ライブラリー (インテル® MKL) は、スタンドアロン製品として、またはインテル® コンパイラー・プロフェッショナル・エディションのコンポーネントとして利用できます。インテル® MKL 10.3 では、この 2 つの統合を簡略化するため、新しいディレクトリー階層に変更されました。変更点を以下に示します。
- スタンドアロンのインテル® MKL とインテル® コンパイラー・プロフェッショナル・エディションのコンポーネントであるインテル® MKL のディレクトリー階層が同じになりました。
- 従来の “em64t” ディレクトリーは “intel64” ディレクトリーに変更されました。
- インテル® MKL のダイナミック・ライブラリー (Windows* 用) は、”ComposerXE-2011\redist” ディレクトリーにあります。
- インテル® MKL のインテル® コンパイラー・ランタイム・ライブラリーと OpenMP* ライブラリーは、インテル® コンパイラーとの共有コンポーネントです。これらのファイルは “ComposerXE-2011\compiler” ディレクトリーにあります。
- インテル® MKL のドキュメントは “ComposerXE-2011\Documentation” ディレクトリーにあります。
- IA64 ディレクトリーはありません。インテル® Itanium® (IA-64) アーキテクチャーのサポートは、このリリースには含まれていません。
以下は、インテル® MKL のディレクトリー構造を示しています。
インテル® MKL のデータ適合コンポーネント
インテル® マス・カーネル・ライブラリー (インテル® MKL) 10.3 Update 8 では、データ適合コンポーネントが追加されました。インテル® MKL のデータ適合関数は、スプラインの構築 (線形、立方、平方など)、近似関数、導関数、積分関数、セルの検索に使用できる、スプラインベースの補間機能を提供します。
詳細は、トレーニング資料 (英語) を参照してください。
注:
1. インテル® MKL 10.3 Update 8 は 1D データ適合コンポーネントをサポートしています。
2. インテル® MKL 10.3 Update 8 のデータ適合コンポーネントは PGI* Fortran コンパイラーをサポートしていません。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。