【问题标题】:How to correspond existing vectorized function to existing scalar function for Intel Compiler autovectorization如何将现有矢量化函数与英特尔编译器自动矢量化的现有标量函数对应起来
【发布时间】: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 如果您计划这样做,则无意冒犯。
  • 只是例子,其实数组是动态分配的,功能比较复杂

标签: c++ vector intel icc


【解决方案1】:

终于解决了我的问题。也许对其他人来说会很有趣。

解决方案是使用处理器子句:

_declspec(vector_variant(implements(plus(int a, int b)), vectorlength(8), processor(core_4th_gen_avx)))

【讨论】:

    【解决方案2】:

    AFAIK,没有办法让自动矢量化来使用自定义原语。只需告诉您的编译器您的数组已对齐,并让它使用 + 而非 _mm256_add_epi32 从纯 ISO C++ 自动矢量化。

    编译器选项控制自动矢量化的默认矢量宽度。 (例如,针对 skylake-AVX512、ICC 和其他一些编译器默认使用 256b 向量,因为实际上使用 512b 向量会降低最大涡轮时钟,并且只有当程序将大部分时间花在向量化循环中时才值得。编译器没有不知道这个。)

    例如,gcc 有一个 -mprefer-avx128 可以使用 128 位 AVX 指令自动矢量化,即使在 AVX2 256 位整数指令可用时也是如此。

    ICC18 引入了-qopt-zmm-usage:low|high,Skylake-server 默认为low,Xeon-Phi 默认为high,因为 Xeon-Phi 是围绕 512 位向量设计的,但 Skylake-AVX512 必须降低其最大涡轮增压至运行 512 位指令。 (在 Skylake 的较窄向量上使用 AVX512 指令不会受到任何惩罚,但至强融核甚至不允许这样做,因为它不支持 AVX512 的 AVX512VL(向量长度)子集。)


    我不确定 ICC 如何控制 128 位和 256 位 自动-矢量化,但绝对不是通过使用内在函数编写函数。

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 2023-03-14
      • 2020-04-06
      • 1970-01-01
      • 2018-05-02
      • 2018-08-17
      相关资源
      最近更新 更多