ベクトル化

出典: フリー百科事典『ウィキペディア(Wikipedia)』

ベクトル化(ベクトルか、vectorize)

  • ベクトル命令化 - コンパイル時にループをベクトル演算命令に変換すること。この項目で説明。
  • ベクトル(1次元配列)の演算をサポートするプログラミング環境で、ループをベクトルに書き換えること
  • 行列(多次元配列)を同じ要素を持つベクトル(1次元配列)に変換すること
  • 他の形式のデータをベクタ形式データに変換すること

ベクトル化は、配列などが繰り返し処理される部分を、高速で演算(ベクトル演算)するようにさせること。ベクトル計算機スーパーコンピュータの主流だった頃によく使用された。

通常、ベクトル化し易いようにFORTRANなどで書かれたコードに手を加えるが、ベクトル計算機によってはコンパイラが自動ベクトル化を行うものもある。

目次

[編集] ベクトル化の手法

以下ではFORTRANのコードを例にとって説明する。基本的に、ループ演算を1つのベクトル演算命令にするので、DOループがベクトル化対象となる。なお、ベクトル命令に出来るパターンは各機種毎、コンパイラ毎に多少異なる。

[編集] 単純DOループ

たとえば以下のようなDOループは1つのベクトル命令に出来る。

     DO 100 I=1,100
        A(I) = A(I) * B(I)
 100 CONTINUE

[編集] IF文を含むDOループ

以下のような、IF文を含むDOループは、それをサポートするハードウェアがあればベクトル化が可能である。

     DO 100 I=1,100
        IF (A(I) .EQ. 0.0) THEN
           A(I) = A(I)*2
        END IF
 100 CONTINUE

この場合、たとえばSXシリーズでは、

  • 配列Aの各要素について、IF文を満たすか満たさないかを判断するマスクベクトルを作成。
  • マスクが真の部分だけを演算する、ベクトル命令を生成。

という方法でベクトル化を行なう。

[編集] 多重ループ

多重ループは、全部まとめて1つのベクトル命令を生成することもある。また、効率化をはかるために、内側のループと外側のループを入れ替える場合もある。これは、ベクトル化を行なうためには、データがメモリ上で連続している必要があるからである。 たとえば、二次元配列を演算する場合、内側のループが連続したメモリをアクセスするようになっていない場合には、演算する順番を入れ替えて(すなわちDOループの内側と外側を入れ替えて)ベクトル化が容易になるようにする。

[編集] 関連項目

[編集] 参考文献

  • SXシステムの言語処理系、NEC技報,Vol 39,No1/1986