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

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

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

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

 Intel(R) Math Kernel Library (「MKL」と言う。) は、インテルのマイクロプロセッサ用に高度に最適化された数学関数からなるライブラリです。Intel MKL 10.1リリース以降、PGIコンパイラは、MKL ライブラリをユーザプログラムにリンクできるようになりました。インテル MKL 10.1 以降の資産をお持ちのユーザは、PGIコンパイラ環境上で、Intel(R) MKL ライブラリを活用できます。
2011年11月1日更新
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 以降のライブラリが必要です

 以下の例では、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, Mac 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: 」という選択肢で、インテル製品シリーズのバージョンを選択するようになっています。2011年現在、インテル®社のコンパイラ製品は、Intel® Composer XE 2011 と言う製品が最新となっています。製品の選択肢を「Intel Composer XE 2011」あるいは「Intel Compiler Pro.」として選択すると、後続のパラメータ選択肢の中のコンパイラの選択では、PGI Compiler の選択肢が出てきません(削除されています)。この場合は、その代わりに「Intel® MKL 10.3」を選んでください。その後続の選択肢を設定すると、最新の MKL バージョンでも使用可能なPGI向けのオプションが表示されます。なお、PGIコンパイラを使用する場合、「Select interface layer」の選択は、「LP64(32bit Integer)」として下さい。
なお、Intel® Math Kernel Library のドキュメントは、インテル社のサイトをご参照下さい。

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"
      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"
      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

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ライブラリ設定