PGIトップ › PGI技術情報・TIPS › MKLライブラリのリンク方法

ソフテックは、PGI 製品の公認正規代理店です

PGIコンパイラによるインテル MKL ライブラリのリンク方法

対象 Intel® MKL ライブラリの使用

 Intel(R) Math Kernel Library (「MKL」と言う。) は、インテルのマイクロプロセッサ用に高度に最適化された数学関数からなるライブラリです。、PGIコンパイラは、Intel MKL 10.1~11.0.5 (Intel Composer XE Edition 2013 update 5) までのMKL ライブラリをユーザプログラムにリンクできます。残念ながら、Intel Composer XE Edition 2013 SP1 以降のバンドル MKL(11.1 以降)には、PGI 用のモジュールが含まれておりませんので、Intel MKL 10.1~11.0.5 のライブラリをリンクする方法をとることになります。インテル MKL 10.1 以降の資産をお持ちのユーザは、PGIコンパイラ環境上で、Intel(R) MKL ライブラリを活用できます。
2014年3月20日更新
2010年1月5日 初稿 © 株式会社ソフテック 加藤

インテル MKL ライブラリの構成について

 インテル MKL ライブラリのリリース 10.0 以降、インテルは、レイヤード・アーキテクチャを採用しました。このモジュール構成によるアプローチは、MKLを以下の4つの異なる関数レイヤーに分離することによって実現しています。

  • Interface
  • Threading
  • Computation
  • Compiler support run-time library (RTL)

 全てのコンパイラに特有なランタイム・ライブラリのリファレンスは、「スレッディング・レイヤー」の中で分離されています。MKL 10.1 以降において、インテルは PGI コンパイラのためのスレッディング・ライブラリを提供しました。これにより、PGI コンパイラによっても、MKLライブラリをリンクすることができるようになりました。以下の方法は、PGIでコンパイルされたマルチスレッドの OpenMP プログラムに MKL ライブラリをリンクする際に必要なステップです。PGI上で、MKL ライブラリをリンクするためには、MKL 10.1 ~ 11.0.5 のライブラリが必要です

 インテルコンパイラ製品のバージョン番号とその製品にバンドルされていた MKL バージョン番号を列記した表がインテル社のサイトをご参照下さい。インテル MKL 11.0.5 までのライブラリが PGI コンパイラ上でリンク可能です。

 以下の例では、MKLライブラリが実装されているディレクトリを環境変数 $MKLPATH に設定してからコンパイル&リンク行う場合を想定します。一般にデフォルトでは、MKL ライブラリが以下の PATH に実装されているようです。この実装場所のパス名の確認を必ず行ってください。以下は Linux bash 環境の場合の例です。

  • 64bit Linux の場合 : export MKLPATH=/opt/intel/Compiler/{version番号}/{???}/mkl/lib/em64t
    Composer XL 2011以降の場合:
              export MKLPATH=/opt/intel/Compiler/{version番号}/{???}/mkl/lib/intel64
  • 32bit Linux の場合 : export MKLPATH=/opt/intel/Compiler/{version番号}/{???}/mkl/lib/32

PGI Workstation/Server 製品のコンパイラで MKL を使う

  Linux, OS X and Windows上のPGI Workstation and PGI Server シリーズの製品では、リンク時のコマンドライン上で、最初の三つの各レイヤー (interface, threading, computation) の MKL が提供しているライブラリの一つひとつを指定します。また、リンカーコマンドライン上の -mp オプションは、PGI のオプションであり、マルチスレッドの PGI ランタイム・ライブラリを使うことを指示するものです。さらに、MKL ライブラリの中から適切な PGI スレッドライブラリ(静的ライブラリあるいは動的ライブラリのどちらか)を指定して、そのリンクを行うことを確認して下さい。まず、最初に Linux 上での使用例から説明します。Windows上でも同じようなコンパイル/リンクのオプション設定が必要ですので、一通り目をお通しください。

OpenMPマルチスレッド・バージョンとしてコンパイルする例

 単純な matmul(行列積)のプログラム(pgi_mm.f)を例にして、Linux 上の PGI Fortran(pgfortran)コンパイラを使用してコンパイルし、MKL ライブラリをリンクします。

(1)OpenMP用のマルチスレッドプログラムとしてコンパイル (-mp)

 $ pgfortran -mp -Minfo -fastsse -c pgi_mm.f 

(2)そして、リンク作業。三つのMKLライブラリをコンパイルしたオブジェクトと共にリンクする。-mp オプションは、PGIコンパイラ側のマルチスレッド・ランタイムライブラリもリンクするため、必要です。

 以下の例は、MKLライブラリが実装されているディレクトリを 環境変数で定めた $MKLPATH と仮定した場合です。
-R オプションは、実行モジュールの中にランタイム・ライブラリの検索場所を明示的に保持するように指示するものです。-L は、リンク時にリンカーがライブラリを検索する場所を指定するものです。そして、リンクするライブラリとして三つの MKL ライブラリ -lmkl_intel_lp64 、-lmkl_pgi_thread、 -lmkl_core を指定すれば良いことになります。(以下は、64ビットLinuxの例)

 $ pgfortran -mp -fastsse -Minfo -o mm_mp pgi_mm.o -R$MKLPATH -L$MKLPATH \
-lmkl_intel_lp64 -lmkl_pgi_thread -lmkl_core

 以下の例は、32bit Linux 上の32ビットPGIコンパイラを使用した場合の例です。二つのリンク方法(静的リンクとダイナミック・リンクの例)を例示します。

(ダイナミック・リンク形式)
 $ pgfortran -mp -fastsse -Minfo -o mm_mp pgi_mm.o -R$MKLPATH -L$MKLPATH \
-lmkl_intel -lmkl_pgi_thread -lmkl_core (静的リンク形式) $ pgfortran -mp -fastsse -Minfo -o mm_mp pgi_mm.o -Wl,--start-group $MKLPATH/libmkl_intel.a \
$MKLPATH/libmkl_pgi_thread.a $MKLPATH/libmkl_core.a -Wl,--end-group

 PGIコンパイラを使用する際のインテル® のMKLライブラリのリンク時におけるコマンドライン引数を正確に調べたい場合は、インテル社のサイト(Intel® Math Kernel Library Link Line Advisor)で適切なオプションを調べて下さい。

MKL Link Line Advisor

 この Intel® Math Kernel Library Link Line Advisor のホームページでは、最初に、「Select Intel MKL/Intel Compiler version: 」という選択肢で、インテル製品シリーズのバージョンを選択するようになっています。2014 年現在、インテル®社のコンパイラ製品は、Intel® Composer XE 2013 と言う製品が最新となっています。製品の選択肢を「Intel Composer XE 2013 SP1~2011」あるいは「Intel Compiler Pro.」として選択すると、後続のパラメータ選択肢の中のコンパイラの選択では、PGI Compiler の選択肢が出てきません(削除されています)。この場合は、その代わりに「Intel® MKL 11.0 あるいは 10.3」を選んでください。その後続の選択肢を設定すると、MKL11.0 までの MKL ライブラリを使用するための PGI 向けのオプションが表示されます。但し、MKL 11.1 パッケージ以降には、PGI用のモジュールは含まれておりませんのでご注意ください。。なお、PGI コンパイラを使用する場合、「Select interface layer」の選択は、「LP64(32bit Integer)」として下さい。
なお、Intel® Math Kernel Library のドキュメントは、インテル社のサイトをご参照下さい。

 インテルコンパイラ製品のバージョン番号とその製品にバンドルされていた MKL バージョン番号を列記した表がインテル社のサイトをご参照下さい。インテル MKL 11.0.5 までのライブラリが PGI コンパイラ上でリンク可能です。

MKLの非スレッディングバージョン(シリアル版)を使用してコンパイルする例)

(1)シリアル実行のコンパイル (-mpは付けない)

 $ pgfortran -Minfo -fastsse -c pgi_mm.f 

(2)そして、リンク作業。三つのMKLライブラリをコンパイルしたオブジェクトと共にリンクする。-mp オプションは、必要ありません。

 以下の例は、MKLライブラリが実装されているディレクトリを 環境変数で定めた$MKLPATH と仮定した場合です。リンクするライブラリとして三つの MKL ライブラリ -lmkl_intel_lp64、-lmkl_sequential、-lmkl_core を指定します。(以下は、64ビットLinuxの例)【注意】pgfortran コンパイラではなく、PGI C コンパイラを使用する場合は、-pgf90libs オプションをリンク時に指定する必要があります。

 $ pgfortran -fastsse -Minfo -o mm_mp pgi_mm.o -R$MKLPATH -L$MKLPATH \
-lmkl_intel_lp64 -lmkl_sequential -lmkl_core

 以下の例は、32bit Linux 上の32ビットPGIコンパイラを使用した場合の例です。二つのリンク方法(静的リンクとダイナミック・リンクの例)を例示します。

(ダイナミック・リンク形式)
 $ pgfortran -fastsse -Minfo -o mm_mp pgi_mm.o -R$MKLPATH -L$MKLPATH \
-lmkl_intel -lmkl_sequential -lmkl_core (静的リンク形式) $ pgfortran -fastsse -Minfo -o mm_mp pgi_mm.o -Wl,--start-group $MKLPATH/libmkl_intel.a \
$MKLPATH/libmkl_sequential.a $MKLPATH/libmkl_core.a -Wl,--end-group

Windows 版の PGI Workstation/Server 製品のコンパイラで MKL を使う

  Windows 上の PGI Workstation and PGI Server シリーズの製品は、Cygwin による Linux Bash インタフェースで使用できるコンパイラです。Windows 上においても、上述 Linux の場合と同様な方法でリンク時のオプションを設定することができますが、Cygwin 上で空白を含んだ DOS 流のフォルダ・パスの設定等で、少々煩わしい部分があります。こうしたことも含めて、以下に Windows 上での使用方法を説明します。なお、以下で使用する MKL ライブラリは、 Intel(R) Visual Fortran Composer XE 2011 for Windows に付属する MKL 10.3 を使用した例です。

 上述した Linux 上での方法とほぼ同じです。MKLライブラリが存在するライブラリの場所は、-Lオプションで指定します。この場合、パス名にブランクが含まれることがありますので、パス名をダブルクォーツ""で囲みます。実際の MKL ライブラリ名は、-lオプションで指定するのではなく、実際のライブラリ・ファイル名(例:mkl_intel_lp64.lib)をそのまま記述します。

Windows 64ビット版

(1)OpenMPマルチスレッド・バージョン (-mp)

(静的リンク形式:Windows 上のデフォルト)
 PGI$ pgf90  -Minfo -fastsse -L"C:/Program Files (x86)/Intel/ComposerXE-2011/mkl/lib/intel64"
       mkl_intel_lp64.lib mkl_pgi_thread.lib mkl_core.lib -mp pgi_mm.f -o pgi_mm.exe
 (動的リンク形式)
 PGI$ pgf90  -Minfo -fastsse -L"C:/Program Files (x86)/Intel/ComposerXE-2011/mkl/lib/intel64"
      -Bdynamic mkl_intel_lp64_dll.lib mkl_pgi_thread_dll.lib mkl_core_dll.lib
       -mp pgi_mm.f -o pgi_mm.exe

(2)MKLの非スレッディングバージョン(シリアル版)

(静的リンク形式:Windows 上のデフォルト)
 PGI$ pgf90  -Minfo -fastsse -L"C:/Program Files (x86)/Intel/ComposerXE-2011/mkl/lib/intel64"
       mkl_intel_lp64.lib mkl_sequential.lib mkl_core.lib pgi_mm.f -o pgi_mm.exe
 (動的リンク形式)
 PGI$ pgf90  -Minfo -fastsse -L"C:/Program Files (x86)/Intel/ComposerXE-2011/mkl/lib/intel64"
       mkl_intel_lp64_dll.lib mkl_sequential_dll.lib mkl_core_dll.lib pgi_mm.f -o pgi_mm.exe

Windows 32ビット版

(1)OpenMPマルチスレッド・バージョン (-mp)

(静的リンク形式:Windows 上のデフォルト)
 PGI$ pgf90  -Minfo -fastsse -L"C:/Program Files (x86)/Intel/ComposerXE-2011/mkl/lib/ia32"
       mkl_intel_s.lib mkl_pgi_thread.lib mkl_core.lib -mp pgi_mm.f -o pgi_mm.exe
 (動的リンク形式)
 PGI$ pgf90  -Minfo -fastsse -L"C:/Program Files (x86)/Intel/ComposerXE-2011/mkl/lib/ia32"
      -Bdynamic mkl_intel_s_dll.lib mkl_pgi_thread_dll.lib mkl_core_dll.lib 
      -mp pgi_mm.f -o pgi_mm.exe

(2)MKLの非スレッディングバージョン(シリアル版)

(静的リンク形式:Windows 上のデフォルト)
 PGI$ pgf90  -Minfo -fastsse -L"C:/Program Files (x86)/Intel/ComposerXE-2011/mkl/lib/ia32"
       mkl_intel_s.lib mkl_sequential.lib mkl_core.lib pgi_mm.f -o pgi_mm.exe
 (動的リンク形式)
 PGI$ pgf90  -Minfo -fastsse -L"C:/Program Files (x86)/Intel/ComposerXE-2011/mkl/lib/ia32"
       mkl_intel_s_dll.lib mkl_sequential_dll.lib mkl_core_dll.lib pgi_mm.f -o pgi_mm.exe

Cygwin上での環境変数の設定の方法

 MKLライブラリが存在するライブラリの場所のパス名を MKLPATH と言った環境変数に設定し、これをコンパイル時に使用する場合は以下のように行います。パス名にブランクが含まれますので、パス名をダブルクォーツ""で MKLPATH 環境変数に囲んで定義します。この環境変数を参照する場合は、-L"$MKLLIB" と言う風に、$MKLLIBをさらにダブルクォーツで囲むことが必要です。bash シェル上でブランクを含む変数を使用しますので、$MKLLIBの引用に対して、さらにダブルクォーツで囲む必要があります。(関連記事)http://stackoverflow.com/questions/6614310/pb-with-path-declare-as-an-environment-variable

(環境変数の設定)
PGI$ export MKLLIB="C:/Program Files (x86)/Intel/ComposerXE-2011/mkl/lib/intel64"
(コンパイル・リンク)
PGI$ pgf90  -Minfo -fastsse -L"$MKLLIB" 
       mkl_intel_lp64_dll.lib mkl_sequential_dll.lib mkl_core_dll.lib  pgi_mm.f -o pgi_mm.exe
pgi_mm.f:
matmul:
     39, Generated vector sse code for the loop
     62, Loop not vectorized/parallelized: contains call
     91, Loop not vectorized/parallelized: contains call
    114, Loop not vectorized/parallelized: contains call
    
(実行時 DLL ライブラリの PATH の設定:動的ライブラリが必要な時のみ、
 以下はComposerXE 2013 バージョンの例)
PGI$ export PATH=$PATH;"C:/Program Files (x86)/Intel/Composer XE 2013/redist/intel64/mkl"  

Windows 版の PGI Visual Fortran のコンパイラで MKL を使う

  Windows 上の PGI Visual Fortran は、Microsoft(R) Visual Studio 上で使用できる Fortran コンパイラです。Visual Studio のプロジェクト・プロパティの Linker の設定で、MKL ライブラリの場所とライブラリ名を指定します。以下に、その設定画面の一例を示します。MKL ライブラリの場所とライブラリ名は、上記の PGI Workstation 製品で説明したものと同じ内容となります。 なお、プロパティ「Fortran」の中に存在する「Libraries」項には、 MKL ライブラリを「使用する/しない」と言う選択肢がありますが、これは設定しないで下さい。以下で使用する MKL ライブラリは、 Intel(R) Visual Fortran Composer XE 2011 for Windows に付属する MKL 10.3 を使用した例です。

静的リンク形式のライブラリをリンクする場合)プロパティ Linker の General 項を選び、「Additional Library Directories」の中に、MKLライブラリの保存してあるパス名を記述する。

MKLライブラリ設定

プロパティ Linker の Command Line 項を選び、使用する「MKLライブラリ名」をそのまま記述する。以下は、64ビット版の静的リンク形式ライブラリの例。

MKLライブラリ設定

(OpenMP 並列でかつ、動的リンク形式のライブラリをリンクする場合)プロパティ Fortran の Code generation 項を選び、「Runtime Library」を Multi-threaded DLL (-Bdynamic) を指定する。

MKLライブラリ設定

動的リンク形式のライブラリをリンクする場合)プロパティ Linker の General 項を選び、「Additional Library Directories」の中に、MKLライブラリの保存してあるパス名を記述する。

MKLライブラリ設定

プロパティ Linker の Command Line 項を選び、使用する「MKLライブラリ名」をそのまま記述する。以下は、64ビット版の動的リンク形式ライブラリを指定する場合のライブラリ名。

mkl_intel_lp64_dll.lib mkl_pgi_thread_dll.lib mkl_core_dll.lib

MKL の動的ライブラリ(DLL)を使用した実行モジュールを作成した場合は、実行前にライブラリの PATH の指定を行う必要があります。「コントロールパネル」-「システム」-「システム詳細設定」-「環境変数」の中で「ユーザの環境変数」の中に、以下のように PATH変数に対して C:\Program Files (x86)\Intel\Composer XE 2013\redist\intel64\mklを設定してください。このパスには、コンパイラの redist フォルダ内の MKL DLL のフォルダを指定します(Composer XE 2013の例)。

MKLライブラリ設定