【发布时间】:2018-02-05 17:24:16
【问题描述】:
好吧,我在使用英特尔编译器优化 (ICC) 时遇到了一些问题。
一般来说,我想使用 ICC 循环自动 vectotization。早些时候,我使用了显式矢量化循环和函数。据我所知,英特尔编译器允许通过_declspec(vector_variant()) derective 获得标量和相应的矢量化函数。但我对此有一些问题。
例如,现在我有两个版本的函数:
int plus(int a, int b)
{
return a + b;
}
__m256i plus_avx(__m256i a, __m256i b)
{
return _mm256_add_epi32(a, b);
}
int main()
{
int aa[1000] = { 2 };
int bb[1000] = { 4 };
int cc[1000] = { 0 };
for (int i = 0; i < 1000; ++i)
cc[i] = plus(aa[i], bb[i]);
}
我希望 ICC 使用矢量化版本的函数进行自动矢量化循环。
我尝试使用__declspec(vector_variant()) 喜欢:
_declspec(vector_variant(implements(plus(int a, int b)), vectorlength(8))) __m256i plus_avx(__m256i a, __m256i b)
{
return _mm256_add_epi32(a, b);
}
但我有错误:
1>错误 #15508:向量变体的返回类型不正确 '?plus_avx@@YA?AT__m256i@@T1@0@Z' 的函数 '?plus@@YAHJH@Z' 在 位置 0。
1> 正确的原型是:'__m128i, __m128i ?plus_avx@@YA?AT__m256i@@T1@0@Z(__m128i v0_0, __m128i v0_1, __m128i v1_0,__m128i v1_1)'。
为什么编译器需要 __m128i 并且有没有办法使用 __m256i insted of __m128i
注意:ICC 使用 /QaxCORE-AVX2 标志。
【问题讨论】:
-
无关,但可能会令人不快:
int aa[1000] = { 2 };不是一个包含 1000 个 2 的数组,它是一个 1 2 和 1999 个 0 的数组。演示:ideone.com/SXAU5n 如果您计划这样做,则无意冒犯。 -
只是例子,其实数组是动态分配的,功能比较复杂