使用位操作循环的g ++自动矢量化

猫王

是否可以向量化此循环(使用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;
  }
}
m

有使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

double for循环的高效矢量化

来自分类Dev

我是否需要在for循环中使用小于(<)运算符进行自动矢量化?

来自分类Dev

如何矢量化此替换操作?

来自分类Dev

为什么Visual C ++自动矢量化器不对这个简单的循环进行矢量化处理?

来自分类Dev

MATLAB / Octave循环的矢量化

来自分类Dev

Mat的for循环矢量化

来自分类Dev

MSVC的自动矢量化为什么不使用AVX2?

来自分类Dev

动态循环的矢量化循环

来自分类Dev

使用Python矢量化图像(Spark)

来自分类Dev

矢量化Elseif循环

来自分类Dev

使用AccumArray进行矢量化

来自分类Dev

R中for循环的矢量化

来自分类Dev

AVX循环矢量化错误

来自分类Dev

矢量化代码比循环慢?的MATLAB

来自分类Dev

滑动窗口操作的Numpy矢量化

来自分类Dev

Python中嵌套for循环的矢量化

来自分类Dev

R:成对矩阵的矢量化循环

来自分类Dev

Matlab矢量化的for循环

来自分类Dev

使用Python矢量化图像(Spark)

来自分类Dev

矢量化如果-Elseif循环

来自分类Dev

自相关MATLAB循环的矢量化

来自分类Dev

使用sklearn矢量化文件

来自分类Dev

AVX循环矢量化中的错误

来自分类Dev

展开用于自动矢量化的指针增量循环

来自分类Dev

使用 numpy 进行矢量化

来自分类Dev

包含比较的循环的自动矢量化

来自分类Dev

矢量化 OpenCV 循环 python

来自分类Dev

使用函数接收矢量化输出

来自分类Dev

R 中时差循环的矢量化