C++计算GFlops
C++ calculate GFlops
我最近试图制作一个计算 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;
}
如果您知道如何使结果更精确,请继续,任何答案将不胜感激!
这段代码有很多问题。 首先,您正在使用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){
Sixth,整个循环可能会被编译器优化掉,因为您没有在循环后使用 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)
之前
Tenth,在这行代码中,叫做Floating-point
cout<<"\n\n\n Floating-points Operations Per Second\n\n
Eleventh,这个数字999999999
应该在函数的开头定义为常量,这样更容易改变。
最后,你用来计算运行ning时间的方法是最简单的,在很多情况下已经足够好了。但是还有更复杂的方法更准确。
我最近试图制作一个计算 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;
}
如果您知道如何使结果更精确,请继续,任何答案将不胜感激!
这段代码有很多问题。 首先,您正在使用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){
Sixth,整个循环可能会被编译器优化掉,因为您没有在循环后使用 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)
Tenth,在这行代码中,叫做Floating-point
cout<<"\n\n\n Floating-points Operations Per Second\n\n
Eleventh,这个数字999999999
应该在函数的开头定义为常量,这样更容易改变。
最后,你用来计算运行ning时间的方法是最简单的,在很多情况下已经足够好了。但是还有更复杂的方法更准确。