紧凑型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