В чем разница между float2 и cuComplex, которые использовать? - PullRequest
3 голосов
/ 27 января 2011

Я пытаюсь понять, как использовать комплексные числа в коде моего хоста и устройства. Я сталкивался с cuComplex (но не могу найти никакой документации!) И float2, которые, по крайней мере, упоминаются в руководстве по программированию CUDA.

Что мне использовать? В заголовочном файле для cuComplex похоже, что функции объявлены с __host__ __device__, поэтому я предполагаю, что это означает, что было бы хорошо использовать их в любом месте.

Мои исходные данные считываются из файла в std::complex<float>, поэтому я не хочу с этим связываться. Я думаю, что для того, чтобы использовать комплексные значения на GPU, мне придется скопировать из оригинала complex<float> в cuComplex?

Ответы [ 3 ]

5 голосов
/ 27 января 2011

cuComplex определяется в /usr/local/cuda/include/cuComplex.h (по модулю вашего установочного каталога). Соответствующие фрагменты:

typedef float2 cuFloatComplex;
typedef cuFloatComplex cuComplex;
typedef double2 cuDoubleComplex;

Здесь также есть удобные функции для работы с комплексными числами - их умножение, построение и т. Д.

Что касается использования float2 или cuComplex, вы должны использовать то, что семантически уместно - вектор или комплексное число? Кроме того, если это комплексное число, вы можете рассмотреть возможность использования cuFloatComplex или cuDoubleComplex, чтобы быть полностью явным.

2 голосов
/ 27 января 2011

Если вы пытаетесь работать с cuBLAS или cuFFT, вам следует использовать cuComplex. Если вы собираетесь писать свои собственные функции, не должно быть никакой разницы в производительности, так как оба представляют собой просто структуру из двух чисел с плавающей запятой.

0 голосов
/ 27 января 2011

IIRC, float2 - это массив из 2 чисел. cuComplex (только от названия) звучит как сложный формат CUDA.

Этот пост, кажется, указывает, где найти больше на cuComplex: http://forums.nvidia.com/index.php?showtopic=81514

...