初始化为“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 对齐内存?的主要内容,如果未能解决你的问题,请参考以下文章

将数组的所有元素初始化为相同的数字

如何将 List<T> 初始化为给定大小(而不是容量)?

关于memset()

c语言中三维数组怎样初始化为0

c语言中怎么把一维数组初始化为全零啊,不用循环

为什么全局变量一定要初始化?