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 ライブラリを活用できます。
2010年1月5日 Copyright © 株式会社ソフテック 加藤

インテル 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 に実装されているようです。

  • 64bit Linux の場合 : export MKLPATH=/opt/intel/Compiler/{version番号}/{???}/mkl/lib/em64t
  • 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 スレッドライブラリ(静的ライブラリあるいは動的ライブラリのどちらか)を指定して、そのリンクを行うことを確認して下さい。

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

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

(1)OpenMPディレクティブを指定してマルチスレッドプログラムとしてコンパイル (-mp)

 $ pgf90 -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の例)

 $ pgf90 -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コンパイラを使用した場合の例です。二つのリンク方法(静的リンクとダイナミック・リンクの例)を例示します。

(ダイナミック・リンク形式)
 $ pgf90 -mp -fastsse -Minfo -o mm_mp pgi_mm.o -R$MKLPATH -L$MKLPATH \
-lmkl_intel -lmkl_pgi_thread -lmkl_core (静的リンク形式) $ pgf90 -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)で適切なオプションを調べて下さい。また、Intel® Math Kernel Library のドキュメントは、インテル社のサイトをご参照下さい。

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

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

 $ pgf90 -Minfo -fastsse -c pgi_mm.f 

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

 以下の例は、MKLライブラリが実装されているディレクトリを 環境変数で定めた$MKLPATH と仮定した場合です。リンクするライブラリとして三つの MKL ライブラリ -lmkl_intel_lp64、-lmkl_sequential、-lmkl_core を指定します。(以下は、64ビットLinuxの例)

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

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

(ダイナミック・リンク形式)
 $ pgf90 -fastsse -Minfo -o mm_mp pgi_mm.o -R$MKLPATH -L$MKLPATH \
-lmkl_intel -lmkl_sequential -lmkl_core (静的リンク形式) $ pgf90 -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