2

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

int16_t e[MAX_SIZE*MAX_NODE][MAX_SIZE];
int16_t C[MAX_SIZE][MAX_SIZE];

其中Max_SIZEMAX_NODE是常数值。我不是专业的程序员,但不知何故,在 StackOverflow 的帮助下,我设法编写了一段代码,在我的数据上部署了 SSE 指令并实现了显着的加速。目前,我正在使用不需要数据对齐的内在函数(主要是_mm_loadu_si128and _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 位,它们会自动对齐。但是我好像错了!

对此的任何见解都将受到高度赞赏。

谢谢!

4

1 回答 1

8

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

您正在寻找对齐静态数组的内容取决于编译器。

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

于 2012-06-16T22:29:10.503 回答