ACML BLAS LAPACK FFT Random number PGIコンパイラ オプション
PGI 16.1 以降には ACML ライブラリはバンドルされていません。以下は、PGI 15.10 までのコンパイラで有効です。PGI 16.1 以降で、BLAS/LAPACK を使用したい場合は、OpenBLAS による BLAS ライブラリをご利用ください。
PGI コンパイラにて、SSE インストラクションを使用して性能最適化された BLAS ライブラリ、LAPACK ライブラリ、FFT ライブラリを使用したい場合は、製品にバンドルされた ACML ライブラリをお使いください。従来の 32bit の x86 システムでも 64bit の AMD64/Intel64 システム上でもお使いになれます。このページでは、ACMLライブラリのリンク方法について説明します。なお、このライブラリはLinux、Windows用のみ提供しております。OS X 版にはバンドルされていませんのでご注意ください。
Copyright © 株式会社ソフテック
高速数学ライブラリ ACML について
AMD Core Math Library (ACML) は、32 ビットあるいは 64 ビット版 OS 上で動作する x64 アプリケーションの性能と機能性を最大化するための AMD 社で開発されたライブラリです。SSE/SSE2/SSE3/SSE4 インストラクションを使用し、高度にチューニングされた以下の数学ライブラリを提供します。なお、このライブラリは、AMDプロセッサだけではなく、インテルのプロセッサ上でも利用でき、OpenMP スレッド並列用のルーチンも具備しています。AMD プロセッサだけではなく、インテルのプロセッサに対してもご利用いただけます。
一般的な 1CPU 用並びに OpenMP 用の ACML ライブラリのリンク方法は以下のとおりです。なお、OpenMP 版のライブラリは、PGI 6.2 以降でバンドルされております。この ACML ライブラリは、SSE/SSE2/SSE3 インストラクションを使用していますので、使用するハードウェア(MPU) がSSE ハードウェアをサポートしている必要があります。現在のハードウェアがサポートしているか否かを判別するには、Linux の場合、以下のコマンドを使用して、SSE/SSE2/SSE3 フラグが存在するか確認してください。
$ cat /proc/cpuinfo
ACMLライブラリをリンクするためのコンパイル・オプションは次のとおりです。オプション記述の順番に気をつけてください。なお、ライブラリは、SSE インストラクションを使用しているため、データ整列のために 32ビット環境では、-fastsse あるいは、-Mcache_align を必ず指定してください。(64ビット環境の場合は、デフォルトでデータ整列されています。) OpenMP 版の ACML ライブラリは、-mp オプション(OpenMP並列化のためのオプション)並びに、-lacml あるいは -lacml_mp を付加することにより、自動的にリンクされます。
Windows 環境での ACML ライブラリの使用に関する記事が、こちらのページにもございます。
ACML の行列積のライブラリ(DGEMM)を使用する例題をこちらのページに記載しています。
1 CPU シリアル版のACMLをリンクする場合
● Linux 版
pgf77 -fastsse -Mcache_align test.f -lacml pgfortran -fastsse -Mcache_align test.f -lacml pgcc -fastsse -Mcache_align test.c -lacml ※バンドルされた ACML のバージョンによっては、「-lacml -lacml_mv」 の二つのオプションが 必要な場合があります。リンクエラーが生じた場合は -lacml_mv オプションを追加して下さい。
● Windows 版
【32ビットWindows PGI 7.0 以降】 pgf77 -fastsse -Mcache_align -Munix test.f -lacml pgfortran -fastsse -Mcache_align -Munix test.f -lacml pgcc -fastsse -Mcache_align -Munix test.c -lacml ※ 32ビット環境では、-Munix オプションを必ず付加して下さい 【32ビットWindows PGI 7.1 以降】 pgf77 -fastsse -Mcache_align -Munix test.f -lacml -Bdynamic pgfortran -fastsse -Mcache_align -Munix test.f -lacml -Bdynamic pgcc -fastsse -Mcache_align -Munix test.c -lacml -Bdynamic ※ PGI 7.1 以降は、Windowsデフォルトのリンク形式が static となった ため、ACMLライブラリの場合は、 明示的に -Bdynamic が必要です。 ※ 32ビット環境では、-Munix オプションを必ず付加して下さい 【64ビットWindows PGI 6.2 以降】 pgf77 -fastsse -Mcache_align test.f -lacml pgfortran -fastsse -Mcache_align test.f -lacml pgcc -fastsse -Mcache_align test.c -lacml -pgf77libs 【64ビットWindows PGI 7.1 以降】 pgf77 -fastsse -Mcache_align test.f -lacml -Bdynamic pgfortran -fastsse -Mcache_align test.f -lacml -Bdynamic pgcc -fastsse -Mcache_align test.c -lacml -pgf90libs -Bdynamic (PGI の旧バージョンでは、"-pgf90libs"の代わりに"-pgf77libs"とする場合がある)
OpenMP 版の ACML をリンクする場合
● Linux 版
【PGI6.2の場合】 pgf77 -fastsse -Mcache_align -mp test.f -lacml pgfortran -fastsse -Mcache_align -mp test.f -lacml pgcc -fastsse -Mcache_align -mp test.f -lacml 【PGI7.0以降の場合】 pgf77 -fastsse -Mcache_align -mp test.f -lacml_mp pgfortran -fastsse -Mcache_align -mp test.f -lacml_mp pgcc -fastsse -Mcache_align -mp test.f -lacml_mp -pgf77libs -lm
● Windows 版
PGI6.2の場合 【64ビットWindows版のみ】 pgf77 -fastsse -Mcache_align -mp test.f -lacml pgfortran -fastsse -Mcache_align -mp test.f -lacml pgcc -fastsse -Mcache_align -mp test.f -lacml PGI7.0の場合 【32ビット、64ビットWindows版】 pgf77 -fastsse -Mcache_align -mp test.f -lacml_mp pgfortran -fastsse -Mcache_align -mp test.f -lacml_mp pgcc -fastsse -Mcache_align -mp test.f -lacml_mp -pgf77libs -lm -Bdynamic (注意)32bit Windows の場合は、さらに -Munix を付加して下さい。 PGI7.1以降の場合 【32ビット、64ビットWindows版】 pgf77 -fastsse -Mcache_align -mp test.f -lacml_mp -Bdynamic pgfortran -fastsse -Mcache_align -mp test.f -lacml_mp -Bdynamic pgcc -fastsse -Mcache_align -mp test.f -lacml_mp -pgf90libs -lm -Bdynamic (PGI の旧バージョンでは、"-pgf90libs"の代わりに"-pgf77libs"とする場合がある) (注意)32bit Windows の場合は、さらに -Munix を付加して下さい。 ※ PGI 7.1 以降は、Windowsデフォルトのリンク形式が static となった ため、ACMLライブラリの場合は、 明示的に -Bdynamic が必要です。
上記のコンパイルの方法において、-mp オプションを付加することにより、スレッド実行モードのモジュールが生成されます。ACML ライブラリの中で OpenMP 並列対応となっているサブルーチンは、このライブラリ・モジュールの中で自動的に並列実行されます(全てのライブラリ・ルーチンが並列対応とはなっていませんのでご注意ください)。
並列実行での環境変数 OMP_NUM_THREADS を予め、以下のように設定してから実行してください(4スレッドの例)。
$ export OMP_NUM_THREADS=4
$ 実行
------------------------------------------------------------------------------------
スタックサイズの不足等のエラーがある場合、スタックサイズの指定を行います。
$ export MPSTKZ=8M
$ 実行