CUDA-如何处理复数?

CUDA-如何处理复数?,cuda,Cuda,如果我想处理复数,并在内核内部对这些复数进行简单的数学运算(加法和乘法),那么我的程序中应该包含哪些CUDA头 在C++中,只要两个数都是双数,就可以把常数乘以复数双。然而,在CUDA中,当我尝试对复杂的double>进行简单的数学运算时,我会遇到很多错误,只要它不是与另一个复杂的double>一起进行的。我错过了什么 谢谢大家! 要包含的标题是: #include <cuComplex.h> 您需要检查该头文件,并使用其中定义的函数来操作设备上的复数 要将一个(双)复数乘以一个实

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

在C++中,只要两个数都是双数,就可以把常数乘以复数双。然而,在CUDA中,当我尝试对复杂的double>进行简单的数学运算时,我会遇到很多错误,只要它不是与另一个复杂的double>一起进行的。我错过了什么


谢谢大家!

要包含的标题是:

#include <cuComplex.h>
您需要检查该头文件,并使用其中定义的函数来操作设备上的复数

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

#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));
#包括
...
双cr=1;
双ci=2;
双r=3;
cuDoubleComplex c=生成cuDoubleComplex(cr,ci);
cuDoubleComplex结果=cuCmul(c,makecudoublecomplex(r,0));
编辑:在CUDA 7 RC中最近发布的推力v1.8中,可以在推力代码或CUDA设备代码中使用推力::复合体。这使得编写更自然的操作成为可能,例如:

#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();
#包括
...
推力:复合推力c=推力:复合推力(2.0f,5.0f);
推力:复合c2=c*c;
浮点r=c2.real();

感谢您的快速回复。我还在想办法解决这个问题。。这可能是一个非常愚蠢的问题,但我在哪里可以找到关于不同头函数的更多信息?例如,如果您没有提到cuCmul,我就无法通过查看中的cuComplex.h文件引用来了解它的功能,我不知道该头或其他头有任何其他文档。反正我也不知道。
cuCmul
函数实际上非常简单,它复制了复数乘法。如果你不能像
cuCmul
那样将公式转换成C代码,那么我建议你学习更多关于基本计算机编程的知识,包括C语言。我现在理解了cuCmul函数,但我想说的是,如果你没有告诉我cuCmul是基本复数乘法的函数,我不会仅仅通过查看头文件引用就知道,因为它没有给出它的功能指示。。或者我没有正确地使用它,因为我不能真正理解调用图显示的是什么?将来,我如何知道我可能需要的某个操作是否已经有了功能?我不知道如何回答这个问题。这需要研究。CUDA的许多方面都有文档记录,但肯定不是所有可能的问题都有答案。有各种各样的论坛,比如这个,人们可以在那里得到答案。我认为这只是需要努力。如果您看到一个名为cuComplex.h的头文件,可以合理地假设它可能与复数有关。如果您查看该头文件并看到像cuCadd、cuCsub、cuCmul、cuCdiv这样的函数,可以合理地假设它们可能与+、-、*、/I有关,谷歌搜索了“推力复合cuda”,这是我得到的第一个结果。如果您的反对意见是关于
cuComplex.h
的文档,我会同意您的意见,但请注意1。这不是真正的图书馆。它只是一个头文件。2.不管怎样,CUDA没有对复杂类型的“原生”支持(就像C和C++不一样)。3. <代码>推力::复杂功能远远超出了仅使用
cuComplex.h
即可实现的功能,因此我的建议是使用
推力::复杂
以方便使用,因为它似乎有可用的文档
#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();