インテルMKLにリンクすることにより、CGをFORTRANに実装しました。
次のようなステートメントがある場合:(Wikipediaを参照)
p=r;
x=x+alpha*p
r=r-alpha*Ap;
またはQMRの類似のもの(はるかに多い)
v_tld = r;
y = v_tld;
rho = norm( y );
w_tld = r;
z = w_tld;
xi = norm( z ); (and more)
DAXPY、DCOPY、DSCALなどのBLASレベル1実装を使用することには意味がありますか? 私の質問の動機は:
アルゴリズムの実装は2つあります。NormsとMatVecsのみをMKLにリンクしたもの。コピー、スケーリング、追加は、Fortranの組み込み関数と、可能なすべてのサブルーチンがBLASによって実行される別の関数によって行われます。
私は、BLASより速くなることはできないという考えでした。しかし、Fortranの組み込み関数を使用する私のコードは、BLASレベル1サブルーチンを使用するコードよりも100%高速であることがわかりました(FWIW、これは小さな問題ではありませんでした。 GB RAM)。私は2スレッドで(2コアマシンで)両方を実行
ifort QMR.f90 -mkl
していましたMKL_DYNAMIC=TRUE
私がいたSOの質問を BLASの拡張に関するけど、私は自分のコードにBLASレベル1が含まれるようにしようとしたとして、私のコードは遅く、遅くなって続けました。
私は何か間違ったことをしていますか、これは予想されますか?
また、BLASを拡張してy = 2.89*x
byのような自明ではない操作を行うことは理にかなっていDCOPY(n,2.89*x,1,y,1) or even DSCAL then DCOPY
ますか?
また興味深いのは、パフォーマンスDDOT
をDNRM2
向上させることです。彼らは倍精度の乗算を実行するため、並列に配置すると役立つ可能性があるという事実に起因しました。
補足質問:BLASレベル1操作が実際にパフォーマンスを向上させるかどうかはいつ決定しますか?
追加:現在、私はi3 2.13 GHzラップトップで4 GBのRAMとDebian 64ビットのプロセッサ情報をここで実行しています。しかし、24 GBのRAMを搭載したIntel Xeon 12コアワークステーションでも同様の回答が得られます。