7.2 ベクトル化

通常、コンピュータは一度にひとつのデータに対する計算処理しか行うことができない。これをスカラ命令と呼ぶ。これに対しベクトル命令では、一度に複数のデータに対する計算処理を行うことができる。

■スカラ型/ベクトル型並列計算機 繰り返し計算プログラムのイメージ

スカラ型並列計算機のイメージ

ベクトル処理は、行列演算など、繰り返し同じ計算を行う処理に向いており、気象系のシミュレーションなどで活用されている。

行列演算のイメージ

例えば、以下のようなDO文を用いた繰り返し処理は、ベクトル化することによって、処理時間を大幅に短縮することができる。

INTEGER A(1),B(1),C(1)
DO I=1,100
C(I)=A(I)+B(I)
END DO
WRITE(*,*)C
END

★スカラ命令の場合

A(1)+B(1) → A(2)+B(2) → A(3)+B(3) → … → A(100)+B(100)
→ 1回に1個ずつ、100回分の演算を実行

★ベクトル命令の場合

A(1)+B(1)
A(2)+B(2)
A(3)+B(3)
  :
  :
A(100)+B(100)
→ 100個のデータを、1回で一気に演算実行

ベクトル命令は、同じ演算を行う演算器を複数持っており、複数データに対して同時に処理を実行するため、1度に多くの演算を実行することが可能となる。

ベクトル処理の実行時間

ベクトル命令は、スカラ命令に比べて非常に高速であるため、できるだけ多くのベクトル命令を使用することが重要である。

ベクトル処理の実行時間

コンパイラは、プログラムに対して自動的に最適なベクトル命令を生成するが、例えば変数のもつ値のように、コンパイラがプログラムを解析してもわからない情報がある場合、プログラマが明示的にプログラム内にコード記述を行うことで、ベクトル化の効果を一層促進させることが可能となる。

★ベクトル化のコード記述方法★

ベクトル化指示行
・・・
・・・ データの処理
・・・

ただし、どんなプログラムでもベクトル化できるわけではない。

S=0.0
DO I=1,100
A(I) = S
S = B(I)+C(I)
END DO

例えば上記のようなプログラムでは、すべての要素に対して A(I) = S の代入が先に実行されるため、A(1)~A(100)の値は全てゼロとなってしまう。

また、同一のメモリバンクグループに対しては、同時に一つの読み出し、または書き込みしか出来ないため、連続して同一グループのデータへアクセスすると、性能が低下する。これをバンク競合という。この場合、配列の宣言を変更するなどして回避する必要がある。