我试图找出如何在主机和设备代码中使用复数。我遇到了cuComplex
(但找不到任何文档!)和float2
,至少在CUDA编程指南中有提及。
我应该使用什么?在cuComplex
的头文件中,看起来函数是用__host__ __device__
声明的,所以我假设这意味着可以在任何一个地方使用它们。
我的原始数据正在从一个文件读入std::complex<float>
,所以我真的不想搞砸了。我想为了在GPU上使用复杂的值,我必须从原来的complex<float>
复制到cuComplex
?
答案 0 :(得分:5)
cuComplex
在/usr/local/cuda/include/cuComplex.h
中定义(以您的安装目录为模)。相关摘要:
typedef float2 cuFloatComplex;
typedef cuFloatComplex cuComplex;
typedef double2 cuDoubleComplex;
还有一些方便的功能可以处理复杂的数字 - 将它们相乘,构建它们等等。
至于是否使用float2
或cuComplex
,您应该使用语义上合适的任何一个 - 是矢量还是复数?此外,如果它是一个复数,您可能需要考虑使用cuFloatComplex
或cuDoubleComplex
才能完全明确。
答案 1 :(得分:2)
如果您尝试使用cuBLAS或cuFFT,则应使用cuComplex。如果您要编写自己的函数,那么性能应该没有区别,因为它们只是两个浮点数的结构。
答案 2 :(得分:0)
IIRC,float2是一个包含2个数字的数组。 cuComplex(仅来自名称)听起来像CUDA的复杂格式。
这篇文章似乎指出了在cuComplex上找到更多信息的地方:http://forums.nvidia.com/index.php?showtopic=81514