gpt4 book ai didi

c - likely() 和 unlikely() 编译器提示的学习示例

转载 作者:太空狗 更新时间:2023-10-29 16:43:11 25 4
gpt4 key购买 nike

我如何向学生展示likelyunlikely 编译器提示 (__builtin_expect) 的可用性?

你能写一个示例代码吗,与没有提示的代码相比,有这些提示的代码会快几倍。

最佳答案

这是我使用的斐波那契数列的一个非常低效的实现:

#include <stdio.h>
#include <inttypes.h>
#include <time.h>
#include <assert.h>

#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)

uint64_t fib(uint64_t n)
{
if (opt(n == 0 || n == 1)) {
return n;
} else {
return fib(n - 2) + fib(n - 1);
}
}

int main(int argc, char **argv)
{
int i, max = 45;
clock_t tm;

if (argc == 2) {
max = atoi(argv[1]);
assert(max > 0);
} else {
assert(argc == 1);
}

tm = -clock();
for (i = 0; i <= max; ++i)
printf("fib(%d) = %" PRIu64 "\n", i, fib(i));
tm += clock();

printf("Time elapsed: %.3fs\n", (double)tm / CLOCKS_PER_SEC);
return 0;
}

为了演示,使用 GCC:

~% gcc -O2 -Dopt= -o test-nrm test.c
~% ./test-nrm
...
fib(45) = 1134903170
Time elapsed: 34.290s

~% gcc -O2 -Dopt=unlikely -o test-opt test.c
~% ./test-opt
...
fib(45) = 1134903170
Time elapsed: 33.530s

少了几百毫秒。这一 yield 归功于程序员辅助的分支预测。

但是现在,对于程序员真正应该做的事情:

~% gcc -O2 -Dopt= -fprofile-generate -o test.prof test.c
~% ./test.prof
...
fib(45) = 1134903170
Time elapsed: 77.530s /this run is slowed down by profile generation.

~% gcc -O2 -Dopt= -fprofile-use -o test.good test.c
~% ./test.good
fib(45) = 1134903170
Time elapsed: 17.760s

借助编译器辅助的运行时分析,我们设法从原来的 34.290 秒减少到 17.760 秒。比程序员辅助的分支预测要好得多!

关于c - likely() 和 unlikely() 编译器提示的学习示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2738835/

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