随机存取与SSE对齐的存储器

random access aligned memory with SSE

本文关键字:存储器 对齐 SSE 随机存取      更新时间:2023-10-16

我试着写在一个int数组中的随机位置。为了确保我可以在随机位置访问内存,我尝试对齐整个内存块。

int * array = memalign(16384*2,16384*sizeof(short));

之后我在向量中这样写:

__m128i * index = (__m128i *) &array[RANDOMNUMBER];
_mm_store_si128(index+, ...) 

该指令导致访问错误。如果我用_mm_storeu_si128指令,我不会得到它。有人能解释一下为什么这行不通吗?

_mm_store_si128的参数必须为16字节对齐。整数数组中随机选择的元素只会被sizeof(int)对齐(即使数组本身是16字节对齐)。因此,您必须确保数组的索引是(16/sizeof(int))的倍数,例如:

__m128i * index = (__m128i *) &array[(RANDOMNUMBER / (16/sizeof(int))) * (16/sizeof(int))];

这将保证写操作被正确对齐。这是否是你的代码真正需要做的是另一个问题…