この記事は、インテル® デベロッパー・ゾーンに掲載されている「Diagnostic 15509: Extraneous parameter of vector variant ‘xxxx’ of function ‘xxxx’ at position <val>」(https://software.intel.com/en-us/articles/cdiag15509) の日本語参考訳です。
このベクトル診断メッセージは、インテル® C++ コンパイラー 15.0 以降で生成されます。
原因:
この例は、ユーザー実装のベクトルバージョンの関数を使用します。従来、ユーザー定義関数のベクトルバージョンは、__declspec((vector)) (Windows*) または __attribute__((vector))) (Linux*) と関連する句を使用して、コンパイラーによって作成されます。ここでは、開発者が特定のプロセッサー・アーキテクチャー向けの組込み関数を実装することで、特定のターゲット・プロセッサーを使用できます。この例では、インテル® Core™ i7 プロセッサーのインテル® SSE4.2 アーキテクチャー向けにスカラー関数 MyMax() のベクトルバージョンを作成します。このエラーは、ユーザー定義の MyMax() 関数のベクトルバージョンに追加の引数があるため出力されます。エラーは明らかに位置 4 の無関係な引数参照を示しています (引数値の位置は 0 から始まります)。最後の整数引数は追加のパラメーターです。このコードは 64 ビット・アーキテクチャーを対象としています。したがって、4 つの 64 ビット・ポインターを格納するには、2 つの XMM レジスター (それぞれ 128 ビット幅) が必要です。
例:
#include <immintrin.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define NN 1021 __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, int b){ return _mm_add_ps(_mm_cvtepi32_ps(v_a1), v_b); }
$ icl 15509.c /c /Qopt-report:2 /Qopt-report-phase:vec /QxAVX
以下の診断メッセージは、インテル® C++ コンパイラー for Windows* 19.1.0.166 (ビルド 20191121) で生成しました。
エラー #15509: ベクトルバージョン 'MyMaxVec' (関数 'MyMax'、位置 4) の引数が無関係です。
正しいプロトタイプは '__m128 MyMaxVec(__m128i v0_0, __m128i v0_1, __m128 v1_0, __m128 m0_0)' です。
コンパイルは 15509.c で異常終了しました (コード 1)。
解決方法:
最後の整数の引数を削除します。
#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); }
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。