我正在编写一个程序来计算我的 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/