Что такое do_cos_slow.isra? - PullRequest
       18

Что такое do_cos_slow.isra?

2 голосов
/ 18 марта 2019

Я написал простой код для проверки на prof.

double bar_compute (double d) {
    double t = std::abs(d);
    t += std::sqrt(d);
    t += std::cos(d);

    return t;
}

// Do some computation n times
double foo_compute(unsigned n) {
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_real_distribution<double> dist(0.0, 1.0);

    double total = 0;
    for (int i=0; i<n; i++) {
        double d = dist(mt);
        total += bar_compute(d);
    }
    return total;
}

Когда я запускаю prof и просматриваю вывод, это

  56.14%  runcode  libm-2.23.so       [.] __cos_avx                                                                                                                                
  27.34%  runcode  runcode            [.] _Z11foo_computej                                                                                                                         
  13.92%  runcode  runcode            [.] _Z11bar_computed                                                                                                                         
   0.86%  runcode  libm-2.23.so       [.] do_cos_slow.isra.1                                                                                                                       
   0.44%  runcode  runcode            [.] cos@plt                                                                                                                                  
   0.41%  runcode  libm-2.23.so       [.] sloww1                                                                                                                                   
   0.35%  runcode  libm-2.23.so       [.] __dubcos                                                                                                                                 
   0.17%  runcode  ld-2.23.so         [.] _dl_lookup_symbol_x             

Что такое do_cos_slow.israа sloww1 значит?

Существует ли более быстрая версия cos, которую я могу использовать?Иначе с чего бы это называть медленным?

1 Ответ

6 голосов
/ 18 марта 2019

do_cos_slow взят из декларации в glibc / sysdeps / ieee754 / dbl-64 / s_sin.c . Он называется do_cos_slow, потому что он более точен, чем функция, на которой он основан do_cos согласно комментарию над его объявлением на Строка 164 .

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Суть .isra.

sloww1 - это функция, которая вычисляет грех (x + dx) согласно комментарию над ним.

Что касается более быстрой версии cos, я не уверен, что есть более быстрая версия, но если вы обновите свою реализацию glibc или libc, которая предоставляет libm, по крайней мере до glibc 2.28, то вы получите результаты удаления Wilco Dijkstra из этих медленных функций и рефакторинг dosincos, который дает увеличение скорости.

Из сообщения о фиксации

Refactor the sincos implementation - rather than rely on odd partial inlining
of preprocessed portions from sin and cos, explicitly write out the cases.
This makes sincos much easier to maintain and provides an additional 16-20%
speedup between 0 and 2^27.  The overall speedup of sincos is 48% over this range.
Between 0 and PI it is 66% faster.

Другими альтернативами, которые вы можете попробовать, являются другие реализации libc или libm, или другие реализации cos, включая avx_mathfun или avx_mathfun с некоторыми исправлениями для более новых GCC или supersimd .

...