[[PageNavi(NavigationList)]] == インテル謹製の数値演算ライブラリ「MKL」を使ってプログラムを高速化 == 各種スケジューリング処理やシミュレーション、統計処理、デジタル制御や信号処理などの分野では、多次元行列演算や高速フーリエ変換(FFT)、線形計画法など、さまざまな数学的処理が必要とされる。これらの処理に対するアルゴリズムはほぼ完成されており、フリー/商用を問わず、すでに多数の計算ライブラリがリリースされている。その1つが、インテルが提供する「インテル マス・カーネル・ライブラリ」(Intel Math Karnel Library、以下MKL)だ。 MKLはインテル コンパイラーに標準で付属している数値演算ライブラリで、同社のItaniumやXeon、Pentium 4、Core 2、Core i7といったCPUで高速に動作するよう最適化されているだけでなく、マルチプロセッサー/マルチコアCPU環境での並列処理に対応しているのが特徴だ。 本記事では、このMKLが備えている機能を紹介するとともに、フリーのライブラリと比べてどの程度の性能差があるのか、検証を行っていく。 ==== MKLの構成と含まれる数値演算ライブラリ ==== まずはMKLについて簡単に紹介しておこう。MKLは、次のような特徴を備えた数値計算ライブラリだ。 '''○多数の数値演算関数を搭載''' MKLは、下記のような数値演算関数を搭載している。 * BLAS(行列/ベクトル演算) * スパースBLAS(疎行列/疎ベクトル演算) * LAPACK(多次元線形方程式処理) * ScaLAPACK(多次元線形方程式処理) * スパースソルバー * ベクトル演算 * ベクトル統計 * 高速フーリエ変換 (FFT) * クラスターFFT * 区間ソルバー * 三角変換 * ポアソンソルバー、ラプラスソルバー、およびヘルムホルツソルバー * 最適化ソルバー これらは制御/計測/シミュレーション/信号処理/統計処理などで多く使われる数値演算関数で、すべて倍精度の浮動小数点演算に対応している。 '''○マルチプラットフォーム''' WindowsおよびLinux、Mac OS X版が用意されており、それぞれWindows版/Linux版/Mac OS X版のインテル コンパイラー プロフェッショナルエディションに付属している。どのプラットフォームでも同じ関数/APIが提供されており、プラットフォームを意識せずに利用が可能だ。 '''○CおよびFortranの両方から使用可能''' MKLにはCおよびFortran用のインターフェイスが用意されており、どちらの環境からも利用できる。 '''○32ビットおよび64ビットの両環境に対応''' MKLはx86、x64、IA-64(Itanium)の3つのアーキテクチャに対応しており、それぞれのアーキテクチャ用ライブラリが付属している(Mac OS X版はx86とx64のみ)。 '''○スタティックリンクとダイナミックリンクの両方でリンク可能''' すべてのアーキテクチャにおいてスタティックリンク版とダイナミックリンク版の両方のライブラリが用意されている。 '''○マルチスレッド対応/並列化対応''' MKLすべての関数はマルチスレッド環境でも安全に動作する(スレッドセーフ)ほか、簡単な指定でライブラリをマルチスレッド動作させ、並列処理を行わせることも可能だ。 '''○MKLを使用するアプリケーションの再配布は無償''' MKLを使用したアプリケーションを再配布は、本数の制限なく無償で行える。 ==== MKLを採用するメリット ==== MKLで扱われている数値計算処理のほとんどは、その解法アルゴリズムが確立しているものであるため、すでにオープンソースのライブラリが提供されていたり、また文献を参照して自分で実装することも可能である。では、MKLのメリットはどこにあるのかというと、まず1つにその演算速度が挙げられる。 MKLはインテル コンパイラーと同様、各種インテル製CPUに最適化してコンパイルされており、高速な動作が期待できる。また、実行環境から自動的にCPUを判断し、もっとも最適なルーチンを選択するため、さまざまなCPUで高速に動作する。一方、オープンソースのライブラリの場合、配布されているバイナリは汎用CPU用のものが多いため、特定の環境向けにチューンアップするには自分でオプションを設定してコンパイルする必要がある。また、このようなオープンソースのライブラリはLinux/UNIX環境で開発されているものが多く、Windows環境ではコンパイルできない、もしくはコンパイルにLinux/UNIXの知識が必要で手間がかかる場合も多い。このような「無駄な手間」をかけずに、すぐに高速なライブラリが利用できるメリットは大きいだろう。 また、マルチスレッド動作に対応し、簡単な設定で処理を並列化できるというメリットもある。最近はマルチプロセッサ/マルチコア構成のPCも増えているが、並列化に対応している数値演算ライブラリは多くない。MKLの場合、同時処理できるスレッド数に応じて自動的に処理を並列化できるため、マルチプロセッサ/マルチコアのパフォーマンスを最大限に利用できる。 そして、MKLを使用したプログラムの配布が、有償/無償や配布数に関わらずすべて無償で行えるというのも、商用製品を開発する開発者にとっては見逃せない。オープンソースのライブラリはGPLなどで配布されていることが多いが、このようなライセンスは企業内では利用できないことも多いだろう。そういった場合、MKLは有用な選択肢の1つとなる。 [[PageNavi(NavigationList)]]