计算代码的触发器!

时间:2011-03-16 19:30:12

标签: c++ c flops

这真的花了我的时间。我找不到一种简单的方法来估计后续代码(循环)的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 个答案:

答案 0 :(得分:5)

我看到(按照日益复杂的顺序):

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

这些如何相互关联在很大程度上取决于CPU系列。

答案 1 :(得分:5)

尝试采用中间汇编代码或反编译exe。

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

答案 2 :(得分:1)

我计算12加上一个sqrt(很可能使用Newton的方法,这是一个循环),但这取决于你没有指定的一些变量的数据类型,以及编译的结果(可能会增加更多,或优化一些操作。)

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

答案 3 :(得分:0)

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