gpt4 book ai didi

gcc - 使用 GCC 进行循环版本控制

转载 作者:行者123 更新时间:2023-12-04 20:25:19 24 4
gpt4 key购买 nike

我正在使用 GCC 进行自动矢量化。由于客户要求,我无法使用内在函数或属性。 (我无法获得用户输入以支持矢量化)

如果可以向量化的数组的对齐信息未知,GCC 会调用“循环版本控制”的传递。在树上完成循环矢量化时将执行循环版本控制。当循环被识别为可向量化时,并且数据对齐或数据依赖的约束阻碍了它(因为它们无法在编译时确定),那么将生成两个版本的循环。这些是循环的矢量化和非矢量化版本,以及运行时检查对齐或依赖以控制执行哪个版本。

我的问题是我们必须如何强制执行对齐?如果我找到了一个可矢量化的循环,我不应该因为缺少对齐信息而生成两个版本的循环。

例如。考虑下面的代码

short a[15]; short b[15]; short c[15];
int i;

void foo()
{
for (i=0; i<15; i++)
{
a[i] = b[i] ;
}
}

树转储(选项:-fdump-tree-optimized -ftree-vectorize)
<SNIP>
vector short int * vect_pa.49;
vector short int * vect_pb.42;
vector short int * vect_pa.35;
vector short int * vect_pb.30;

bb 2>:
vect_pb.30 = (vector short int *) &b;
vect_pa.35 = (vector short int *) &a;
if (((signed char) vect_pa.35 | (signed char) vect_pb.30) & 3 == 0) ;; <== (A)
goto <bb 3>;
else
goto <bb 4>;

bb 3>:
</SNIP>

在 'bb 3' 版本的矢量化代码被生成。在 'bb 4' 生成没有矢量化的代码。这些是通过检查对齐(语句“A”)来完成的。现在不使用内部函数和其他属性,我应该如何只获得矢量化代码(没有这个运行时对齐检查。)

最佳答案

如果有问题的数据是静态分配的,那么您可以使用 __align__ GCC 支持的属性,用于指定它应该与必要的边界对齐。如果您正在动态分配这些数组,您可以通过对齐值进行过度分配,然后将返回的指针提高到您需要的对齐方式。

您也可以使用 posix_memalign()如果您在支持它的系统上运行。最后,请注意 malloc()将始终分配与最大内置类型的大小对齐的内存,通常为 double 型的 8 个字节。如果您不需要比这更好的,那么 malloc应该足够了。

编辑:如果您修改分配代码以强制该检查为真(即过度分配,如上所述),则编译器应不条件化循环代码。如果您需要对齐 8 字节边界,看起来就像 a = (a + 7) & ~3; .

关于gcc - 使用 GCC 进行循环版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1705468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com