对4个以C编码的整数大小的数组进行SSE操作

时间:2012-11-23 12:03:43

标签: c x86 sse simd

对于之前的描述性问题感到抱歉。请允许我再次重新提出问题:

设置:

我需要使用SSE同时对来自4个阵列的4个32位值进行ADD和一些有点操作,这4个数组中的所有元素都是整数大小(32位)。结果将转到第5个阵列。

所以我的问题是:

  1. 我需要包含哪些头文件和编译器标志,以便我可以使用C?
  2. 运行SSE
  3. Paul剧集提供的示例代码是否有效?
  4. 另一个问题,如果我需要从整数A中读取最后一位,从整数B读取第一位,并将整数C中的最后一位和第一位替换为刚刚读取的值,我可以在这里使用SSE吗?或者有任何快速的方法吗?在正常情况下,而不是3次访问?

    再次,为之前的帖子道歉,并感谢任何输入...... ^ _ ^

1 个答案:

答案 0 :(得分:3)

假设:

  • 你想从4个输入数组添加相应的整数并将总和存储在第五个(输出)数组中
  • 整数是32位
  • 阵列大小(N)是4
  • 的倍数
  • 所有数组都是16字节对齐

然后这应该这样做:

#include <stdint.h>
#include <emmintrin.h>

const size_t N = 4096;  // size of input/output arrays

int32_t array0[N];      // 4 x input arrays
int32_t array1[N];
int32_t array2[N];
int32_t array3[N];
int32_t array_sum[N];   // output array

for (size_t i = 0; i < N; i += 4)
{
    __m128i v0 = _mm_load_si128(&array0[i]); // load 4 x vectors of 4 x int
    __m128i v1 = _mm_load_si128(&array1[i]);
    __m128i v2 = _mm_load_si128(&array2[i]);
    __m128i v3 = _mm_load_si128(&array3[i]);
    __m128i vsum = _mm_add_epi32(v0, v1);    // sum vectors
    __m128i vsum = _mm_add_epi32(vsum, v2);
    __m128i vsum = _mm_add_epi32(vsum, v3);
    _mm_store_si128(&array_out[i], vsum);    // store sum
}