ベクトル化

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

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

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

ベクトル化とは、コンピュータプログラムにおいて、繰り返し処理で配列ベクトル)の要素をひとつひとつ計算しているような部分を、手動あるいはコンパイラで(自動ベクトル化)、ベクトル計算機で高速に演算できるよう変形すること。近年のSIMD演算のための並列化スーパースカラ機でのソフトウェアパイプラインに応用できる内容もある。

High Performance 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) .GT. 0.0) THEN
            A(I) = A(I) * 2.0
         END IF
  100 CONTINUE

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

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

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

多重ループ[編集]

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

関連項目[編集]

参考文献[編集]

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