c/c++语言开发共享紧凑型AVX2寄存器,因此根据掩码选择的整数是连续的

在优化arrays压缩的问题中,最佳答案指出:

具有最新指令集的SSE / AVX寄存器允许更好的方法。 我们可以直接使用PMOVMSKB的结果,将其转换为PSHUFB之类的控制寄存器。

Haswell(AVX2)可以实现吗? 或者它需要AVX512的一种口味?

我有一个包含int32s的AVX2向量,以及一个比较结果的相应向量。 我想以某种方式将其改组,以便在掩码中设置相应msb的元素(比较true)在向量的低端是连续的。

我能看到的最好的是使用_mm256_movemask_ps / vmovmskps(没有* d变体?)得到一个掩码,然后在256 AVX2向量查找表中使用它来获得跨通道_m256_permutevar8x32_epi32 / vpermd的随机掩码

    首先要做的是找到一个快速标量函数。 这是一个不使用分支的版本。

     inline int compact(int *x, int *y, const int n) { int cnt = 0; for(int i=0; i 

    SIMD的最佳结果可能取决于零的分布。 如果它稀疏或密集。 以下代码应该适用于稀疏或密集的分发。 例如,长整数的零和非零。 如果分布更均匀,我不知道这个代码是否会带来任何好处。 但无论如何它会给出正确的结果。

    这是我测试过的AVX2版本。

     int compact_AVX2(int *x, int *y, int n) { int i =0, cnt = 0; for(i=0; i 

    这是我测试过的SSE2版本。

     int compact_SSE2(int *x, int *y, int n) { int i =0, cnt = 0; for(i=0; i 

    这是一个完整的测试

     #include  #include  #if defined (__GNUC__) && ! defined (__INTEL_COMPILER) #include  #else #include  #endif #define N 50 inline int compact(int *x, int *y, const int n) { int cnt = 0; for(int i=0; i 

      以上就是c/c++开发分享紧凑型AVX2寄存器,因此根据掩码选择的整数是连续的相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/541951.html

      (0)
      上一篇 2021年1月5日
      下一篇 2021年1月5日

      精彩推荐