Cause:
This diagnostic is emitted by Intel(R) C++ Compiler 15.0 and above. This example uses User implemented vector variant of the function. Traditionally the vector variant of the user defined function is created by the compiler using __attribute__((vector)) with relevant clauses. Here the developer can provide target certain processors by providing the intrinsics implementation which targets those processor architecture. In this example, we create a vector variant of the scalar function MyMax() and target the vector variant for core i7 processor SSE4.2 architecture. This error pops up because the vector variant of the MyMax() function which the user creates has extra parameters. The error clearly refers to extraneous parameter in position 4 (position of the argument value starts from 0). The last integer parameter is an extra parameter. This code is targeted for 64 bit architecture. So in order to fit 4 64-bit pointers, we need two XMM registers which is each 128 bit wide.
Examples:
#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); }
$ icpc test56.cc -c -qopt-report2 -qopt-report-phase=vec -qopt-report-file=stderr -xAVX
error #15509: Extraneous parameter of vector variant '_Z8MyMaxVec7__m128iS_6__m128S0_i' of function '_Z5MyMaxPff' at position 4.
The correct prototype is: '__m128 _Z8MyMaxVec7__m128iS_6__m128S0_i(__m128i v0_0, __m128i v0_1, __m128 v1_0, __m128 m0_0)'.
compilation aborted for test56.cc (code 1)
Resolution:
Remove the last integer parameter.
#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); }