Я тестировал, стоит ли помещать цикл в функцию обратного вызова, поэтому я протестировал 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 таким медленным, несмотря на высокую частоту процессора?

0