gpt4 book ai didi

c++ - 解释需要 : log10 faster than log and log2, 但仅限于 O2 和更大

转载 作者:IT老高 更新时间:2023-10-28 12:46:10 24 4
gpt4 key购买 nike

我需要在我的一些代码中使用对数函数,但底数无关紧要。所以我开始在 log()log2()log10() 之间按性能进行选择,前提是我发现任何显着差异。 (我将这些函数分别称为 lnlblg)。

我为什么要对此大惊小怪?因为我将在优化算法的每次迭代中调用该函数多达 400,000,000 次。这既不是可选的,也不是我的问题的主题。

我设置了一些非常基本的测试,如下所示:

timespec start, end;
double sum = 0, m;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
for (int n = 1; n < INT_MAX; ++n)
{
m = n * 10.1;
sum += log(m);
}
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);

cout << "ln=";
cout << diff(start, end).tv_sec << ":" << diff(start, end).tv_nsec << endl;

... // likewise for log2 and log10

(timespec diff(timespec start, timespec end) 如果你愿意的话....)

得到以下结果:

GCC v4.6.3

-O0
ln=140:516853107
lb=155:878100147
lg=173:534086352

-O1
ln=133:948317112
lb=144:78885393
lg=163:870021712

-O2
ln=9:108117039
lb=9:134447209
lg=4:87951676

-O3
ln=9:102016996
lb=9:204672042
lg=4:153153558

我查看了使用 -S 编译的输出,但我对汇编程序的掌握还不够好,无法完全理解其中的差异。 -S 输出:-O0 -S , -O3 -S

为什么 lg 使用 O2/O3 优化得更好?

编辑:Source code ,请注意第三个循环中的错字,这是 log10 看起来更快的原因(mult. 得到优化)。我已经接受了我认为最接近的答案,因为问题现已结束,尽管我从 drhirsch 和 janneb 的答案中学到了很多东西。

最佳答案

这将取决于 C 库中 log() 函数的实现、编译器版本、硬件架构等。无论如何,下面我在 x86-64 上使用 GCC 4.4 和 glibc 2.11。

更改示例以便我添加一行

cout << "sum=" << sum << endl;

这会阻止编译器优化 log() 调用,正如我在评论中提到的,我得到以下时间(仅整秒,-O2):

  • 日志:98 秒
  • log2:105 秒
  • log10:120 秒

这些时间似乎与原帖中的 -O0 和 -O1 时间大致一致;在更高的优化级别,日志评估被优化掉,因此 -O2 和 -O3 的结果是如此不同。

此外,使用“perf”分析器查看日志示例,报告中排名前 5 的违规者是


# Samples: 3259205
#
# Overhead Command Shared Object Symbol
# ........ .............. ......................... ......
#
87.96% log /lib/libm-2.11.1.so [.] __ieee754_log
5.51% log /lib/libm-2.11.1.so [.] __log
2.88% log ./log [.] main
2.84% log /lib/libm-2.11.1.so [.] __isnan
0.69% log ./log [.] log@plt

除了 main 之外,所有其他符号都与 log() 调用有关。总结这些,我们可以得出结论,这个示例的总运行时间的 97% 都花在了 log() 中。

__ieee754_log的实现见here in the glibc git repo .相应地,其他实现是:log2 , log10 .请注意,之前的链接指向 HEAD 版本,对于已发布的版本,请参阅其相应的分支

关于c++ - 解释需要 : log10 faster than log and log2, 但仅限于 O2 和更大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10810105/

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