计算触发器

标签 c compiler-optimization flops

我正在编写一个程序来计算我的 CPU 执行一个“FLops”所花费的持续时间。为此,我写了下面的代码

before = clock();
y= 4.8;
x= 2.3;
z= 0;
for (i = 0; i < MAX; ++i){
 z=x*y+z;
}
printf("%1.20f\n", ( (clock()-before )/CLOCKS_PER_SEC )/MAX);

重复相同操作的问题。编译器不会优化这种“东西”吗?如果是这样,我必须做什么才能获得正确的结果?

我没有使用“rand”函数,所以它不会与我的结果冲突。

最佳答案

这有一个循环携带的依赖性并且没有足够的东西可以并行执行,所以即使有任何东西被执行,它也不会是你正在测量的 FLOPs,你可能会测量 float 的延迟添加。循环携带的依赖链序列化所有这些添加。该链有一些带有乘法的小侧链,但它们不依赖于任何东西,所以只有它们的吞吐量很重要。但在任何合理的处理器上,该吞吐量将优于添加的延迟。

要实际测量 FLOP,没有单一的方法。最佳条件在很大程度上取决于微体系结构。你需要的独立依赖链的数量,最佳的加/乘比,你是否应该使用 FMA,这一切都取决于。通常你必须做一些比你写的更复杂的事情,如果你开始使用高级语言,你必须以某种方式欺骗它实际做任何事情。

有关灵感,请参阅 how do I achieve the theoretical maximum of 4 FLOPs per cycle?

关于计算触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28840271/

相关文章:

c - 确定我们的 ASM 程序的 FLOPS

c - fgetpos() 行为取决于换行符

c++ - 优化期间对有符号和无符号整数进行别名

c++ - 如何计算FOP总数和特殊运算的浮点性能(exp sin sqrt)?

C++ 优化 : avoid a copy operation

performance - switch 和 if 一样糟糕吗?

编译器优化对使用 PAPI 的 FLOP 和 L2/L3 缓存未命中率的影响

c - 无法使用 CMake 编译 libwebsockets?

c++ - 为什么地址零用于空指针?

c - 如何将 c 字符串转换为其在 c 中的转义版本?