Optimization gcc内存对齐pragma

Optimization gcc内存对齐pragma,optimization,memory,gcc,alignment,pragma,Optimization,Memory,Gcc,Alignment,Pragma,gcc是否有内存对齐pragma,类似于英特尔编译器中的#pragma vector aligned? 我想告诉编译器使用对齐的加载/存储指令优化特定的循环。为了避免可能的混淆,这与结构打包无关 e、 g: #如果已定义(uu英特尔编译器) #pragma向量对齐 #恩迪夫 对于(int a=0;a

gcc是否有内存对齐pragma,类似于英特尔编译器中的
#pragma vector aligned
? 我想告诉编译器使用对齐的加载/存储指令优化特定的循环。为了避免可能的混淆,这与结构打包无关

e、 g:

#如果已定义(uu英特尔编译器)
#pragma向量对齐
#恩迪夫
对于(int a=0;a

谢谢

您可以告诉GCC,指针指向对齐的内存,方法是使用typedef创建一个可以声明指针的过度对齐类型

这有助于gcc,但不适用于clang7.0或ICC19,请参阅它们发出的x86-64非AVX asm。(只有GCC将加载折叠到
mulps
的内存操作数中,而不是使用单独的
movups
)。如果您希望可移植地向GNUC编译器传递对齐承诺,而不是GCC本身,则必须使用
\u内置\u假定\u对齐


typedef双对齐双属性(对齐(16));
//注:sizeof(对齐双精度)是8,而不是16
空一些函数(对齐的双精度*x,对齐的双精度*y,整数n)
{
对于(int i=0;i
这不会使
对齐\u的宽度增加一倍。这将使其与16字节边界对齐,或者更确切地说,数组中的第一个边界将是。看看我的计算机上的反汇编,只要我使用对齐指令,我就开始看到很多向量运算。我目前正在使用一台Power architecture计算机,所以它是altivec代码,但我认为这符合您的要求

(注意:我测试这个时没有使用
double
,因为altivec不支持双浮动。)


您可以在这里看到其他一些使用type属性的自动矢量化示例:

我用g++版本4.5.2(Ubuntu和Windows)尝试了您的解决方案,但它没有对循环进行矢量化

如果删除了“路线”属性,则该属性将使用未对齐的载荷对循环进行矢量化

如果函数是内联的,这样就可以在消除指针的情况下直接访问数组,那么将使用对齐的加载对其进行矢量化

在这两种情况下,“对齐”属性都会阻止矢量化。这是具有讽刺意味的:“aligned_double*x”本应支持矢量化,但事实恰恰相反

哪个编译器为您报告了矢量化循环?我怀疑它不是一个gcc编译器

gcc是否有内存对齐pragma,类似于#pragma向量对齐

新版本的GCC似乎有:

内置函数:
void*\uu内置假定\u对齐(const void*exp,size\u t align,…)

此函数返回其第一个参数,并允许编译器假定返回的指针至少对齐字节。 这个内置函数可以有两个或三个参数,如果有三个, 第三个参数应为整数类型,如果为非零 指未对准偏移量。例如:

void *x = __builtin_assume_aligned (arg, 16);
意味着编译器可以假设x(设置为arg)至少是16字节对齐的,而:

void *x = __builtin_assume_aligned (arg, 32, 8);
这意味着编译器可以为x假设(char*)x-8是32字节对齐的,设置为arg


根据2010年前后关于堆栈溢出的一些其他问题和答案,GCC 3和早期GCC 4中似乎没有内置的。但我不知道分界点在哪里。

也不知道。我有一个编译器无法确定对齐方式的数组。我必须特别说明如何使用对齐的加载和存储。它不是编译器选项,必须是pragma,才能对每个单独的循环进行向量化。为什么不能在数组上使用变量属性?数组是malloced,加上数组的结构非常复杂。具体来说,它是一个四维的张力,您可以在类型上放置对齐,而不是变量。类型是double*。如果我把对齐放在上面,我得到的就是指针变量对齐。阵列是手动对齐的,没有办法。英特尔pragma专门告诉编译器使用loadpd指令。我需要同等的gcc
void *x = __builtin_assume_aligned (arg, 16);
void *x = __builtin_assume_aligned (arg, 32, 8);