我不清楚实现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);
}
答案 0 :(得分:3)
指针是多余的 - 你可以摆脱它们,例如
double cosValue;
double sinValue;
sincos(twopit * f, &sinValue, &cosValue);
但我不确定这会对性能产生太大影响(值得一试)。
还考虑在精度要求允许的情况下使用float而不是double,并使用相应的单精度函数(在这种情况下为sincosf
)。