【发布时间】:2016-05-08 03:26:59
【问题描述】:
目前我正在尝试使用 SSE 将整数数组加载到 SIMD 寄存器中。
我有一个对齐的 32 位整数数组 Ai 并希望将 4 个连续元素加载到 SIMD 寄存器 Xi 中。但是,在执行_mm_load_si128 之后存储在Xi 中的值是垃圾,除了第一个。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <immintrin.h>
// number has to be divisible by 4 without remainder
#define VECTOR_SIZE 8
int main() {
__attribute__((aligned (16))) int32_t *Ai = (int32_t*) malloc(VECTOR_SIZE * sizeof(int32_t));
for(int i = 0; i < VECTOR_SIZE; i++) {
Ai[i] = rand() % 100000;
}
__m128i Xi;
for(int i = 0; i < VECTOR_SIZE; i+=4) {
Xi = _mm_load_si128((__m128i*) &Ai[i]);
// show content of Xi and Ai
for(int j = 0; j < 4; j++) {
printf("Xi[%d] = %d\t Ai[%d] = %d\n", j, Xi[j], i+j, Ai[i+j]);
}
}
free(Ai);
}
这是一个示例输出:
Xi[0] = 16807 Ai[0] = 16807
Xi[1] = 50073 Ai[1] = 75249
Xi[2] = 1489217992 Ai[2] = 50073
Xi[3] = 1346391152 Ai[3] = 43658
Xi[0] = 8930 Ai[4] = 8930
Xi[1] = 27544 Ai[5] = 11272
Xi[2] = 1489217992 Ai[6] = 27544
Xi[3] = 1346391168 Ai[7] = 50878
怎么了?
【问题讨论】:
-
如果您启用了编译器警告,您会注意到
Xi被视为long long int的向量,因此在您的printf()中,Xi[j]是long long int,这会导致printf("...%d...",...)的未定义行为需要int。在这种情况下,printf()会截断该值,这会导致它看起来像第一个值是正确的,但实际上不是。