gpt4 book ai didi

c++ - gcc 自动矢量化在缩减循环中失败

转载 作者:太空狗 更新时间:2023-10-29 23:04:51 25 4
gpt4 key购买 nike

我正在尝试使用自动矢量化标志编译我的代码,但我在一个非常简单的归约循环中遇到了失败:

double node3::GetSum(void){
double sum=0.;
for(int i=0;i<8;i++) sum+=c_value[i];
return sum;
}

c_value[i] 数组定义为

class node3{
private:
double c_value[9];

自动矢量化编译返回: 分析 node3.cpp:10 处的循环

node3.cpp:10: note: step unknown.
node3.cpp:10: note: reduction: unsafe fp math optimization: sum_6 = _5 + sum_11;

node3.cpp:10: note: Unknown def-use cycle pattern.
node3.cpp:10: note: Unsupported pattern.
node3.cpp:10: note: not vectorized: unsupported use in stmt.
node3.cpp:10: note: unexpected pattern.
node3.cpp:8: note: vectorized 0 loops in function.

node3.cpp:10: note: Failed to SLP the basic block.
node3.cpp:10: note: not vectorized: failed to find SLP opportunities in basic block.

我真的不明白为什么它不能确定例如 SLP 的基本 block 。此外,我想我不明白“在 stmt 中不受支持的使用”到底是什么:这里的循环只是对顺序访问数组求和。

会不会是c_value[]定义在类的private中导致的?

提前致谢。

注意:编译为 g++ -c -O3 -ftree-vectorizer-verbose=2 -march=native node3.cpp 并尝试使用更具体的 -march=corei7 但结果相同。 GCC 版本:4.8.1

最佳答案

我设法在最后使用以下技巧对循环进行矢量化:

double node3::GetSum(void){
double sum=0.,tmp[8];
tmp[0]=c_value[0]; tmp[1]=c_value[1]; tmp[2]=c_value[2]; tmp[3]=c_value[3];
tmp[4]=c_value[4]; tmp[5]=c_value[5]; tmp[6]=c_value[6];tmp[7]=c_value[7];
for(int i=0;i<8;i++) sum+=tmp[i];
return sum;
}

我在其中创建了虚拟数组 tmp[]。这个技巧,连同另一个编译标志,即 -funsafe-math-optimizations(@Mysticial:这实际上是我唯一需要的,-ffast-math 和其他东西我显然不需要),使自动矢量化成功。

现在,我真的不知道这个解决方案是否真的加快了执行速度。它确实矢量化,但我添加了一个分配操作,所以我不确定这是否应该运行得更快。我的感觉是,从长远来看(多次调用该函数)它确实会加速一点,但我无法证明这一点。无论如何,这是矢量化问题的可能解决方案,所以我发布了一个答案。

关于c++ - gcc 自动矢量化在缩减循环中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21306823/

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