Я выполняю некоторую обработку изображений на своем 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
профиль.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().
Я попытался изменить порядок вызова функций, и результаты остались прежними. Может ли кто-нибудь объяснить мне это?
double
иfloat
. - person Pascal Cuoq   schedule 07.08.2014FLT_EVAL_METHOD
. - person chux - Reinstate Monica   schedule 07.08.2014