インテル® マス・カーネル・ライブラリー 9.0 Mac OS* 版
テクニカル・ユーザー・ノート

資料番号: 310711-003J

目次

目的
サポートするコンパイラー
インテル MKL の並列化の使用
メモリー関数名の変更
パフォーマンス
FFTW インターフェイスのサポート
削除された FFT インターフェイスのサポート
GMP* 関数
バージョン情報の取得
テクニカルサポート
著作権と商標について

 

目的

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

 

サポートするコンパイラー

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

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

 

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

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

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

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

  1. OS スレッド (Linux*、Mac OS では pthread、Windows* では Win32* スレッド) を使用してプログラムをスレッド化した場合。ライブラリーが複数のスレッドで呼び出され、呼び出されている関数がスレッド化されている場合、インテル MKL のスレッド化をオフにする必要があります。環境変数 OMP_NUM_THREADS を 1 に設定してください。この設定はインテル MKL のデフォルトです。
  2. OpenMP ディレクティブまたはプラグマを使用してプログラムをスレッド化し、インテル・コンパイラー以外のコンパイラーを使用してコンパイルした場合。OMP_NUM_THREADS を設定すると、コンパイラーのスレッド化ライブラリーとインテル MKL のスレッド化ライブラリーの両方に影響します。この場合、環境変数 MKL_SERIALYES に設定して、OMP_NUM_THREADS の値に関係なく、インテル MKL を強制的にシリアルモードにします。
  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 9.0 から、メモリー管理関数を独自のメモリー関数で置換できるようになりました。アプリケーション開発者がメモリー割り当て関数を置換するために必要なすべての宣言は、i_malloc.h ヘッダーファイルに含まれています。このヘッダーファイルには、この変更をサポートするインテル・ライブラリーでメモリー割り当てを置換する方法が記述されています。

 

パフォーマンス

インテル 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 です。

 

FFTW インターフェイスのサポート

インテル MKL では、FFTW インターフェイスからインテル MKL 離散フーリエ変換インターフェイス (DFTI) の呼び出しを可能にするラッパーの 2 つのコレクションが提供されています。これらのコレクションは、それぞれ FFTW バージョン 2.x、3.x と、インテル MKL バージョン 7.0 以降に対応しています。
これらのラッパーは、FFTW を使用しているプログラムが、ソースコードを変更しなくても、インテル MKL フーリエ変換のパフォーマンスを実現できるように提供されています。FFTW 2.x ラッパーの使用についての詳細は、「FFTW to Intel® MKL Wrappers Technical User Notes for FFTW 2.x」 (fftw2xmkl_notes.htm)、FFTW 3.x ラッパーの使用についての詳細は、「FFTW to Intel® MKL Wrappers Technical User Notes for FFTW 3.x」 (fftw3xmkl_notes.htm) を参照してください。

 

削除された FFT インターフェイスのサポート

インテル MKL には、FFT から DFTI ラッパーのコレクションが用意されています。これらのラッパーを使用することで、本リリースで提供が終了したインテル高速フーリエ変換 (FFT) インターフェイスを現在使用しているプログラムでは、プログラムのソースコードを変更することなくインテル MKL フーリエ変換 (DFTI) を使用できるようになります。詳細は、「Intel® Math Kernel Library FFT to DFTI Wrappers Technical User Notes」 (fft2dfti.pdf) を参照してください。

 

GMP* 関数

インテル MKL の GMP 演算関数の実装には、任意精度による整数計算が含まれます。関数のインターフェイスは、GMP (GNU Multiple Precision*) 計算ライブラリーと互換性が保たれています。GMP 関数の仕様については、http://www.swox.com/gmp/manual/Integer-Functions.html を参照してください。

プログラムで GMP ライブラリーを使用している場合は、INCLUDE 文を mkl_gmp.h に変更してください。

 

バージョン情報の取得

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

 

テクニカルサポート

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

 


著作権と商標について

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

本資料で説明されているソフトウェアには、不具合が含まれている可能性があり、公開されている仕様とは異なる動作をする場合があります。現在までに判明している不具合の情報については、インテルのサポートサイトをご覧ください。

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

ライセンス契約で許可されている場合を除き、インテルからの文書による承諾なく、本書のいかなる部分も複製したり、検索システムに保持したり、他の形式や媒体によって転送したりすることは禁じられています。

機能または命令の一覧で「留保」または「未定義」と記されているものがありますが、その「機能が存在しない」あるいは「性質が留保付である」という状態を開発の前提にしないでください。留保または未定義の機能を不適当な方法で使用すると、開発したソフトウェア・コードをインテル・プロセッサー上で実行する際に、予測不可能な動作や障害が発生するおそれがあります。これらの機能や命令は、インテルが将来のために留保しているものです。不正な使用により、衝突が生じたり互換性が失われたりしても、インテルは一切責任を負いません。

本資料で説明されているソフトウェアには、不具合が含まれている可能性があり、公開されている仕様とは異なる動作をする場合があります。現在までに判明している不具合の情報については、インテルのサポートサイトをご覧ください。

 

Intel、インテル、Intel ロゴは、米国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。
 
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。
 
(C) 2000-2006 Intel Corporation.