我尝试写一个int数组中的随机位置。 为了确保我可以在随机位置访问内存,我试图对齐整个内存块。
int * array = memalign(16384*2,16384*sizeof(short));
后来我在这样的矢量中写道:
__m128i * index = (__m128i *) &array[RANDOMNUMBER];
_mm_store_si128(index+, ...)
此指令导致访问不良。如果我使用_mm_storeu_si128
指令,我就无法得到它。
有人可以解释一下为什么这不起作用吗?
答案 0 :(得分:2)
_mm_store_si128
的参数必须是16字节对齐的。随机选择的int数组元素只是sizeof(int)-aligned(即使数组本身是16字节对齐的)。因此,您必须确保数组中的索引是(16/sizeof(int))
的倍数,例如像这样:
__m128i * index = (__m128i *) &array[(RANDOMNUMBER / (16/sizeof(int))) * (16/sizeof(int))];
这将保证写入正确对齐。这是否是您的代码真正需要做的另一个问题......