インテル(R) マス・カーネル・ライブラリ (インテル® MKL) 8.0 Linux* 版
テクニカル・ユーザー・ノート

目次

目的
サポートするコンパイラ
インテル® MKL の並列化の使用
メモリー管理
パフォーマンス
構成ファイル
バージョン情報の取得
カスタム共有オブジェクト・ビルダ
FFT 関数と DFT 関数
テクニカル・サポート
著作権/法律に基づく表示

 
 

目的

本書は、インテル® マス・カーネル・ライブラリ (インテル® MKL) 8.0 Linux* 版を使用してコンパイル、リンク、および実行する方法について説明します。本書を「インテル® MKL 8.0 Linux* 版リリースノート」 および「インテル® MKL 8.0 Linux* 版入門ガイド」と併用し、インテル MKL 8.0 Windows 版をアプリケーションで活用する方法を参照してください。

サポートするコンパイラ

インテル® MKL では、リリースノートに記載されているコンパイラのみがサポートされています。他のコンパイラでも正常に動作するものがありますが、リリースノートに記載されていないコンパイラは正式にサポートされていません。

CBLAS インターフェイスを使用すると、ヘッダファイル mkl.h が列挙値およびすべての関数のプロトタイプを指定するため、プログラムの開発を簡素化できます。ヘッダは、プログラムを C++ コンパイラでコンパイルするかどうかを決定します。C++ でコンパイルする場合、あわせてインクルード・ファイルが修正されます。

インテル® MKL の並列化の使用

インテル® MKL は、スパースソルバ、LAPACK (*GETRF、*POTRF、*GBTRF、*GEQRF、*ORMQR、DSTEQR ルーチン)、すべてのレベル 3 BLAS、すべての DFT (DFTI_NUMBER_OF_TRANSFORMS=1 でサイズが 2 のべき乗でない場合、1D 変換は除く)、およびすべての FFT でスレッド化されています。ライブラリは OpenMP* スレッド化ソフトウェアを使用します。

インテル MKL でスレッドを使用すると、特定の実行環境で競合問題が発生することがあります。このような問題が発生した場合の解決方法を次にリストします。最初に、なぜこの問題が発生するかを説明します。

OpenMP ディレクティブを使用してプログラムをスレッド化し、インテル® コンパイラでプログラムをコンパイルした場合、インテル MKL とその作成されたプログラムは、どちらも同じスレッド化ライブラリを使用します。インテル MKL は、プログラムの並列領域に配置されているかどうかを判断して、並列領域に配置されている場合はマルチスレッド・モードで動作しません。ただし、インテル MKL は、スレッド化されたプログラムとインテル MKL が同じスレッド化ライブラリを使用している場合のみ、この判断を行うことができます。プログラムを他の方法でスレッド化した場合、インテル MKL はマルチスレッド・モードで動作し計算が正しく行われません。次にいくつかの例と解決方法を示します。

  1. OS スレッド (Linux では pthread、Windows* では Win32* スレッド) を使用してプログラムをスレッド化した場合。ライブラリが複数のスレッドで呼び出され、呼び出されている関数がスレッド化されている場合、インテル MKL のスレッド化をオフにする必要があります。環境変数 OMP_NUM_THREADS を 1 に設定してください。この設定はスパースソルバを除くインテル MKL のデフォルトです。
  2. OpenMP ディレクティブまたはプラグマを使用してプログラムをスレッド化し、インテル・コンパイラ以外のコンパイラを使用してコンパイルした場合。OMP_NUM_THREADS を設定すると、コンパイラのスレッド化ライブラリとインテル MKL のスレッド化ライブラリの両方に影響します。この場合、環境変数 MKL_SERIALYES に設定して、OMP_NUM_THREADS の値に関係なくライブラリを強制的にシリアルモードにします 。
  3. 各プロセッサが 1 ノードとして扱われる、MPI 通信を使用して並列化プログラムを実行するケースなど、複数のプログラムを複数の CPU が搭載されたシステムで実行する場合。スレッド化ソフトウェアは、各プロセッサで別々のプロセスが実行されていても、複数のプロセッサを参照できます。この場合、環境変数 OMP_NUM_THREADS を 1 に設定します。

スレッド数の設定: OpenMP ソフトウェアは環境変数 OMP_NUM_THREADS を使用します。スレッド数は、プログラムを実行するシェルで設定することができます。スレッド数を変更するには、プログラムを実行するコマンドシェルで次のコマンドを入力します。

export OMP_NUM_THREADS=<使用するスレッド数>

インテル MKL を強制的にシリアルモードにするには、環境変数 MKL_SERIALYES に設定します。この設定は OMP_NUM_THREADS の値に関係なく有効になります。MKL_SERIAL はデフォルトでは設定されていません。

OMP_NUM_THREADS が設定されていない場合、インテル MKL ソフトウェアはスレッド数を 1 として実行します。アプリケーションで使用するプロセッサの数を常に OMP_NUM_THREADS に設定することを推奨します。

注意: スパースソルバのデフォルトのスレッド数は、システムのプロセッサ数になります。

メモリー管理

インテル® MKL には、ライブラリ関数が使用するメモリーバッファを制御するメモリー管理ソフトウェアが含まれています。インテル MKL 関数 (レベル 3 BLAS または DFT にある関数など) を呼び出すと、フリーバッファがない場合、新規のバッファが割り当てられます。このバッファの割り当てはプログラムを終了するまで解放されません。プログラムの実行中にフリーメモリーが必要になった場合は、MKL_FreeBuffers() を呼び出します。メモリーバッファが必要なライブラリ関数が再び呼び出された場合、メモリー・マネージャは再度バッファを割り当てます。このバッファもプログラムが終了するまで、またはメモリーの割り当てが解除されるまで割り当てられたままになります。

メモリー管理ソフトウェアは、デフォルトで有効です。無効にするには、環境変数 MKL_DISABLE_FAST_MM に任意の値を設定して、呼び出しと呼び出しの間にメモリーが解放されるようにします。この機能を無効にすると、特にプログラムのサイズが小さい場合、レベル 3 BLAS などのルーチンのパフォーマンスに影響します。

メモリー管理では、各スレッドに割り当てられるバッファの数に制限があります。現在は、この数は 32 です。サポートされているスレッドの最大数は、514 です。このデフォルト制限を回避するには、メモリー管理を無効にしてください。

パフォーマンス

インテル® MKL で最高レベルのパフォーマンスを得るために、次の条件が満たされているかどうかを確認してください。

LAPACK 圧縮ルーチンのパフォーマンスについての注意:

行列のタイプや格納位置 (2 番目と 3 番目の文字) に HP、OP、PP、SP、TP、UP という文字を含む名前のルーチンは、行列上で圧縮形式で動作します (インテル MKL のマニュアルで「LAPACK ルーチン命名規則」のセクションを参照してください。)。これらのルーチンの機能は、対応する位置にある HE、OR、PO、SY、TR、UN という文字を含むアンパック・ルーチンの機能とまったく同じですが、パフォーマンスは大幅に低下します。
メモリー制限がそれほど厳しくない場合は、より高いパフォーマンスを得るためにアンパック・ルーチンを使用してください。その場合、それぞれの圧縮ルーチンで必要なメモリーよりも N2/2 多いメモリーを割り当てる必要があります。N は問題のサイズ (方程式の数) です。

例えば、対称固有値問題を高度ドライバで解く場合、アンパック・ルーチンを使用すると速度が向上します。
call dsyevx(jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info),
a は次元 lda × n で少なくとも N2 要素です。次のルーチンの代わりに使用します。
call dspevx(jobz, range, uplo, n, ap, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info),
ap は次元 N*(N+1)/2 です。

FFT 関数には次のような条件もあります。

IA-32 ベース・アプリケーション: 配列の最初の要素のアドレスと 2 次元配列のリーディング・ディメンジョン値、バイト単位の (n*element_size) が、キャッシュ・ラインのサイズ (インテル® Pentium® III プロセッサの場合は 32 バイト、インテル Pentium 4 プロセッサの場合は 64 バイト、インテル® EM64T 対応プロセッサの場合は128 バイト) で割り切れなければなりません。
Itanium® ベース・アプリケーション: 条件は次のとおりです。
- C スタイルの FFT の場合、実数部と虚数部を表す配列間の距離 L が 64 で割り切れること。最適な条件は、L=k*64 + 16 です。
- 2 次元配列のリーディング・ディメンジョンの値、バイト単位の (n*element_size) が 2 のべき乗でないこと。

構成ファイル

インテル® MKL 構成ファイルでは、次の MKL の機能をカスタマイズすることができます。

デフォルトでは、構成ファイルは mkl.cfg ファイルです。このファイルには、変更可能な複数の変数が含まれています。次に、すべての変数とそのデフォルト値を含む構成ファイルの例を示します。

//
// Default values for mkl.cfg file
//
// SO names for IA-32
MKL_X87so = mkl_def.so
MKL_SSE1so = mkl_p3.so
MKL_SSE2so = mkl_p4.so
MKL_SSE3so = mkl_p4p.so
MKL_VML_X87so = mkl_vml_def.so
MKL_VML_SSE1so = mkl_vml_p3.so
MKL_VML_SSE2so = mkl_vml_p4.so
MKL_VML_SSE3so = mkl_vml_p4p.so
// SO names for Intel® EM64T
MKL_EM64TDEFso = mkl_def.so
MKL_EM64TSSE3so = mkl_p4n.so
MKL_VML_EM64TDEFso = mkl_vml_def.so
MKL_VML_EM64TSSE3so = mkl_vml_p4n.so
// SO names for Intel® Itanium® processor family
MKL_I2Pso = mkl_i2p.so
MKL_VML_I2Pso = mkl_vml_i2p.so
// DLL names for LAPACK libraries
MKL_LAPACK32so = mkl_lapack32.so
MKL_LAPACK64so = mkl_lapack64.so
// Serial or parallel mode
//     YES - single threaded
//     NO - multi threaded
//     OMP - control by OMP_NUM_THREADS
MKL_SERIAL = YES
// Input parameters check
//     ON - checkers are used (default)
//     OFF - checkers are not used
MKL_INPUT_CHECK = ON

MKL 関数が最初に呼び出されたとき、インテル MKL は構成ファイルが存在するかどうかを確認して、存在する場合は構成ファイルの内容に従って動作します。構成ファイルのパスは、環境変数 MKL_CFG_FILE で指定します。この変数が定義されていない場合、最初に現在のディレクトリが検索され、次に PATH 環境変数で指定されたディレクトリが検索されます。MKL 構成ファイルが存在しない場合、ライブラリは変数のデフォルト値を使用します (ライブラリの標準名、チェッカをオン、非スレッド化操作モード)。
構成ファイルで変数が指定されていない場合、または適切でない値が指定されている場合、デフォルト値が使用されます。

次に、ライブラリ名の再定義のみを含む構成ファイルの例を示します。

// SO redefinition
MKL_X87so = matlab_x87.so
MKL_SSE1so = matlab_sse1.so
MKL_SSE2so = matlab_sse2.so
MKL_SSE3so = matlab_sse2.so
MKL_ITPso = matlab_ipt.so
MKL_I2Pso = matlab_i2p.so

バージョン情報の取得

インテル® MKL には、ライブラリに関する情報 (バージョン番号など) を取得できる機能があります。これには、MKLGetVersionString 関数を使用してバージョン文字列を取得する方法と、MKLGetVersion 関数を使用してバージョン情報を含む MKLVersion 構造を取得する方法の 2 つの方法があります。examples\versionquery ディレクトリに、バージョン情報取得用のサンプル・プログラムがあります。例を自動的にビルドして、現在のライブラリのバージョン情報を含むサマリファイルを出力する makefile も提供されています。

カスタム共有オブジェクト・ビルダ

カスタム共有オブジェクト・ビルダは、選択した関数でのダイナミック・ライブラリの作成を目的とし、tools/builder フォルダに配置されています。ビルダには makefile および関数リストの定義ファイルが含まれます。makefile には、"ia32"、"ipf"、および "em64t" の 3 つのターゲットがあります。ia32 ターゲットは IA-32、ipf ターゲットはインテル® Itanium® プロセッサ・ファミリ、そして em64t ターゲットはインテル® EM64T 対応のインテル® Xeon(TM) プロセッサに使用します。
makefile には複数のマクロ (パラメータ) が含まれています。

export = functions_list
このマクロは、共有オブジェクトにインクルードされるエントリポイント関数のリストを含むファイルの名前を決定します。このファイルは定義ファイルの作成およびエクスポート・テーブルの作成に使用されます。デフォルトのファイル名は functions_list です。
name = mkl_custom
このマクロは、作成するライブラリの名前を指定します。デフォルトでは、mkl_custom.so がビルドされます。
xerbla = user_xerbla.obj
このマクロは、ユーザーのエラーハンドラを含むオブジェクト・ファイルの名前を指定します。このエラーハンドラはライブラリに追加され、標準の MKL エラーハンドラ xerbla の代わりに使用されます。デフォルトでは、パラメータが指定されていない場合、標準の MKL エラーハンドラ xerbla が使用されます。

すべてのパラメータは必須ではありません。最も簡単なコマンドは make ia32 です。残りのパラメータの値はデフォルトになります。この場合、IA-32 用の mkl_custom.so が作成され、functions_list ファイルから関数リストが取得されて、標準の MKL エラーハンドラ xerbla が使用されます。

その他の例 (より複雑な場合):
make ia32 export=my_func_list.txt name=mkl_small xerbla=my_xerbla.o
この場合、IA-32 用の mkl_small.so が作成され、my_func_list.txt ファイルから関数リストが取得されて、ユーザー・エラー・ハンドラの my_xerbla.o が使用されます。

functions_list ファイルのエントリポイントはインターフェイスにあわせて調整します。

dgemm_
ddot_
dgetrf_

選択した関数にプロセッサ固有のバージョンが複数ある場合、それらすべてがカスタム・ライブラリに含まれ、ディスパッチャで管理されます。

FFT 関数と DFT 関数

インテル® MKL リファレンス・マニュアル (mklman.pdf) のフーリエ変換に関する章 (第 11 章) では、離散フーリエ変換関数と高速フーリエ変換関数について説明されていますが、DFT 関数のみを使用してください。FFT 関数は、推奨されない関数で、後方互換の目的としてのみ存在しています。新しい DFT 関数は、幅広い機能を備え、より高いパフォーマンスを提供します。

テクニカル・サポート

インテル® MKL のサポートについては、Web サイト http://support.intel.com/support/jp/performancetools/ を参照してください。

 


著作権/法律に基づく表示

本資料に掲載されている情報は、インテル製品の概要説明を目的としたものです。本資料は、明示、黙示、禁反言またはその他の如何を問わず、いかなる知的財産権のライセンスを許諾するためのものではありません。製品に付属の売買契約書『Intel's Terms and conditions of Sales』に規定されている場合を除き、インテルはいかなる責を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証(特定目的への適合性、商品性に関する保証、第三者の特許権、著作権、その他、知的所有権を侵害していないことへの保証を含む)に関しても一切責任を負わないものとします。インテル製品は、医療、救命、延命措置などの目的に使用することを前提としたものではありません。

本資料およびこれに記載されているソフトウェアはライセンス契約に基づいて提供されるものであり、その使用および複製はライセンス契約で定められた条件下でのみ許可されます。本資料で提供される情報は、情報供与のみを目的としたものであり、予告なしに変更されることがあります。また、本資料で提供される情報は、インテルによる確約と解釈されるべきものではありません。インテルは本資料の内容およびこれに関連して提供されるソフトウェアにエラー、誤り、不正確な点が含まれていたとしても一切の責任を負いません。

「未使用 (reserved)」、「未定義 (undefined)」と記述されている機能や命令に関しては、今後新たに定義づけが行われる可能性があるため、設計には利用しないようご注意ください。これらの機能や命令を設計に利用した場合、定義の追加によって機能性や互換性などの面でいかなる問題が生じてもインテルは一切その責を負いません。

本資料で説明されているソフトウェアは、設計上の不具合が含まれている可能性があり、公表されている仕様とは異なる動作をする場合があります。現在確認済みの不具合については、インテルまでお問い合わせください。

 

Intel、インテル、Itanium、Pentium、Xeon は、米国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。
 
* その他の社名、製品名などは、一般に各社の商標または登録商標です。
 
(C) 2005, Intel Corporation.