Я тестировал, стоит ли помещать цикл в функцию обратного вызова, поэтому я протестировал Runge-Kutta четвертого порядка на y '= y в C++, все с gcc 5.1 в Ubuntu с командой компиляции
g++ -std=c++11 -O3 -march=native --fast-math test.cpp
Петля Рунге-Кутта
double dt=(t_end-t_0)/N;
auto y=y_0;
auto t=t_0;
for(size_t k=0;k<N;++k)
{
auto k_1=f(k*dt, y);
auto k_2=f(k*dt + 0.5*dt, y + 0.5*dt*k_1);
auto k_3=f(k*dt + 0.5*dt, y + 0.5*dt*k_2);
auto k_4=f(k*dt + dt, y + dt*k_3);
y+=dt*(k_1 + 2*k_2 + 2*k_3 + k_1)/6.0;
}
return y;
Встраивание было достигнуто шаблоном и функциональным объектом. Для динамического связывания использовался указатель на функцию.
Пентиум М
Спецификации как указано в /proc/cpuinfo
cpu family : 6
model : 13
model name : Intel(R) Pentium(R) M processor 1.73GHz
stepping : 8
microcode : 0x20
Частота от sudo cpufreq-info
current policy: frequency should be within 800 MHz and 1.73 GHz.
The governor "userspace" may decide which speed to use
within this range.
current CPU frequency is 1.73 GHz (asserted by call to hardware).
Результаты
ODE solution exp(1) diff Execution time
Function pointer 2.718281828037378 2.718281828459045 -4.21667145644733e-10 53321972
Inlined call 2.718281828037378 2.718281828459045 -4.21667145644733e-10 19916460
Прескотт:
Спецификации как указано в /proc/cpuinfo
cpu family : 15
model : 4
model name : Intel(R) Pentium(R) 4 CPU 3.40GHz
stepping : 3
microcode : 0x5
Частота от sudo cpufreq-info
current policy: frequency should be within 2.80 GHz and 3.40 GHz.
The governor "userspace" may decide which speed to use
within this range.
current CPU frequency is 3.40 GHz.
Результаты
ODE solution exp(1) diff Execution time
Function pointer 2.718281828037378 2.718281828459045 -4.21667145644733e-10 70811683
Inlined call 2.718281828037378 2.718281828459045 -4.21667145644733e-10 19928642
Сравнение и вопрос
Таким образом, Prescott работает не лучше (кажется, намного хуже), чем Pentium M. с гораздо более низкой тактовой частотой. Конечно, у Prescott был очень длинный конвейер, но мой код очень предсказуем, поскольку N = 2 ^ 30. Так что же делает Prescott таким медленным, несмотря на высокую частоту процессора?