プログラムを使用する際の注意事項(2002/1/10) <Windows上(MS-VC++等)で実行する場合> プログラムの動作確認を「Visual C++ 6.0」で行っている。 「コンパイル」→「ビルド」→「実行」でそのまま動くはずです。 一度コンパイルした後,「アクティブな構成の設定」で Releaseモードにすることを忘れずに。 <LinuxなどのPC-UNIX上(gcc等)で実行する場合> プログラムの動作確認を「gcc-2.95.3」で行っている。 % gcc -O3 multmm.c -lm % ./a.out で動くはずです。 また,BLASを利用できる環境の人は,プログラムソースのmainの中の DGEMMの部分のコメントアウトを外して, % g77 -O3 multmm.c -lblas -lm のようにg77でコンパイルすると良いかもしれません。 <全般的な注意> コンパイルされたプログラムを実行すると, input n (<= 1000) n = のように画面に出力されるので,行列のサイズを入力すると計算が始まる。 例えば,100と入力すると,100*100の正方行列2つの掛け算をする。 また,ソースを見てみると,以下のように書いてある。 /* Maximum Matrix Dimension Size */ #define MAX_DIMENSION_SIZE 1000 MAX_DIMENSION_SIZEは行列の最大次元数であり,double A[1000][1000] のような 2次元配列を考えている。もっと行列のサイズを大きくしたいときは,ここを変更する。 #define MAX_DIMENSION_SIZE 2000 ただし,使用するマシンのメモリに注意しなければならない。参考までに書いておくと, MAX_DIMENSION_SIZEが1000のときに必要なメモリ量は,(8*1000*1000)*3=約24MBである。 /* Block Size */ #define NBLC 50 NBLCは,ブロック化のときのブロックサイズであるので, CPUのキャッシュサイズ(L2 Cache)を考えて変更する。 L2 Cacheは,PentiumIIでは 512KB,PentiumIIIでは 512KB or 256KB,Celeronでは 128KBである。 この辺りのことに興味のある人は,NBLCを変更して,nを大きめ(1000くらい)にとり, 最もMFLOPSが大きくなるときの値を探してみてください。 また,C言語のタイマーはシステムによって異なることがあるので, 適宜変更してください。 /* Timer is machine dependent. */ #include #define Timer clock() #define Etime(tic, toc) (double)(toc - tic)/CLOCKS_PER_SEC WindowsでVC++,Linuxでgccを使用する場合は このままで実行できるはずです。 以上。 -- 何か伝えたいことや問題があるときは,下記のメールアドレスまで。 Name : Takeshi OGITA E-mail: luther@geocities.co.jp