c++ - SSE 和 AVX 内在函数混合

标签 c++ performance sse simd avx

除了SSE-copy, AVX-copy and std::copy performance .假设我们需要按以下方式对某些循环进行矢量化:1) 通过 AVX 对第一个循环批处理(乘以 8)进行矢量化。 2) 将循环的剩余部分分成两批。通过 SSE 向量化 4 的倍数的批处理。 3) 通过串行例程处理整个循环的剩余批处理。让我们考虑复制数组的例子:

#include <immintrin.h>

template<int length,
         int unroll_bound_avx = length & (~7),
         int unroll_tail_avx  = length - unroll_bound_avx,
         int unroll_bound_sse = unroll_tail_avx & (~3),
         int unroll_tail_last = unroll_tail_avx - unroll_bound_sse>
void simd_copy(float *src, float *dest)
{
    auto src_  = src;
    auto dest_ = dest;

    //Vectorize first part of loop via AVX
    for(; src_!=src+unroll_bound_avx; src_+=8, dest_+=8)
    {
         __m256 buffer = _mm256_load_ps(src_);
         _mm256_store_ps(dest_, buffer);
    }

    //Vectorize remainder part of loop via SSE
    for(; src_!=src+unroll_bound_sse+unroll_bound_avx; src_+=4, dest_+=4)
    {
        __m128 buffer = _mm_load_ps(src_);
        _mm_store_ps(dest_, buffer);
    }

    //Process residual elements
    for(; src_!=src+length; ++src_, ++dest_)
        *dest_ = *src_;
}

int main()
{  
    const int sz = 15;
    float *src = (float *)_mm_malloc(sz*sizeof(float), 16);
    float *dest = (float *)_mm_malloc(sz*sizeof(float), 16);
    float a=0;
    std::generate(src, src+sz, [&](){return ++a;});

    simd_copy<sz>(src, dest);

    _mm_free(src);
    _mm_free(dest);
}

同时使用 SSE 和 AVX 是否正确?我需要避免 AVX-SSE 转换吗?

最佳答案

您可以随心所欲地混合使用 SSE 和 AVX 内在函数。

您唯一要确保的是指定正确的编译器标志以启用 AVX。

  • 海湾合作委员会:-mavx
  • Visual Studio:/arch:AVX

否则将导致代码无法编译 (GCC),或者对于 Visual Studio,
这种废话:

该标志的作用是强制所有 SIMD 指令使用 VEX 编码以避免上述问题中描述的状态切换惩罚。

关于c++ - SSE 和 AVX 内在函数混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18319488/

相关文章:

performance - SQL Server 2005 聚集索引查询速度

c - 使用 SSE Intrinsics 计算长度和差异的浮点 x、y、z 数组上的循环向量化

c - 编写一段 C 代码,使编译器使用 SSE4.1 指令生成汇编代码

c++ - operator plus在C++11中应该如何实现

c++ - 添加尾随空格和使用 eof 时的额外输出

java - 有效地比较Java中的两个对象列表

performance - 为左打包字节元素生成高效的 sse 洗牌掩码

c++ - 用 cout 打印出 bool 选项

c++ - 未定义的类模板未实例化以检查友元函数

PHP 单词索引,性能和合理的结果