【发布时间】:2014-08-07 15:05:37
【问题描述】:
我正在对我的 Beaglebone Black 进行一些图像处理,并且对在我的算法中使用浮点数与双精度数的性能提升感兴趣。
我试图为此设计一个简单的测试:
main.c
#define MAX_TEST 10
#define MAX_ITER 1E7
#define DELTA 1E-8
void float_test()
{
float n = 0.0;
for (int i=0; i<MAX_ITER; i++)
{
n += DELTA;
n /= 3.0;
}
}
void double_test()
{
double n = 0.0;
for (int i=0; i<MAX_ITER; i++)
{
n += DELTA;
n /= 3.0;
}
}
int main()
{
for (int i=0; i<MAX_TEST; i++)
{
double_test();
float_test();
}
return 0;
}
运行为:
gcc -Wall -pg main.c -std=c99
./a.out
gprof a.out gmon.out -q > profile.txt
profile.txt:
granularity: each sample hit covers 4 byte(s) for 0.03% of 35.31 seconds
index % time self children called name
<spontaneous>
[1] 100.0 0.00 35.31 main [1]
18.74 0.00 10/10 float_test [2]
16.57 0.00 10/10 double_test [3]
-----------------------------------------------
18.74 0.00 10/10 main [1]
[2] 53.1 18.74 0.00 10 float_test [2]
-----------------------------------------------
16.57 0.00 10/10 main [1]
[3] 46.9 16.57 0.00 10 double_test [3]
-----------------------------------------------
我不确定编译器是否优化了我的一些代码,或者我是否做了足够多的算术运算。我觉得有点奇怪,double_test() 实际上比 float_test() 花费的时间更少。
我尝试切换函数调用的顺序,结果仍然相同。有人可以向我解释一下吗?
【问题讨论】:
-
如果您不确定编译器是否正在优化东西,为什么不让您的程序接收关键输入(或至少从易失性位置读取它们)并打印计算输出? PS:是的,一个半体面的优化编译器应该删除所有计算 PS2:你为什么还要测量一个没有优化编译的程序所花费的时间?那么
double和float所用的相对时间不需要有任何意义。 -
C 允许 FP 计算以比所需更高的精度进行。请参阅
FLT_EVAL_METHOD设置。
标签: c profiling beagleboneblack