我对此感到困惑/好奇,为什么这段代码
void maxArray(double* x, double* y) {
for (int i = 0; i < 65536; i++) {
x[i] = ((y[i] > x[i]) ? y[i] : x[i]);
}
}
这段代码有什么可以优化的地方吗?
void maxArray(double* x, double* y) {
for (int i = 0; i < 65536; i++) {
if (y[i] > x[i]) x[i] = y[i];
}
}
顺便提一下,第一个版本生成的汇编代码与扩展版本完全相同:
inline double fn(double a, double b) {
if (a > b) {
return a;
} else {
return b;
}
}
void maxArray(double* x, double* y) {
for (int i = 0; i < 65536; i++) {
x[i] = fn(y[i], x[i]);
}
}
我明白它们之间的区别。第一个是将x[i]
设置为条件,而中间的是有条件地设置x[i]
。虽然两者都有条件,但两者都有分支吗?是因为后面的扩展if语句被优化为向量指令max
,而前者由于某些原因没有被识别为最大值函数吗?
gcc 10.3 x86_64 -Ofast -march=native
-march=native
,这是用于托管 godbolt.org 的任意随机 CPU。 - MSaltersx
数组在只读内存中,但你知道它的条目都大于y
中的条目。第二个代码,严格来说,应该可以工作(并且什么也不做),因为测试从未为真,并且x[i]
从未被分配。但是第一个或第三个版本会崩溃。因此,即使编译器知道#1更快,它也不应将#2优化为#1的等效形式。 - Nate Eldredge