6

这真的很花时间。我找不到一种简单的方法来估计以下代码(循环)的 FLOPS,循环的单次迭代有多少 FLOPS:

float func(float * atominfo, float energygridItem, int xindex, int yindex)
{
   ...
   for (atomid=0; atomid<numatoms*4; atomid+=4) 
   {
       float dy = coory - atominfo[atomid+2];
       float dysqpdzsq = (dy * dy) + atominfo[atomid+3];
       float dx1 = coorx1 - atominfo[atomid+1];

       float s, y, t;
       s = atominfo[atomid] * (1.0f / sqrtf(dx1*dx1 + dysqpdzsq));
       y = s - energycomp1;
       t = energyvalx1 + y;
       energycomp1 = (t - energyvalx1)  - y;
       energyvalx1 = t;
    }
    ...
}

它看起来很简单,但我对前面给出的其他一些数字感到困惑,所以如果有人能给出一个确切的数字,那就太好了。

谢谢。

4

4 回答 4

6

我看到(按照复杂性增加的顺序):

  • 8 个加法(包括减法)
  • 3 次乘法
  • 1 倒数平方根

它们之间的关系在很大程度上取决于 CPU 系列。

于 2011-03-16T19:34:15.400 回答
5

尝试获取中间汇编代码或反编译 exe。

然后计算所有浮点运算(在 x86 汇编代码中,它们以F前缀 like开头FSIN)。

于 2011-03-16T19:36:21.177 回答
1

我数了 12 加上一个 sqrt(这可能是使用牛顿法,这是一个循环),但这取决于您没有指定的一些变量的数据类型,以及编译的结果(可能会添加更多,或者优化一些操作)。

我计算每个 +、/、- 或 *,其中表达式包含至少一个浮点变量,因此数组索引和循环不变量不计算在内,这些是整数运算。

于 2011-03-16T19:38:40.413 回答
0

尝试使用像 PAPI 这样的性能测量库,它们为硬件计数器提供抽象,这将是你测量 FLOPS 的最佳选择。PAPI_FLOPS。

于 2011-03-16T20:15:58.770 回答