我一直在尝试在 OpenCL 中设计一个快速的二进制求幂实现。我当前的实现与本书中关于 pi的实现非常相似。
// 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;
}
有没有改进的余地?现在我的程序大部分时间都花在这个函数上。