診断 15513: ベクトルバージョン ‘xxxx’ (関数 ‘xxxx’、位置 <値>) の mask 引数の型が正しくありません。

同カテゴリーの次の記事

診断 15511: ベクトルバージョン 'xxxx' (関数 'xxxx'、位置 <値>) の引数が不足しています。

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15513: Incorrect type of mask parameter of vector variant ‘xxxx’ of function ‘xxxx’ at position <val>」の日本語参考訳です。


このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。

原因:

この例は、ユーザー実装のベクトルバージョンの関数を使用します。従来、ユーザー定義関数のベクトルバージョンは、__declspec((vector)) (Windows*) または __attribute__((vector))) (Linux*) と関連する句を使用して、コンパイラーによって作成されます。ここでは、開発者が特定のプロセッサー・アーキテクチャー向けの組込み関数を実装することで、特定のターゲット・プロセッサーを使用できます。この例では、インテル® Core™ i7 プロセッサーのインテル® SSE4.2 アーキテクチャー向けにスカラー関数 MyMax() のベクトルバージョンを作成します。このエラーは、MyMax() 関数のベクトルバージョンのデータ型に誤りがあるため出力されます。MyMax() のベクトルバージョンで使用される mask パラメーターのデータ型は __m128i になっていますが、正しいデータ型は __m128 です。

例:

#include <immintrin.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NN 1021

//__declspec(vector)

__declspec(noinline)

float MyMax(float* a, float b){
    return *a + b;
}

__declspec(vector_variant(implements(MyMax(float* a, float b)),
                          vectorlength(4), processor(core_i7_sse4_2), mask))
           __m128 MyMaxVec(__m128i v_a1, __m128i v_a2, __m128 v_b, __m128i msk){
    return _mm_add_ps(_mm_cvtepi32_ps(v_a1), v_b);
}

$ icl 11513.c /c /Qopt-report:2 /Qopt-report-phase:vec

以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。

エラー #15513: ベクトルバージョン 'MyMaxVec' (関数 'MyMax'、位置 3) の mask 引数の型が正しくありません。

解決方法:

mask パラメーターのデータ型を __m128i から __m128 に変更します。

#include <immintrin.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NN 1021

//__declspec(vector)

__declspec(noinline)

float MyMax(float* a, float b)	{
    return *a + b;
}

__declspec(vector_variant(implements(MyMax(float* a, float b)),
                          vectorlength(4), processor(core_i7_sse4_2), mask))
           __m128 MyMaxVec(__m128i v_a1, __m128i v_a2, __m128 v_b, __m128 msk){
    return _mm_add_ps(_mm_cvtepi32_ps(v_a1), v_b);
}

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事

  • ベクトル異形関数でのプロセッサー ID 指定ベクトル異形関数でのプロセッサー ID 指定 インテル® C/C++ および Fortran コンパイラーのバージョン 16.0 以降では、プログラマーがスカラー関数に対応するベクトル関数を明示的に記述することを可能にする、ベクトル異形関数 (Vector Variant Function) をサポートしています。 Windows* および Linux* […]
  • 等方性 3 次元有限差分 (3DFD) 波動方程式コード向けの NUMA を理解する等方性 3 次元有限差分 (3DFD) 波動方程式コード向けの NUMA を理解する この記事は、インテル® デベロッパー・ゾーンに公開されている「Understanding NUMA for 3D isotropic Finite Difference (3DFD) wave equation code」の日本語参考訳です。 この記事の PDF […]
  • GCC 5.0 での x86 向けの最適化新機能GCC 5.0 での x86 向けの最適化新機能 この記事は、インテル® デベロッパー・ゾーンに公開されている「New optimizations for X86 in upcoming GCC 5.0」の日本語参考訳です。パート 1 ロード/ストアグループのベクトル化GCC 5.0 […]
  • 将来に対応したコードの最適化によるソフトウェアの現代化将来に対応したコードの最適化によるソフトウェアの現代化 この記事は、インテル® デベロッパー・ゾーンに公開されている「Modernizing Software with Future-Proof Code Optimizations」の日本語参考訳です。 この記事の PDF 版はこちらからご利用になれます。 新しいインテル® Parallel Studio XE […]
  • コードの現代化を成功に導く 3 つのアドバイスコードの現代化を成功に導く 3 つのアドバイス この記事は、インテル® デベロッパー・ゾーンに公開されている「Three Pieces of Advice for Code Modernization Success」の日本語参考訳です。 プログラムを高速化するための開発者への 3 つのアドバイスについてブログの執筆依頼を受けたとき、最初に思い浮かんだのは […]