0

sincos() を実装する最良の方法は何なのかはっきりしません。私はどこでも調べましたが、コンセンサスは、sinとcosを別々に計算するよりも優れているということです。以下は基本的に、sincos を使用するためにカーネルにあるものです。ただし、sinとcosを別々に実行するだけでクロックすると、遅くなります。cPtr と sPtr をどのように使用しているかに関係していると思います。より良い方法はありますか?

int idx = blockIdx.x * blockDim.x + threadIdx.x;

if (idx < dataSize)
{
    idx += lower;
    double f = ((double) idx) * deltaF;
    double cosValue;
    double sinValue;
    double *sPtr = &sinValue;
    double *cPtr = &cosValue;
    sincos(twopit * f, sPtr, cPtr);

    d_re[idx - lower] = cosValue;
    d_im[idx - lower] = - sinValue;

    //d_re[idx - lower] = cos(twopit * f);
    //d_im[idx - lower] = - sin(twopit * f);
}
4

1 に答える 1

5

ポインタは冗長です - あなたはそれらを取り除くことができます.

double cosValue;
double sinValue;
sincos(twopit * f, &sinValue, &cosValue);

しかし、これがパフォーマンスに大きな影響を与えるかどうかはわかりません (試してみる価値はあります)。

また、精度要件が許す場合は double ではなく float を使用することを検討し、対応する単精度関数 (sincosfこの場合) を使用します。

于 2012-07-20T07:33:36.383 に答える