インテル マス・カーネル・ライブラリーの利用
次に、インテルで提供している数学関数ライブラリーであるインテル マス・カーネル・ライブラリー(以下、インテル MKL)のcblasを使った場合のコードをサンプルファイルのtridiag-cblas.ccに示します。
cblasとは、行列やベクトルに関する演算のライブラリであるblasをCから呼び出しやすいようにパラメータなどを変更したライブラリです。このソースをコンパイルする場合には、mkl_c.libもリンクしますので、図8に示すコマンドを実行し、コンパイルします。
icl /O3 /QxT tridiag-cblas.cc eigen.cc /o tridiag-cblass.exe mkl_c.lib
このようにして作成された実行ファイルを実行すると、実行時間は7.9秒となりました。
最後にインテル MKLのLapackを利用したソースコードをサンプルファイルのeigen-dsytrd.ccに示します。実対称行列の三重対角化はLapackのdsytrd関数を利用していますので、高度に最適化された関数が呼び出され、実行されます。dsytrdの引数は次のようになっています。
dsytrd(uplo, n, a, lda, d, e, tau, work, lwork, info)
FORTRANの関数をC/C++から呼び出す場合には関数名の後ろに"_"を付け加える必要があるため、「dsytrd_」を呼び出します。また、FORTRANでは引数はすべて参照として渡されるので、C/C++からポインタとして渡す必要があります。
ここでも、コンパイルする場合には、mkl_c.libとlibiomp5mt.libもリンクしますので、図9に示すコマンドを実行し、コンパイルします。
icl /O3 /QxT eigen-dsytrd.cc /o eigen-dsytrd.exe mkl_c.lib libiomp5mt.lib
このようにして作成された実行ファイルを実行すると、実行時間は4.1秒となりました。
まとめ
今回は実対称行列の三重対角化を題材として、大きく3パターンの並列化手法を実装しました。また、インテル MKLの2つの関数の使用法も紹介しました。それぞれのパターンの実行時間を一覧にまとめると、表4になります。
| バージョン | 時間(秒) |
| シリアル | 18 |
| 自動並列 | 15.4 |
| TBB | 13.4 |
| MKL(CBLASS) | 7.9 |
| MKL(LAPACK) | 4.1 |
この表から、同じ仕様のライブラリーがある場合は自分でコーディングするよりも、最適化されたライブラリーを利用した方が、実行時間が短くなることが分かります。
C++コンパイラー プロフェッショナルエディションでは、C++コンパイラーの他に今回紹介したインテル TBB、インテル MKL、に加えて画像・動画・信号処理の関数を含むインテル インテグレーテッド・パフォーマンス・プリミティブ(以下、インテル IPP)が同梱されているので、必要に応じてライブラリーを活用できます。
まず、時間がかかる処理と同様の機能を提供するインテル MKL/インテル IPPのAPIが存在していれば、そのAPI関数を組み入れてみてください。もしそのようなAPI関数が提供されていない場合は、今回の記事を参考にインテル TBBなどを活用して並列化を試していただければと思います。
参考文献
- インテル マス・カーネル・ライブラリー リファレンスマニュアル
- インテル C/C++コンパイラー11.0ユーザー・リファレンス・マニュアル
