【发布时间】:2014-01-20 23:24:59
【问题描述】:
我一直在尝试在 OpenCL 中设计一个快速的二进制求幂实现。我当前的实现与this book about 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;
}
还有改进的余地吗?现在我的程序大部分时间都花在了这个函数上。
【问题讨论】:
-
知道输入的一般范围是多少吗?
-
n 可以达到一百万左右。所以,输入范围相当大。
-
ak实际上是双精度数还是整数?它的范围是多少? -
抱歉耽搁了 - 我现在回来了。 ak 是(据我所知)一个整数。出于某种原因,此实现将其视为双精度(也许是为了避免在某些时候进行强制转换?)。我实际上并没有用 ak 作为 int 而不是 double 来测试整个程序,所以我不知道进行这样的切换是否会降低其准确性或影响后面部分的性能。
标签: c opencl pow exponentiation modular-arithmetic