首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSE和AVX本质混合物

SSE和AVX本质混合物
EN

Stack Overflow用户
提问于 2013-08-19 17:20:38
回答 2查看 5.4K关注 0票数 6

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

代码语言:javascript
复制
#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转换吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-19 18:29:20

你可以混合SSE和AVX的本质,你想要什么。

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

  • GCC:-mavx
  • Visual:/arch:AVX

如果不这样做,将导致代码不编译(GCC),或者在Visual中,

这类垃圾:

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

票数 9
EN

Stack Overflow用户

发布于 2013-08-19 19:39:10

我谦卑地请求同意--我建议不要把SSE和AVX混为一谈,请阅读“神秘链接”中的文章,它警告不要这样一种混合体(尽管它不够强调这一点)。问题是,根据AVX的支持,不同的机器有不同的代码路径,所以没有混合--在您的例子中,混合是非常细粒度的,并且会具有破坏性(由于微体系结构的实现导致内部延迟)。

为了澄清-神秘是正确的,在编译中的vex前缀,如果没有它,你将处于一个相当糟糕的状态,因为你煽动SSE2AVX助攻每次,因为你的YMM寄存器的上部不能被忽略(除非明确使用vzeroupper)。然而,即使使用128 B AVX与256 b AVX混合使用,也有更微妙的效果。

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

关于混合物的更多信息- 2Bfinal.pdf

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18319488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档