本プログラムの使用メモリーの主要部は2.9で述べた連立一次方程式で必要になります。
必要な配列は図2-9-2のx,b,r,p,q,t,uの7個です。
これ以外に行列Aで必要になりますが、行列は1行に13個の非ゼロ要素を持つために、
行列をメモリーに入れると必要メモリーが20/7倍にもなります。
従って計算時間は増えますが行列要素を毎回必要になる毎に計算する方法が考えられます。
本プログラムでは実行時に引数"-matrix"を指定すると初めに行列要素をメモリーに格納し、
引数"-nomatrix"を指定すると行列要素を毎回計算するようにしています。
前者をmatrixモード、後者をnomatrixモードと呼びます。
計算時間の大部分は図2-9-2の行列・ベクトル積とベクトル同士の演算(BLAS Level-1)が占めます。
表3-1-1と表3-1-2にGCCの付属ツールであるgprofで測定したプロファイル結果を示します。
表3-1-1のmatrixモードでは行列・ベクトル積が71%(30.1秒)、ベクトル演算が27%(11.2秒)を占め、
表3-1-2のnomatrixモードでは行列・ベクトル積が85%(68.5秒)、ベクトル演算が14%(11.6秒)を占めます。
matrixモードはnomatrixモードに比べて行列・ベクトル積の計算時間が半分以下になるために、
行列・ベクトル積の比率が下がります。
表3-1-1 gprofの出力(matrixモード, 1スレッド)
Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 24.76 10.44 10.44 1003 0.01 0.01 prodmvEx 24.28 20.68 10.24 1003 0.01 0.01 prodmvEz 22.39 30.12 9.44 1003 0.01 0.01 prodmvEy 7.49 33.28 3.16 1001 0.00 0.00 Zaxbycz 4.79 35.30 2.02 1002 0.00 0.00 Zdotc 4.60 37.24 1.94 1002 0.00 0.00 Zdotu 3.98 38.92 1.68 1003 0.00 0.00 Zaxpy 3.94 40.58 1.66 1005 0.00 0.00 Zcopy 1.85 41.36 0.78 508 0.00 0.00 Dznrm2
表3-1-2 gprofの出力(nomatrixモード, 1スレッド)
Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 28.44 22.98 22.98 1004 0.02 0.02 matrixEx 28.30 45.85 22.87 1004 0.02 0.02 matrixEz 28.05 68.52 22.67 1004 0.02 0.02 matrixEy 3.79 71.58 3.06 1001 0.00 0.00 Zaxbycz 2.55 73.64 2.06 1005 0.00 0.00 Zcopy 2.55 75.70 2.06 1003 0.00 0.00 Zaxpy 2.45 77.68 1.98 1002 0.00 0.00 Zdotu 2.08 79.36 1.68 1002 0.00 0.00 Zdotc 0.94 80.12 0.76 508 0.00 0.00 Dznrm2