■mkl(Intel(R) Math Kernel Library)をBCC(BorlandC++Builder6.0)で使用する方法についての備忘録■

 MKL ライブラリが評判らしいです.アカデミックユースだと,30日 free だかなんかで,Lapack,Blas が full で, .net 上で簡単に利用できるとあれば,Fortran 仕様のアドレス渡しの関数だろうがなんだろうが,Intel 系のプロセッサを利用してれば尚の事,一度は試してみたくなる.
 私も,使い良い数値演算ライブラリがないかと,Lapack++,CLapacl,Octave?,TNTなどなど,試してきた経緯から,勢い MKL の購入に踏み切り,使用してみることにしました.

 ところが,MKL のマニュアルを読む限り,BCC のライブラリ形式である OMF はサポートしていないとこと!
そうは言われても,普段使い慣れたBCCを手放すのも惜しく,どうにかMKLをBCC上で利用できないか試してみた.

 ただし! そもそもOMFはサポート外なのだから,せっかくの精度保証やCPUに対する最適化が出来ているかは確証がないので注意が必要である.

 さて,経緯はこれくらいとして・・・・・もしやとは思うが,.net が順調に伸びているさなか,消え行く可能性の高いBorlandC++Builder6.0上でmklを使いたいという,極めて稀少な要求でお悩みの同志の方のヒントになればと備忘録として公開することにした.

 私のプログラミング技術&知識は充分ではないので,間違った記述,稚拙なサンプルコードは悪しからず....
そもそも,ここにあるようなまわりっくどい方法をとらなくても,簡便な方法があるかもしれない.ご存知の方は一報いただければ幸いである.

 ご意見,ご感想は,manabu@bme.t.u-tokyo.ac.jp までご連絡ください

■2004/9 追記
 本記事を書いた時点で,MKL6.1でしたが,現在はMKL7.0がリリースされています.ダウンロードの仕方などはかわりありませんが,私は最新バージョンではこの方法を試していません.悪しからず.


@ mklのインストール

intelの本家から,インストールプログラムをダウンロードする.
アカデミックユースなら,online でのメールアドレスの登録により,30日free の registration key を登録メールアドレスに配布してもらえる.

ちなみに,正規品を購入すると,パッケージも何もなく,ライセンスキーを印字したシート1枚.
全く味も素っ気もなく,ありがたみも湧かないが,かえって合理的で好印象.

インストール先は,特に指定しないと "C:\Program Files\Intel" になる.特に難しい事はないはず.

あと,もう一点,後ほどlib.exeというMSVCのプログラムが必要となるので,どこからか手に入れておいてください.

 

A mklの導入概要

mkl の提供する様々な関数を使用するためには,mkl.h をインクルードし,dll をプログラム直下において,lib をプロジェクトに追加すれば良い
(.netでは何ら問題なくそのまま利用できる).

32bit系 なら lib,dll,h ファイルのうち,とりあえず "C:\Program Files\Intel\MKL61\ia32" にある以下のライブラリのうち必要なものをインポートしておけば良い.
(各ライブラリが何を定義しているかは manual 参照)

 libguide.lib
 mkl_c.lib
 mkl_s.lib
 mkl_c_dll.lib
 mkl_s_dll.lib
 mkl_ia32.lib
 mkl_lapack.lib

またdll は,"C:\Program Files\Intel\MKL61\ia32\bin" にある以下のファイルを使用する.
PC の状況が pentiumIII か IV かなどにより使用する dll が異なるようである
.(詳しくは manual 参照)

 libguide40.dll
 mkl_def.dll
 mkl_lapack32.dll
 mkl_lapack64.dll
 mkl_p3.dll
 mkl_p4.dll
 mkl_vml_p4.dll

 

B BCCからmklを利用する場合の問題点

ところが,BCC からこれらのライブラリを利用しようとすると,BCC は lib の形式が OMF という形式を採用しているので,MKL の提供する COFF 形式( MSVC または MS.net などが採用) とは異なり,BCC での利用には少し工夫が必要である.( くどいようだが,MKL の manual ではそもそも COFFのサポートはしていないとのこと)
単に,COFF を OMF 形式に変換するだけであれば,coff2omf.exe というコンソールプログラムをBCCが提供してくれているのだが,COFF にも新しいものと古いものがあり,mkl はどうやら新しいバージョンで記述されているようでさらに変換の必要がある.

ということで・・・・与えられているDLL 形式のファイルから,ふるいCOFF 形式の lib を作り,これをOMF形式に変換する方針に決定!!

 

C dllからふるいCOFF形式のlibを作成する

先にあげたdll から lib を生成するのは,例えば,MSVC7.0 の提供する lib.exe というプログラムを使用する.これは,"C:\Program Files\Microsoft Visual Studio .NET\Vc7\bin" にあるが,.NET環境がない場合は,netからdownloadする必要がある.

ところが,このコードの入力形式は def 形式のファイルであるため,これを作ってやらなければならない. def ファイルは,こんな感じ(拡張子.def)のファイルなので,適当に真似して作ればよい.

がしかし! 肝心の dll の中身の関数が何かについてはわからない!!

これには dumpbin.exe というプログラムが利用できる.

コマンド例は,こんな感じである (ここでは libguide40.dll をターゲット)

 > dumpbin /exports libguide40.dll >libguide40.temp

出来たファイルはこんな感じなので,このような形に加工し拡張子も .def にする.頭の部分は,適当につけてある.
(恐らく後でできる lib ファイルと整合が取れてれば良いのだろうということで全て同じ名前とした)

次に,lib.exe で古い形式の COFF ファイルを作成する.

 > lib /DEF:libguide40.def

とすると,libguide40.exp というファイルと同時に,def ファイル中で指定した名前の lib ファイルができる. これが,古い形式の COFF ファイルである.
ちなみに,私は dumpbin.exe を走らせる際に,mspdb70.dll が無いといわれたので,適当に検索して指定されたフォルダに放り込んだ.

 

D ふるいCOFFからOMF形式のLIBを作成

"C:\Program Files\Borland\CBuilder6\Bin" 中にある.coff2omf.exe を利用して COFF 形式を書き換える.

例えば以下のようにコマンドする.
ひとつめが入力 lib ファイル名,二つ目が出力 lib ファイル名
入力する lib ファイルと同じ名前の lib ファイルを作りたければ,あらかじめ名前を変えておく必要があるかも知れない.

 > coff2omf ___libguide40.lib libguide40.lib

で,出来た lib を BCC サイドからプロジェクトに追加してやり,さらにdllを直下においてやれば使用できる. (mkl.h のインクルードは必要)

以上の方法で以下のコードがとおります.

 


//-----------------------------------------
#pragma hdrstop
//-----------------------------------------
#pragma argsused

#include <iostream>
#include"mkl.h"
#define N 3

using namespace std;


int main(int argc, char* argv[]) {
 double A[N*N];
 double x[N];
 static int i;
 static int n=N,inc=1,info,piv[N];

 A[0]= 1; A[1]= 3; A[2]= 1;
 A[3]= 1; A[4]= 1; A[5]=-2;
 A[6]= 1; A[7]=-3; A[8]=-5;

 x[0]= 3; x[1]= 1; x[2]=-6;
 
 dgesv(&n,&inc,A,&n,piv,x,&n,&info);

 for(i=0; i" i'<'N; ++i) {
   cout << x[i];
 }
 return 0;
}

 兼松学のHPへ もどる
 野口研究室のHPへ もどる