13

如果我想处理复数并对内核本身中的这些复数进行简单的数学运算(加法和乘法),我应该在我的程序中包含哪些 CUDA 标头?

在 C++ 中,我可以将一个常数与一个复数 double> 相乘,只要它们都是双精度数。然而,在 CUDA 中,当我尝试对复杂的 double>s 进行简单的数学运算时,只要它不与另一个复杂的 double> 一起使用,就会出现很多错误。我错过了什么?

谢谢!

4

1 回答 1

19

要包含的标题是:

#include <cuComplex.h>

在标准的 linux CUDA 安装中,它位于:

/usr/local/cuda/include

您将需要检查该头文件并使用其中定义的函数来操作设备上的复数。

要将(双)复数乘以实数,我会:

#include <cuComplex.h>
...
double cr = 1;
double ci = 2;
double r = 3;
cuDoubleComplex c = make_cuDoubleComplex(cr, ci);
cuDoubleComplex result = cuCmul(c, make_cuDoubleComplex(r, 0));

编辑:使用最近在 CUDA 7 RC 中发布的 Thrust v1.8,可以在推力代码CUDA 设备代码中使用推力::complex 。这使得编写更自然的操作成为可能,例如:

#include <thrust/complex.h>
...
thrust::complex<float> c = thrust::complex<float>(2.0f, 5.0f);
thrust::complex<float> c2 = c*c;
float r = c2.real();
于 2013-07-04T15:52:02.810 回答