Https://godbolt.org/z/kvhkp9bse
)。如果我添加任何:
-fvect-cost-model=dynamic
-fvect-cost-model=cheap
-fvect-cost-model=very-cheap
然后它确实进行了矢量化,但这对我来说没有意义,因为
-fvect-cost-model=unlimited
是应该已经暗示的默认值,所以我不明白为什么设置会改变任何东西。为什么没有这个标志,这种自动行动是不是什么?为什么这个标志会改变这一点?请帮助我理解!Compile标志:
-fvect-cost-model=dynamic
Algorithm:
-std=c++20 -O3 -fopt-info-all-vec -ffast-math -march=core-avx2
GCC的自动向量器采用成本模型来评估矢量化循环是否会产生绩效收益。该模型评估了循环复杂性,数据依赖性和矢量化潜在开销等因素。在您的情况下,默认成本模型确定矢量化循环由于其复杂性而没有优势。但是,通过指定更具侵略性的成本模型(例如
void foo(const size_t n, float * __restrict__ a, float * __restrict__ b, float * __restrict__ c)
{
float total=0.0f;
float sum=0.0f;
float max=0.0f;
size_t count=0;
for (size_t i = 0; i < n; ++i) {
float temp = *b;
const bool not_zero = temp != 0.0;
if (i % 4 == 0) {
sum += *b * not_zero;
count += not_zero;
}
max = std::max(temp, max);
*b = temp * *c;
total += *b;
*a *= *b;
a += 1;
b += 1;
c += 1;
}
std::cout << total << sum << max << count;
}
),您可以降低矢量化的阈值,从而促使编译器矢量化循环。这种行为与GCC的设计一致,如其文档中所详细介绍。
Source: