SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

インテルソフトウェア開発製品による並列化プログラミング

インテルプロセッサー向け並列化プログラミング
― 対称行列の三重対角化

インテルソフトウェア開発製品による並列化プログラミング (1)

インテル マス・カーネル・ライブラリーの利用

 次に、インテルで提供している数学関数ライブラリーであるインテル マス・カーネル・ライブラリー(以下、インテル MKL)のcblasを使った場合のコードをサンプルファイルのtridiag-cblas.ccに示します。

 cblasとは、行列やベクトルに関する演算のライブラリであるblasをCから呼び出しやすいようにパラメータなどを変更したライブラリです。このソースをコンパイルする場合には、mkl_c.libもリンクしますので、図8に示すコマンドを実行し、コンパイルします。

図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に示すコマンドを実行し、コンパイルします。

図9 リンクとコンパイルのためのコマンド
icl /O3 /QxT   eigen-dsytrd.cc /o eigen-dsytrd.exe mkl_c.lib libiomp5mt.lib

 このようにして作成された実行ファイルを実行すると、実行時間は4.1秒となりました。

まとめ

 今回は実対称行列の三重対角化を題材として、大きく3パターンの並列化手法を実装しました。また、インテル MKLの2つの関数の使用法も紹介しました。それぞれのパターンの実行時間を一覧にまとめると、表4になります。

表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ユーザー・リファレンス・マニュアル

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
インテルソフトウェア開発製品による並列化プログラミング連載記事一覧

もっと読む

この記事の著者

小林 広和(コバヤシ ヒロカズ)

インテル株式会社 インテル技術本部 ソフトウェア&サービス統括部 所属。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3582 2009/03/02 00:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー