这真的花了我的时间。我找不到一种简单的方法来估计后续代码(循环)的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;
}
...
}
它看起来很简单,但我对之前给出的其他一些数字感到困惑,所以如果有人能给出一个确切的数字会很棒。
感谢。
答案 0 :(得分:5)
我看到(按照日益复杂的顺序):
这些如何相互关联在很大程度上取决于CPU系列。
答案 1 :(得分:5)
尝试采用中间汇编代码或反编译exe。
然后计算所有浮点运算(在x86汇编代码中,它们以F
前缀FSIN
开头。
答案 2 :(得分:1)
我计算12加上一个sqrt(很可能使用Newton的方法,这是一个循环),但这取决于你没有指定的一些变量的数据类型,以及编译的结果(可能会增加更多,或优化一些操作。)
我在计算每个+,/, - 或*,其中表达式包含至少一个浮点变量,因此数组索引和循环不变量不计算,并且这些是整数运算。
答案 3 :(得分:0)
尝试使用像PAPI这样的性能测量库,它们可以为硬件计数器提供抽象,这是测量FLOPS的最佳选择。 PAPI_FLOPS。