我正在处理定义为
的16位整数的二维数组int16_t e[MAX_SIZE*MAX_NODE][MAX_SIZE];
int16_t C[MAX_SIZE][MAX_SIZE];
其中Max_SIZE
和MAX_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);
}
当我将内在函数更改为对齐数据(即_mm_load_si128
和_mm_store_si128
)时,我得到运行时错误,这导致我假设我的数据未正确对齐。
现在我的问题是,如果我的数据没有正确对齐,我如何调整它以便能够使用相应的内在函数?我想因为整数是16位,它们会自动对齐。但我似乎错了!
对此的任何见解都将受到高度赞赏。
谢谢!
答案 0 :(得分:8)
SSE需要在16个字节边界上对齐数据,而不是16个位,这就是你的问题。
您想要对齐静态数组的依赖于编译器。
如果您使用的是MSVC,则必须使用__declspec(align(16))
,或使用GCC,这将是__attribute__((aligned (16)))
。