2

我正在编写一个程序来计算我的 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”函数,所以它不会与我的结果冲突。

4

2 回答 2

1

这具有循环携带的依赖性并且没有足够的东西可以并行执行,因此即使根本执行了任何操作,也不会是您正在测量的 FLOP,这样您可能会测量浮点加法的延迟。循环携带的依赖链将所有这些添加序列化。该链有一些带有乘法的小侧链,但它们不依赖于任何东西,所以只有它们的吞吐量很重要。但是,该吞吐量将优于任何合理处理器上添加的延迟。

要实际测量 FLOP,没有单一的配方。最佳条件很大程度上取决于微架构。您需要的独立依赖链的数量、最佳的 add/mul 比率、是否应该使用 FMA,这一切都取决于。通常你必须做一些比你写的更复杂的事情,如果你打算使用高级语言,你必须以某种方式欺骗它,让它真正做任何事情。

要获得灵感,请参阅如何实现每个周期 4 次 FLOP 的理论最大值?

于 2015-03-04T20:10:24.760 回答
0

即使您没有进行编译器优化(已经很好地列出了可能性),您的变量和结果将在第一次循环迭代之后缓存在缓存中,然后以比您更快的速度和性能在赛道上,如果程序必须为每次迭代获取新值。

因此,如果您想计算该程序单次迭代的单次翻牌时间,您实际上必须为每次迭代提供新的输入。真正考虑使用 rand() 并且只使用已知值srand(1)左右的种子。

你的计算也应该不同;flops 是您的程序在您的情况下执行的计算次数 2*n(其中 n = MAX)。计算每次翻牌所用的时间除以翻牌数量所用的时间。

于 2015-03-04T08:04:00.510 回答