インテル® C++ コンパイラー 16.0 ユーザー・リファレンス・ガイド

vector_variant

オリジナルの C/C++ スカラー関数に対応するベクトル関数を指定します。このベクトル関数は、ベクトル・コンテキストで呼び出すことができます。

構文

Windows*

__declspec(vector_variant(clauses))

Linux*:

__attribute__((vector_variant(clauses)))

引数

clauses

設定可能な値は以下のとおりです。

implements 節。implements (<function declarator>) [, <simd-clauses>]) 形式で指定します。function declarator はオリジナルのスカラー関数、simd-clausesvector 属性で許可されている 1 つ以上の節です。simd-clauses はオプションです。

説明

この属性により、プログラマーはベクトル関数と対応するスカラー関数を表現できます。コンパイラーは、ベクトル化されたループでスカラー関数の呼び出しをベクトル関数に置き換えます。

この属性に関する制限は以下のとおりです。

ユーザー定義のベクトル関数で mask 節を指定する場合、mask 引数は最後の引数にします。

以下に、ベクトル関数の例を示します。

#include<immintrin.h>
__declspec(noinline)
float MyAdd(float* a, int b) { return *a + b; }
__declspec(vector_variant(implements(MyAdd(float *a, int b)),       
                          linear(a), vectorlength(8),
                          nomask, processor(future_cpu_16)))
__m256 MyAddVec(float* v_a, __m128i v_b, __m128i v_b2) {
  __m256i t96 = _mm256_castsi128_si256(v_b);
  __m256i tmp = _mm256_insertf128_si256(t96, v_b2, 1);
  __m256  t95 = _mm256_cvtepi32_ps(tmp);
  return _mm256_add_ps(*((__m256*)v_a), t95);
}
float x[2000], y[2000];
float foo(float y[]) {
#pragma omp simd
  for (int k=0; k< 2000; k++) {
    x[k] = MyAdd(&y[k], k);
  }
  return x[0] + x[1999];
}

関連情報