如何对齐16位整数以与SSE内在函数一起使用

SMi*_*Mir 2 c sse simd memory-alignment sse2

我正在使用定义为16位整数的二维数组

int16_t e[MAX_SIZE*MAX_NODE][MAX_SIZE];
int16_t C[MAX_SIZE][MAX_SIZE];
Run Code Online (Sandbox Code Playgroud)

其中Max_SIZEMAX_NODE是恒定值.我不是一个专业的程序员,但是在StackOverflow的人的帮助下,我设法写了一段代码,在我的数据上部署SSE指令并实现了显着的加速.目前,我正在使用不需要数据对齐的内在函数(主要_mm_loadu_si128_mm_storeu_si128).

for (b=0; b<n; b+=8){
    v1 = _mm_loadu_si128((__m128i*)&C[level][b]); // level defined elsewhere.
    v2 = _mm_loadu_si128((__m128i*)&e1[node][b]); // node defined elsewhere.
    v3 = _mm_and_si128(v1,v2);
    _mm_storeu_si128((__m128i*)&C[level+1][b],v3);
}
Run Code Online (Sandbox Code Playgroud)

当我将内在函数更改为对齐数据(即_mm_load_si128_mm_store_si128)时,我得到运行时错误,这导致我假设我的数据没有正确对齐.

我现在的问题是,如果我的数据没有正确对齐,我如何调整它以便能够使用相应的内在函数?我想因为整数是16位,它们会自动对齐.但我似乎错了!

任何有关这方面的见解将受到高度赞赏.

谢谢!

rot*_*lup 8

SSE需要数据在16 字节边界上对齐,而不是16 ,这是你的问题.

您正在寻找的对齐静态数组的依赖于编译器.

如果您正在使用MSVC,则必须使用__declspec(align(16)),或者使用GCC,这将是__attribute__((aligned (16))).

  • 请注意,使用`malloc`或`new`分配`__declspec(align(16))`结构并不能保证能够将对齐到16字节的内容,所以在使用它们时需要非常小心.使用`posix_memalign`(在POSIX中)或`_aligned_malloc`(在VC++中)可能更好. (3认同)