在优化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