2次元配列: Sample 2: マトリックス・ベクトルの掛け算(FORTRAN)
■ 概要
このサンプルではマトリックスとベクトルの掛け算を行います。

通常、マトリックスAijを2次元配列A[i][j]としてコーディングしますが、場合によっては列と行を入れ替えてA[j][i]にすることもできます。ベクトルcさえ求まればどちらも採用してもいいですが、問題は計算時間です。実際にプログラムを見て、実行してみましょう。
下のCode 1ではA[j][i]、Code 2ではA[i][j]としてコーディングしてマトリックスとベクトルの掛け算をします。マトリックス(ベクトル)のサイズnは1000から30000までの30個の値を用います。各nに対して計算にかかった時間を測定し出力します。
■ ソースコード
◆ Code 1 | ◆ Code 2 |
|
|
■ 計算時間の測定結果
Code 1とCode 2を実行したときの計算時間をそれぞれ青線と赤線で図1に示します。そして両者の比を緑線で示します。
.png)
図1 測定時間
■ 考察
FORTRAN言語では2次元配列を列単位で1次元配列に組みなおされるので、内側のループが行に関連付けられたCode 1は図2のように飛び飛びしたメモリアクセスになります。一方、内側のループが行に関連付けられたCode 2は図3のように連続したメモリアクセスになります。

図2 Code 1のときのメモリアクセス

図3 Code 2のときのメモリアクセス
サンプル1と同様にメモリアクセスのジャンプの多いCode 1がCode 2より計算時間が長いです。サイズnが大きくなるにつれてCode 1とCode 2との計算時間の比率が増えていき、Code 1がCode 2より80倍以上遅くなることもあります。