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 vector variant of integer data type will be __m128i and not __m128. This also means that the second argument to _mm_add_ps() should be typecasted to __m128 using _mm_cvtepi32_ps() intrinsic.
Examples:
#include <immintrin.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define NN 1021 //__declspec(vector) __declspec(noinline) float MyMax(float* a, int b) { return *a + b; } __declspec(vector_variant(implements(MyMax(float* a, int b)), linear(a), vectorlength(4), processor(core_i7_sse4_2))) __m128 MyMaxVec(float* v_a, __m128 v_b) { return _mm_add_ps(*((__m128*)v_a), v_b); }
$ icpc user_f2.c -c -qopt-report2 -qopt-report-phase=vec -qopt-report-file=stderr
error #15507: Incorrect parameter type of vector variant '_Z8MyMaxVecPf6__m128' of function '_Z5MyMaxPfi' at position 1.
compilation aborted for user_f2.c (code 1)
Resolution:
#include <immintrin.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define NN 1021 //__declspec(vector) __declspec(noinline) float MyMax(float* a, int b) { return *a + b; } __declspec(vector_variant(implements(MyMax(float* a, int b)), linear(a), vectorlength(4), processor(core_i7_sse4_2))) __m128 MyMaxVec(float* v_a, __m128i v_b) { return _mm_add_ps(*((__m128*)v_a), _mm_cvtepi32_ps(v_b)); }