0

我最近尝试制作一个计算 FLOPS 的简单程序。由于c++速度足够快,所以我认为值得一试以获得接近的结果。
当我使用 Notepad++ 插件编译它时NppExec,它工作正常,但我没有构建它。当我在 CodeBlocks 中构建和运行时,它会不断迭代并且不会完成该过程。所以我回到记事本++并再次编译它,然后这次我运行它工作正常,迭代只过了一秒钟。

 #include<iostream>
 #include<conio.h>
 #include<ctime>
 #include<iomanip>

 using namespace std;

 int main(){

     float a=1.0,b=2.0,var,j;
     double flop;
     clock_t start,end;

     cout<<"\n Iterating...";

     start=clock();

     for(j=0;j<999999999;j++){    // Iterates 999999999 times
         var=a*b+a/b;             // <-- 5 Flops, or am I wrong?
     }

     end=clock();

     cout<<"\n\n Calculating...";

     double secs=((float)(end-start))/CLOCKS_PER_SEC;

     flop=999999;   // Actually is 999999999, but integer overflow in expression
     flop=5*(flop*1000+999);   // In the brackets I make the value to same as 999999999
                               // Multiply with 5 and basically get Flops here
     flop/=secs;    // To get the Flops in second, multiply with time elapsed

     string prefix,fstr;

     if(flop/1000000000>=1||flop/1000000000<1){
         flop/=1000000000;
         prefix="GFLOPS";
     }

     else if(flop/1000000000000>=1){
         flop/=1000000000000;
         prefix="TFLOPS";
     }

     cout<<"\n\n\n Floating-points Operations Per Second\n\n > "<<setprecision(3)<<flop<<" "<<prefix;
     getch();
     return 0;
  }

如果您知道如何使结果更精确,请继续,任何答案将不胜感激!

4

1 回答 1

1

这段代码有很多问题。首先,您使用float变量 ( j) 来维护具有严格终止条件的循环计数器j<999999999。这可能是循环可能永远运行的原因。的类型j应该是整数类型,例如int.

其次,循环中的触发器数量取决于您使用的编译器、您传递给编译器的编译器选项和目标体系结构。解决这个问题的最好方法是查看生成的汇编代码。

第三,由于编译器优化导致结果无效,第一次调用clock和第二次调用可能会重新排序。clock您必须通过查看汇编代码来确保它们没有被重新排序。确保这一点的方法取决于编译器。

、这是什么意思?

flop=999999;   // Actually is 999999999, but integer overflow in expression

编译器是否告诉您这999999999会导致溢出?如果是,那么您如何在循环终止条件中使用它?究竟是什么错误?

第五,这个

if(flop/1000000000>=1||flop/1000000000<1){

应该是这样的

if(flop/1000000000>=1){

第六,整个循环可能会被编译器优化掉,因为你没有var在循环之后使用。您应该在最后打印值,var这样就不会发生这种情况。

第七,表达式a*b+a/b具有常数值。var所以实际上,每次迭代都会分配相同的值。编译器可能会将其优化为单个常量赋值。在这种情况下,将发出零次触发器。

第八,这里的注释应该说除而不是乘。

flop/=secs;    // To get the Flops in second, multiply with time elapsed

第九,这个条件if(flop/1000000000000>=1)应该在这个条件之前。if(flop/1000000000>=1)

第十,在这行代码中,叫做Floating-point

cout<<"\n\n\n Floating-points Operations Per Second\n\n

第十一,这个数字999999999应该在函数的开头定义为一个常数,这样更容易改变。

最后,您用来计算运行时间的方法是最简单的,并且在许多情况下已经足够好了。但是还有更复杂的方法更准确。

于 2015-07-05T09:12:47.713 回答