3

私は、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;
}

改善の余地はありますか?現在、私のプログラムは大部分の時間をこの関数に費やしています。

4

2 に答える 2

0
  • 抽出するループ は、do-while ループでnt = log2(n);置き換えることができます。
    if (n & 1) ...; n >>= 1;
  • 最初は 、 fmod r = 16;(r*r, ak) 対 fmod(16*r,ak) を簡単に遅らせて、N回ごとにモジュロを計算することができます-ループ展開?
  • また、なぜfmodなのですか?
于 2014-01-21T05:10:06.623 に答える