Лучший способ подойти с использованием 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 в этом случае).

Другие вопросы по тегам