【问题标题】:Calculating FLops计算 FLOP
【发布时间】:2015-03-05 04:16:21
【问题描述】:

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

【问题讨论】:

  • 您需要声明double beforedouble after,然后使用before = (double)clock();(您错过了after),或者将计算转换为(double)(after - before) / CLOCKS_PER_SEC / MAX
  • 在更高的优化级别,如果退出循环后不使用计算出的z,编译器很可能会注意到这一点并消除整个计算。

标签: c compiler-optimization flops


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-14
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多