C++ 是否已针对SIMD/SSE将数组初始化为'float[10][10]`这样的内存对齐?

C++ 是否已针对SIMD/SSE将数组初始化为'float[10][10]`这样的内存对齐?,c++,sse,simd,C++,Sse,Simd,我需要使用SIMD/Intel SSE优化我的矩阵乘法。给出的示例代码如下所示: *x = (float*)memalign(16, size * sizeof(float)); 但是,我使用C++和[发现] [1 ] i而不是MALOC,在做SIMD之前,我应该使用新的。现在,我正在通过SIMD/SSE进一步优化,所以我需要对齐的内存,所以问题是:我需要memalign/\u aligned\u malloc还是我的数组声明为 static float m1[SIZE][SIZE]; 已经

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

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

但是,我使用C++和[发现] [1 ] i而不是MALOC,在做SIMD之前,我应该使用新的。现在,我正在通过SIMD/SSE进一步优化,所以我需要对齐的内存,所以问题是:我需要memalign/\u aligned\u malloc还是我的数组声明为

static float m1[SIZE][SIZE];

已经对齐了吗?大小是int

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

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

或者,您可以使用posix_memalign、memalign或平台上提供的其他对齐分配API来获得具有所需对齐方式的内存块。最坏的情况是,甚至可以使用标准的Maloc或运算符new分配内存,然后自己处理对齐调整。

,它们通常不会是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++来调用它。另外请注意,如果你想让每个数组行对齐,那么大小需要是4的倍数。我假设你和OP都知道这一点-我只是为这个问题的未来读者添加它。嗯,现在我需要在堆上分配内存。。。我想我需要转换成float*m1=new float[SIZE*SIZE]现在_属性_aligned16部分如何适应?如果你是从堆中分配,你会使用一个类似memalign的函数,就像你在原始问题中提到的那样。在这种情况下,您不想使用运算符new,除非您已经使用一个对齐的工具重写它来分配底层内存?我是说GCC是C++的,g++是C++的吗?既然我使用C++,那么我就为G++做了吗?我会试试的。GCC前端实际上支持C和C++。它将基于源文件的扩展来切换模式,即,将期望.c文件是C和.cc或.cpp文件为C++。如果你想成为C++显式的,那么你可以用g++来调用它。另外请注意,如果你想让每个数组行对齐,那么大小需要是4的倍数。我假设你和OP都知道这一点-我只是为这个问题的未来读者添加它。嗯,现在我需要在堆上分配内存。。。我想我需要转换成float*m1=new float[SIZE*SIZE]现在_属性_aligned16部分如何适应?如果你是从堆中分配,你会使用一个类似memalign的函数,就像你在原始问题中提到的那样。在这种情况下,您不希望使用operator new,除非您已经重写它,以便使用一个对齐的工具来分配底层内存。