gpt4 book ai didi

c++ - mac 和相对强大的桌面之间令人费解的性能差异

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:44 24 4
gpt4 key购买 nike

我编写这段代码的初衷是衡量函数操作整个数组与操作数组的单个元素时的性能差异。

即比较以下两个语句:

function_vector(x, y, z, n); 

对比

for(int i=0; i<n; i++){
function_scalar(x[i], y[i], z[i]);
}

其中 function_* 进行一些实质性但相同的计算。

打开 -ffast-math 后,标量版本在我测试过的多台机器上大约快 2 倍。

然而,令人费解的是两台不同机器上的时间比较,都使用 gcc 6.3.0:

# on desktop with Intel-Core-i7-4930K-Processor-12M-Cache-up-to-3_90-GHz
g++ loop_test.cpp -o loop_test -std=c++11 -O3
./loop_test
vector time = 12.3742 s
scalar time = 10.7406 s

g++ loop_test.cpp -o loop_test -std=c++11 -O3 -ffast-math
./loop_test
vector time = 11.2543 s
scalar time = 5.70873 s


# on mac with Intel-Core-i5-4258U-Processor-3M-Cache-up-to-2_90-GHz
g++ loop_test.cpp -o loop_test -std=c++11 -O3
./loop_test
vector time = 2.89193 s
scalar time = 1.87269 s

g++ loop_test.cpp -o loop_test -std=c++11 -O3 -ffast-math
./loop_test
vector time = 2.38422 s
scalar time = 0.995433 s

无论如何,第一台机器在缓存大小、时钟速度等方面都更胜一筹。代码在第二台机器上的运行速度仍然快 5 倍。

问题:

这能解释一下吗?还是我在这里做错了什么?

代码链接:https://gist.github.com/anandpratap/262a72bd017fdc6803e23ed326847643

编辑

根据 ShadowRanger 的评论,我将 __restrict__ 关键字添加到 function_vector-march=native 编译标志。这给出:

# on desktop with Intel-Core-i7-4930K-Processor-12M-Cache-up-to-3_90-GHz
vector time = 1.3767 s
scalar time = 1.28002 s

# on mac with Intel-Core-i5-4258U-Processor-3M-Cache-up-to-2_90-GHz
vector time = 1.05206 s
scalar time = 1.07556 s

最佳答案

很可能指针别名限制了向量化情况下的优化。

尝试将 function_vector 的声明更改为:

void function_vector(double *__restrict__ x, double *__restrict__ y, double *__restrict__ z, const int n){

使用g++'s non-standard support用于特征匹配 C99's restrict keyword .

如果没有它,function_vector 可能不得不假设对 x[i] 的写入可能会修改 y 中的值z,因此它无法进行预读以获取值。

关于c++ - mac 和相对强大的桌面之间令人费解的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42870816/

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