1. ホーム
  2. vectorization

[解決済み】「ベクトル化」とは何ですか?

2022-04-17 22:44:25

質問

今まで何度か、matlabやfortran...その他...でこの言葉に出会いましたが、どういう意味で、何をするものなのか、説明を見つけたことがありません?そこで質問なのですが、ベクトル化とは何でしょうか、また、例えば、"ループがベクトル化されるとはどういうことでしょうか?

どのように解決するのですか?

多くのCPUは、2つ、4つ、あるいはそれ以上のデータに対して同時に同じ演算を行うquot;vector" またはquot;SIMD" 命令セットを持っています。 最近のx86チップにはSSE命令、多くのPPCチップにはquot;Altivec命令、そしてARMチップの一部にはNEONと呼ばれるベクトル命令セットが搭載されています。

ベクトル化(簡略化)とは、配列の1つの要素をN回処理する代わりに、配列の4つの要素を同時にN/4回処理するようにループを書き換えることである。

(4としたのは、最新のハードウェアが直接サポートする可能性が高いからです。quot;vectorization"という用語は、ループを完全に抽象化して、それを構成する要素の代わりに配列の操作を記述するような、より高度なソフトウェア変換を表すのにも使用されます)


ベクトル化とループアンロールの違いについて。 2つの配列の要素を加算し、その結果を3番目の配列に格納する次のような非常に単純なループを考えてみましょう。

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

このループを展開すると、次のような形になる。

for (int i=0; i<16; i+=4) {
    C[i]   = A[i]   + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}

一方、これをベクター化すると、次のようなものが出来上がる。

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

ここで "addFourThingsAtOnceAndStoreResult" は、コンパイラーがベクトル命令を指定するために使用する組込み関数のプレースホルダーです。 一部のコンパイラーは 自動ベクトル化 このような非常に単純なループは、しばしばコンパイル・オプションで有効にすることができます。 より複雑なアルゴリズムでは、良いベクターコードを生成するためにプログラマーの助けが必要です。