6

除了SSE-copy、AVX-copy 和 std::copy 性能。假设我们需要以下列方式对某个循环进行矢量化: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 转换吗?

4

2 回答 2

9

您可以随意混合 SSE 和 AVX 内在函数。

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

  • 海合会:-mavx
  • 视觉工作室:/arch:AVX

否则将导致代码无法编译(GCC),或者在 Visual Studio 的情况下,
这种废话:

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

于 2013-08-19T18:29:20.370 回答
1

我谦虚地请求不同 - 我建议不要混合 SSE 和 AVX,请阅读 Mystical 写的链接,它警告不要这样混合(尽管没有足够强调它)。根据 AVX 支持,存在关于不同机器的不同代码路径的问题,因此没有混合 - 在您的情况下,混合非常细粒度并且会具有破坏性(由于微架构实现而导致内部延迟)。

澄清一下 - Mystical 对编译中的 vex 前缀是正确的,如果没有它,你的状态会非常糟糕,因为你每次都需要 SSE2AVX 辅助,因为你的 YMM 寄存器的上部不能被忽略(除非明确使用 vzeroupper)。但是,即使将 128b AVX 与 256b AVX 混合使用,也会产生更微妙的效果。

我也没有看到在这里使用 SSE 的好处,因为你有一个长循环(比如 N>100),你可以从 AVX 中获得大部分的好处,并在标量代码中执行最多 7 次迭代的其余部分(您的代码可能仍然需要执行其中的 3 个)。与混合 AVX/SSE 相比,性能损失微不足道

有关混合物的更多信息 - http://software.intel.com/sites/default/files/m/d/4/1/d/8/11MC12_Avoiding_2BAVX-SSE_2BTransition_2BPenalties_2Brh_2Bfinal.pdf

于 2013-08-19T19:39:10.947 回答