GCC自动矢量化程序和类成员内存对齐

时间:2016-03-04 13:36:53

标签: gcc arm vectorization compiler-optimization memory-alignment

我遇到了一个奇怪的GCC自动化问题:当我在函数中使用局部变量时它工作正常,但是当我使用类成员时却没有。

这是一段显示问题的非常简单的代码。此代码矢量化没有问题:

__attribute__((aligned(64))) float afloat[409600];
afloat input;

for (int c=0; c<409600; c++)
{
    input[c] = 1;
}

现在,如果我将afloat input移到类定义中,代码要么不会进行矢量化,要么根据对齐检查生成多个代码变体。

我试图在Raspberry Pi 3(GCC 5.2.1,ARM Cortex A53)上编写一些非常繁重的代码,甚至对于一些使用少量数组的非常简单的代码,它会报告它& #39;生成它的9个不同版本(似乎没有一个被矢量化);当使用局部变量时,我只得到1个矢量化的版本。不幸的是我无法使用局部变量...

我在这里猜测,但我认为正在发生的是,对于局部变量,gcc知道它在堆栈上分配它们的位置,因此它知道它们是如何对齐的。对于类成员,即使gcc应该能够告诉它们如何相互对齐,gcc也不能知道类本身是否在16字节边界上对齐。 (我通过压倒新的来照顾它,但显然gcc没有看到那个)。在我通常在Windows上使用的英特尔IPP编译器中,#pragma vector aligned解决了这个问题。

所以,我的问题是:在这种情况下,如何让gcc生成优化(矢量化)代码?我有几百个,所以手动编写NEON代码并不是一个真正的选择。我尝试过使用__builtin_assume_aligned - 我使用的变量甚至是这个指针 - 但这并没有帮助。我猜测如果我能以某种方式告诉gcc该类是否正确对齐,它应该能够确定变量是如何对齐的,但我不认为这可能吗?

0 个答案:

没有答案