インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

概要: ベクトル演算

このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーにのみ適用されます。

インテル® イニシャル・メニー・コア命令 (インテル® IMCI) をサポートしているほぼすべてのベクトル組込み関数は、次の形式で指定します。

vop v1 {k1}, v2, S(v3/m)

v1 はデスティネーション・オペランドです。 命令には書き込みマスクがあるため、ベクトル・マスク・レジスター k1 の対応するビットがセットされている要素のみ処理され、v1 に格納されます。 k1 の対応するビットがクリアされている v1 の要素は、元の値を保持します。

つまり、デスティネーション・ベクトル v1 はソースベクトルでもあり、追加の引数として組込み関数に渡す必要があります。

ベクトル組込み関数

512 ビットのベクトル組込み関数は、要素単位で処理します。1 つ目のソースベクトルの 1 つ目の要素と、2 つ目のソースベクトルの 1 つ目の要素を処理し、その結果をデスティネーション・ベクトルの 1 つ目の要素に格納します。残りの 15 個または 7 個の要素も同様に処理します。

512 ビットのベクトルの要素数は、組込み関数に応じて 8 個または 16 個になります。以下に例を示します。

ベクトル組込み関数で書き込みマスクとして使用されるベクトル・マスク・レジスターは、実際に操作する要素を指定します。マスクにより、任意の組み合わせの要素に対する操作や更新を無効にできます。

ソースが 1 つだけのもの (つまり、2 つのオペランドしかないもの) を除き、ほとんどのベクトル組込み関数には、3 つの異なるベクトルオペランド (通常、2 つのソースと 1 つのデスティネーション) があります。

また、どのソースベクトルにも、メモリーレジスターやベクトルに対する置換操作の結果を格納することができます。

マスクなし/マスク付きの組込み関数

利便性とを向上し、コンパイラーの最適化を有効にするため、各ベクトル命令ごとにマスクなしとマスク付きの組込み関数のペアを用意しています。

各バージョンについて、次の点を理解することが重要です。

_mm512_<vop>(v2, v3)

マスク付きベクトルの使用例

ここでは、マスク付きベクトル k1 の仕組みを例を使って説明します。

2 つのソースベクトル v1v3 を使用して、要素単位のキャリー付き加算を行う組込み関数について考えてみます。 ベクトル carry は、キャリー値を保持します。 ベクトル k2_old は、特定の条件下で結果ベクトルに要素を提供します。

この組込み関数のマスク付きのバージョンでは、ベクトル k1 は 16 ビットからなるマスクです。 k1 のビット 3 が '1' に設定されている場合、結果ベクトルの 3 つ目の要素は v1 ベクトルの 3 つ目の要素と v3 ベクトルの 3 つ目の要素を加算した結果になり、そのキャリー値が carry の 3 つ目の要素に格納されます。

また、マスク k1 のビット 2 が '0' に設定されている場合、結果ベクトルの 2 つ目の要素は v1 ベクトルの 2 つ目の要素と等しくなり、carry の 2 つ目の要素は k2_old の 2 つ目の要素と等しくなります。

以下は、この仕組みを示すコードです。

for (n=0; n < 16; n++) {
   res[i] = v1[i]
   *carry[i] = k2_old[i]
     if ( k1[i] == 1 ) {
         res[i] = res[i] + v3[i]
         *carry[i] = Carry(v1[i] + v3[i])
       }
}

v1_old ベクトルは、k2_old ベクトルと同じように使用されます。 k1 ベクトルマスクの現在処理中の要素に対応するビットが '0' に設定されている場合、結果ベクトルに要素を提供します。

関連情報