gpt4 book ai didi

c++ - 使用 g++ 对带位操作的循环进行自动矢量化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:40 24 4
gpt4 key购买 nike

是否可以矢量化此循环(使用 g++)?

char x;
int k;
for(int s = 0; s < 4; s++) {
A[k++] += B[x&3];
x >>= 2;
}

AB 是指向非重叠 float 组的指针; B 的索引为 0 到 3。我需要最大限度地提高可移植性,因为这是一个 R 包,所以最好的方式是重写 g++ 能够单独对其进行矢量化,因为我不知道如何在这种情况下使 SSE 代码可移植(RcppEigen 包使库 Eigen 可用,所以这是可能的)。

非常感谢您的想法。

P.S.嵌套的代码看起来像

int k = 0;
for(size_t j = 0; j < J; j++) {
char x = data[j];
for(int s = 0; s < 4; s++) {
A[k++] += B[x&3];
x >>= 2;
}
}

最佳答案

有一个使用 AVX2 的解决方案:

__m256 _B = _mm256_setr_ps(B[0], B[1], B[2], B[3], B[0], B[1], B[2], B[3]);
__m256i _shift = _mm256_setr_epi32(0, 2, 4, 6, 8, 10, 12, 14);
__m256i _mask = _mm256_set1_epi32(3);
for (size_t j = 0; j < J/2; j++)
{
short x = ((short*)data)[j];
__m256i _index = _mm256_and_si256(_mm256_srlv_epi32(_mm256_set1_epi32(x), _shift), _mask);
_mm256_storeu_ps(A, _mm256_add_ps(_mm256_loadu_ps(A), _mm256_permutevar8x32_ps(_B, _index)));
A += 8;
}

关于c++ - 使用 g++ 对带位操作的循环进行自动矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33496086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com