是否可以向量化此循环(使用g ++)?
char x;
int k;
for(int s = 0; s < 4; s++) {
A[k++] += B[x&3];
x >>= 2;
}
A
并且B
是指向非重叠浮点数组的指针;B
具有0到3的索引。我需要最大程度地提高可移植性,因为这是针对R
软件包的,因此最好的方法是重写,使g ++能够将其单独矢量化,因为我不知道如何制作SSE代码在这种情况下是可移植的(包RcppEigen
使库Eigen
可用,因此是可能的)。
预先感谢您的想法。
PS嵌套在其中的代码看起来像
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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句