【发布时间】:2012-11-18 01:11:32
【问题描述】:
抱歉之前的非描述性问题。请允许我重新表述一下这个问题:
设置:
我需要使用 SSE 同时对来自 4 个数组的 4 个 32 位值进行 ADD 和一些位操作。这 4 个数组中的所有元素都是整数大小(32 位)。结果进入第 5 个数组。
所以我的问题是:
- 我需要包含哪些头文件和编译器标志才能使用 C 运行 SSE?
- Paul 提供的示例代码是否仍然有效?
另一个问题,如果我需要从整数 A 中读取最后一位,从整数 B 中读取第一位,并将整数 C 中的最后一位和第一位替换为我刚刚读取的值,我可以在这里使用 SSE 吗?或者有什么快速的方法吗?而不是正常情况下的 3 次访问?
Paul 提供的代码
#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
}
【问题讨论】:
-
请注意,对于
_mm_load_si128(),不能保证数组正确对齐,这要求其操作数是 16 字节对齐的。大多数编译器只会将int32_t对齐到 4 字节边界。 -
_mm_loadu_si128允许您从未对齐的内存中加载。数组上不需要__declspec(align(16))或__attribute__((aligned(16))。
标签: c assembly sse simd intrinsics