2013-01-24 112 views
2

我想学习一些基本的基准测试。我在我的Java程序就像一个循环,计算每秒浮点运算(FLOPS)和每秒整数运算(IOPS)

float a=6.5f; 
int b=3;  
for(long j=0; j<999999999; j++){    
     var = a*b+(a/b); 
    }//end of for 

我处理器约需0.431635秒处理此。我如何根据Flops(每秒浮点运算)和Iops(每秒整数运算)计算处理器速度?你能用一些步骤提供解释吗?

回答

1

你有999999999次迭代一个循环:让调用这个1E9(单十亿)的简单性。整数将在涉及两者的计算中被提升为浮点数,所以循环包含3个浮点运算:一个mult,一个add和一个div,所以有3e9。这需要0.432s,所以你显然会得到约6.94 GFLOP/s(3e9/0.432)。同样,每循环迭代你正在做1个整数运算(j++),所以你得到1e9/0.432或大约2.32 GIOP/s。

然而,计算a*b+(a/b)是循环不变,所以这将是相当令人吃惊,如果这没有得到优化。我对Java没有太多了解,但是任何C编译器都会在编译时评估它,删除ab变量和循环,并且(有效地)用var=21.667;替换整个批次。这是一个非常基本的优化,所以如果javac也没有这样做,我会感到很惊讶。

我不知道什么是Java中的引擎盖下怎么回事,但我很怀疑得到7个GFLOPS的。现代英特尔CPU(我假设这就是你所拥有的)原则上每个时钟周期能够使用正确的指令组合(每个周期一个加法和一个加法),因此对于3 GHz 4核CPU,甚至可以在理想条件下获得3e9 * 4 * 8 = 96个单精度GFLOP。各种muladd指令具有1个周期的倒数吞吐量,但div时间超过十倍长,所以我会很可疑变得比约CLK/12 FLOPS以上(标量划分在单个核心)的一次如果编译器足够聪明,可以对代码进行矢量化和/或并行化,以获得更多的功能,那么它肯定会足够聪明,以优化整个循环。

总之,我怀疑是循环被优化掉完全和0.432秒你看到的就是多余的。你没有给出任何迹象表明你是如何计算上述循环的,所以我不能确定。您可以通过用1e10替换〜1e9循环迭代来检查自己。如果它不需要大约10倍的时间,那么你就不能计算你认为你计时的东西。

还有很多更多要说的基准和分析,但我会留在这。

我知道这是非常晚,但我希望它可以帮助别人。

Emmet。