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 we are using the return type of the function as __m256 when targeting for SSE4.2.
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))) __m256 MyMaxVec(float* v_a, __m128i v_b) { return *((__m256*)v_a); } }
$ icpc user_f1.c -c -qopt-report2 -qopt-report-phase=vec -qopt-report-file=stderr
error #15508: Incorrect return type of vector variant '_Z8MyMaxVecPf7__m128i' of function '_Z5MyMaxPfi' at position 0.
compilation aborted for user_f1.c (code 1)
Resolution:
Using __m128 data type instead will resolve this error and the vector variant of the function is generated.
#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 *((__m128*)v_a); } }