269

何度か、matlab、fortran ...他の...でこの用語に出くわしましたが、それが何を意味し、何をするのかについての説明を見つけたことがありません。だから私はここで、ベクトル化とは何ですか、そしてそれは例えば「ループがベクトル化される」とはどういう意味ですか?

4

8 に答える 8

316

多くのCPUには、2つ、4つ、またはそれ以上のデータに同じ操作を同時に適用する「ベクトル」または「SIMD」命令セットがあります。最新のx86チップにはSSE命令があり、多くのPPCチップには「Altivec」命令があり、一部のARMチップでさえNEONと呼ばれるベクトル命令セットがあります。

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

(4を選択したのは、最新のハードウェアが直接サポートする可能性が最も高いためです。「ベクトル化」という用語は、ループを完全に抽象化し、要素ではなく配列での操作を説明する、より高レベルのソフトウェア変換を表すためにも使用されます。それらを構成する)


ベクトル化とループ展開の違い: 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」は、コンパイラがベクトル命令を指定するために使用する組み込み関数のプレースホルダーです。一部のコンパイラは、このような非常に単純なループを自動ベクトル化できることに注意してください。これは、多くの場合、コンパイルオプションを介して有効にできます。より複雑なアルゴリズムでも、優れたベクトルコードを生成するには、プログラマーの助けが必要です。

于 2009-09-14T15:12:00.813 に答える
45

ベクトル化は、スカラープログラムをベクトルプログラムに変換するための用語です。ベクトル化されたプログラムは、単一の命令から複数の操作を実行できますが、スカラーは、一度にオペランドのペアに対してのみ操作できます。

ウィキペディアから:

スカラーアプローチ:

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

ベクトル化されたアプローチ:

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}
于 2009-09-14T15:13:43.837 に答える
18

ベクトル化は、大量のデータを効率的に処理する必要がある科学計算で広く使用されています。

実際のプログラミングアプリケーションでは、NUMPYで使用されていることを知っています(他のアプリケーションについてはわかりません)。

Numpy(Pythonでの科学計算用のパッケージ)は、n次元配列を迅速に操作するためにベクトル化を使用します。これは、配列を処理するための組み込みのpythonオプションを使用すると、通常は遅くなります。

たくさんの説明がありますが、ここに、NUMPYドキュメントページのようにvectorizationが定義されているものがあります

ベクトル化は、コードに明示的なループやインデックス作成などがないことを示しています。もちろん、これらは、最適化され、コンパイル済みのCコードの「舞台裏」で行われています。ベクトル化されたコードには多くの利点があり、その中には次のものがあります。

  1. ベクトル化されたコードは、より簡潔で読みやすくなっています

  2. 通常、コード行が少ないということは、バグが少ないということです。

  3. コードは、標準の数学表記にさらに似ています(通常、数学構造を正しくコーディングするのが簡単になります)

  4. ベクトル化により、より「Pythonic」なコードが生成されます。ベクトル化がないと、コードに非効率的で読みにくいforループが散らばってしまいます。

于 2017-05-02T04:34:34.630 に答える
13

これは、単一のステップで数値のリスト(または「ベクトル」)に対して単一の数学演算を実行する機能を指します。これは、ベクトル化された算術が最初に登場したスーパーコンピューティングに関連する科学計算に関連しているため、Fortranでよく見られます。現在、ほとんどすべてのデスクトップCPUは、IntelのSSEなどのテクノロジを介して、何らかの形式のベクトル化された演算を提供しています。GPUは、ベクトル化された演算の形式も提供します。

于 2009-09-14T15:09:02.137 に答える
13

簡単に言うと、ベクトル化とは、プロセッサでSIMD命令を利用できるようにアルゴリズムを最適化することを意味します。

AVX、AVX2、およびAVX512は、1つの命令で複数のデータに対して同じ操作を実行する命令セット(Intel)です。たとえば。AVX512は、一度に16個の整数値(4バイト)を操作できることを意味します。つまり、16個の整数のベクトルがあり、各整数でその値を2倍にしてから、それに10を追加したい場合です。値を汎用レジスタ[a、b、c]に16回ロードして同じ操作を実行するか、16個すべての値をSIMDレジスタ[xmm、ymm]にロードして操作を1回実行することで同じ操作を実行できます。これにより、ベクトルデータの計算を高速化できます。

ベクトル化では、データを改造してSIMD操作を実行し、プログラムを高速化することで、これを活用します。

ベクトル化の唯一の問題は、条件の処理です。条件が実行の流れを分岐させるからです。これはマスキングによって処理できます。条件を算術演算にモデル化する。例えば。100より大きい場合に値に10を追加したい場合は、どちらでもかまいません。

if(x[i] > 100) x[i] += 10; // this will branch execution flow.

または、条件を算術演算にモデル化して、条件ベクトルcを作成することもできます。

c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask

ただし、これは非常に簡単な例です...したがって、cは、その値に基づいて2項演算を実行するために使用するマスキングベクトルです。これにより、実行フローの分岐が回避され、ベクトル化が可能になります。

ベクトル化は並列化と同じくらい重要です。したがって、可能な限りそれを利用する必要があります。現代のすべてのプロセッサには、重いコンピューティングワークロード用のSIMD命令があります。ベクトル化を使用してこれらのSIMD命令を使用するようにコードを最適化できます。これは、最新のプロセッサで利用可能な複数のコアで実行するようにコードを並列化することに似ています。

プラグマを使用してコードをベクトル化できるOpenMPについては触れておきたいと思います。私はそれを良い出発点と考えています。OpenACCについても同じことが言えます。

于 2018-12-20T17:05:16.267 に答える
8

インテルの人たちにとっては、理解しやすいと思います。

ベクトル化は、アルゴリズムを一度に1つの値で操作することから、一度に一連の値で操作することへと変換するプロセスです。最新のCPUは、単一の命令が複数のデータ(SIMD)に適用されるベクトル演算を直接サポートします。

たとえば、512ビットレジスタを備えたCPUは、16個の32ビット単精度doubleを保持し、単一の計算を実行できます。

一度に1つの命令を実行するよりも16倍高速です。これをスレッド化およびマルチコアCPUと組み合わせると、パフォーマンスが大幅に向上します。

リンクhttps://software.intel.com/en-us/articles/vectorization-a-key-tool-to-improve-performance-on-modern-cpus

Javaでは、これを2020年のJDK 15に含めるか、2021年のJDK16に含めるオプションがあります。この公式の問題を参照してください。

于 2020-04-11T01:20:55.140 に答える
1

あなたが元気であることを願っています!

ベクトル化とは、単一の操作で一度に1つのエンティティを処理するスケーラーの実装を、1つの操作で同時に複数のエンティティを処理するベクトルの実装に変換するすべての手法を指します。

ベクトル化とは、大量のデータを効率的に処理するためにコードを最適化する手法を指します。NumPy、パンダなどの科学アプリケーションで見られるベクトル化のアプリケーションも、Matlab、画像処理、NLPなどを操作しながらこの手法を使用できます。全体として、プログラムのランタイムとメモリの割り当てを最適化します。

あなたがあなたの答えを得るかもしれないことを願っています!

ありがとうございました。

于 2022-02-02T09:45:05.057 に答える
-5

上記の2つの答えを参照してください。ベクトル化を実行したい理由は、これらの操作がスーパーコンピューターやマルチプロセッサーによってパラエルで簡単に実行でき、パフォーマンスが大幅に向上するためです。シングルプロセッサコンピュータでは、パフォーマンスは向上しません。

于 2009-09-14T15:13:11.607 に答える