Лучший способ подойти с использованием sincos() в CUDA
Мне не ясно, каким должен быть лучший способ реализации sincos(). Я искал повсюду, но кажется, что единодушное мнение состоит в том, что это лучше, чем делать раздельное вычисление греха и cos. Ниже по сути то, что у меня есть в моем ядре для использования sincos. Тем не менее, когда я сравниваю это с тем, чтобы просто делать грех и потому отдельно, это выходит медленнее. Я думаю, что это связано с тем, как я использую свои 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);
}
1 ответ
Указатели являются избыточными - вы можете избавиться от них, например,
double cosValue;
double sinValue;
sincos(twopit * f, &sinValue, &cosValue);
но я не уверен, что это сильно повлияет на производительность (хотя стоит попробовать).
Также рассмотрите возможность использования числа с плавающей запятой вместо двойного, если позволяют требования точности, и используйте соответствующие функции одинарной точности (sincosf
в этом случае).