对于之前的非描述性问题,我们深表歉意。请允许我再次重新表述一下问题:
设置:
我需要使用SSE同时对4个数组中的4个32位值进行ADD和一些按位操作,这4个数组中的所有元素都是整数大小(32位)。结果存入第 5 个数组。
所以我的问题是:
- 我需要包含哪些头文件和编译器标志才能使用 C 运行 SSE?
- Paul stills 提供的示例代码有效吗?
另一个问题,如果我需要读取整数 A 的最后一位和整数 B 的第一位,并用我刚刚读取的值替换整数 C 的最后一位和第一位,我可以在这里使用 SSE 吗?或者有什么快速的方法可以做到吗?而不是正常情况下的 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
}
关于c - 对用 C 编码的 4 个整数大小的数组进行 SSE 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13528791/