Я пытаюсь разработать быструю двоичную реализацию экспоненции в OpenCL. Моя текущая реализация очень похожа на мою в this book about pi.Быстрая реализация двоичной экспансионизации реализации в OpenCL
// Returns 16^n mod ak
inline double expm (long n, double ak)
{
double r = 16.0;
long nt;
if (ak == 1) return 0.;
if (n == 0) return 1;
if (n == 1) return fmod(16.0, ak);
for (nt=1; nt <= n; nt <<=1);
nt >>= 2;
do
{
r = fmod(r*r, ak);
if ((n & nt) != 0)
r = fmod(16.0*r, ak);
nt >>= 1;
} while (nt != 0);
return r;
}
Есть ли возможности для улучшения? Сейчас моя программа проводит большую часть времени в этой функции.
Любая идея, что представляет собой общий диапазон ввода? – cactus1
n может варьироваться до миллиона или около того. Итак, довольно большой диапазон ввода. – AnimatedRNG
Действительно ли 'ak' удваивает или целое число? Что это за диапазон? –