数组初始化如`float [10] [10]`已经为SIMD / SSE对齐了内存?

时间:2012-10-03 13:33:41

标签: c++ sse simd

我需要使用SIMD / Intel SSE来优化矩阵乘法。给出的示例代码如下:

*x = (float*)memalign(16, size * sizeof(float));

但是,我使用C ++和[found that][1]我而不是malloc(在做SIMD之前),我应该使用new。现在,我通过SIMD / SSE进一步优化,所以我需要对齐的内存,所以问题是:我需要memalign / _aligned_malloc还是我的数组声明为

static float m1[SIZE][SIZE];

已经对齐了? (SIZE是一个int)

1 个答案:

答案 0 :(得分:4)

通常,它们不会是16字节对齐的,尽管C ++规范中没有任何内容可以阻止编译器在16字节边界上对齐这样的数组。根据您使用的编译器,通常有一种特定于编译器的方法来请求数组在16字节边界上对齐。例如,对于gcc,您可以使用:

static float m1[SIZE][SIZE] __attribute__((aligned(16)));

或者,您可以使用平台上可用的posix_memalign()memalign()或其他对齐分配API来获取具有所需对齐方式的内存块。在最坏的情况下,您甚至可以使用标准malloc()operator new分配内存,然后自己处理对齐调整。