初始化为“float[10][10]”的数组是不是已经为 SIMD/SSE 对齐内存?
Posted
技术标签:
【中文标题】初始化为“float[10][10]”的数组是不是已经为 SIMD/SSE 对齐内存?【英文标题】:Are arrays initialized like `float[10][10]` already memory aligned for SIMD/SSE?初始化为“float[10][10]”的数组是否已经为 SIMD/SSE 对齐内存? 【发布时间】:2012-10-03 13:33:41 【问题描述】:我需要使用 SIMD/英特尔 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
是一个整数)
【问题讨论】:
【参考方案1】:通常,它们不会是 16 字节对齐的,尽管 C++ 规范中没有任何内容会阻止您的编译器在 16 字节边界上对齐这样的数组。根据您使用的编译器,通常有一种特定于编译器的方式来请求数组在 16 字节边界上对齐。例如,对于gcc
,您可以使用:
static float m1[SIZE][SIZE] __attribute__((aligned(16)));
或者,您可以使用posix_memalign()
、memalign()
或您平台上可用的其他对齐分配 API 来获取具有所需对齐的内存块。在最坏的情况下,您甚至可以使用标准的malloc()
或operator new
分配内存,然后自己处理对齐调整。
【讨论】:
我正在使用g++
与我想的一样吗?我的意思是gcc
是针对C 而g++
是针对C++?由于我使用的是 C++,所以我为g++
这样做?我会试试的。
gcc
前端实际上同时支持 C 和 C++。它将根据源文件的扩展名切换模式(即,它将期望 .c
文件为 C,.cc
或 .cpp
文件为 C++)。如果您想成为 C++ 显式,那么您可以将其调用为 g++
。
还请注意,如果您希望每个数组行对齐,SIZE 需要是 4 的倍数(我假设您和 OP 都知道这一点 - 我只是为将来添加它这个问题的读者)。
嗯,现在我需要在堆上分配内存......我想我需要转换为 float* m1 = new float[SIZE*SIZE]
__attribute__((aligned(16)))
部分现在如何适应?
如果您从堆中分配,您将使用memalign()
-like 函数之一,就像您在原始问题中提到的那样。在这种情况下,您不希望使用 operator new
,除非您已使用其中一种对齐的设施覆盖它以分配底层内存。以上是关于初始化为“float[10][10]”的数组是不是已经为 SIMD/SSE 对齐内存?的主要内容,如果未能解决你的问题,请参考以下文章