像“float[10][10]”这样初始化的数组是否已针对 SIMD/SSE 进行内存对齐?

Jie*_*eng 2 c++ sse simd

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

*x = (float*)memalign(16, size * sizeof(float));
Run Code Online (Sandbox Code Playgroud)

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

static float m1[SIZE][SIZE];
Run Code Online (Sandbox Code Playgroud)

已经对齐了吗?(SIZE是一个整数)

Jas*_*n R 5

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

static float m1[SIZE][SIZE] __attribute__((aligned(16)));
Run Code Online (Sandbox Code Playgroud)

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