【发布时间】:2018-05-22 21:57:32
【问题描述】:
我正在编写一个脚本来使用基于 GPU/CUDA 的 cuFFT 库执行 FFT。 CuFFT 要求输入数据必须采用指定为“cufftComplex”的格式。但是我的输入数据是 numpy.complex64 格式。我正在使用 Python C-API 将数据从 python 发送到 C。如何在两种格式之间进行转换?目前我的代码如下所示:
#include<python2.7/Python.h>
#include<numpy/arrayobject.h>
#include<cufft.h>
void compute_BP(PyObject* inputData, pyObject* OutputData, int Nfft)
{
cuffthandle plan;
cuFFTPlan1d(&plan, Nfft, CUFFT_C2C, CUFFT_INVERSE);
cuFFTExecC2C(plan, inputData, OutputData, CUFFT_INVERSE);
...
}
编译时出现以下错误:
错误:“PyObject *”类型的参数与“cufftComplex”类型的参数不兼容。
【问题讨论】:
-
cufft 不能从
__global__函数调用(没有 cufft 设备 API),所以我怀疑你的代码看起来像这样。如果它确实看起来像这样,那么无论您对数据格式有什么顾虑,它都不会起作用。 -
@RobertRovella:删除 global
-
std::complex<double>在 C++ 中的布局应该完全匹配cufftDoubleComplex,而std::complex<float>在 C++ 中的布局应该完全匹配cufftComplex。有了这些信息,您的问题实际上变成了如何将 python (numpy) 复杂类型转换为 C++,反之亦然。为此,this question 提供了一个合适的答案。 -
您在这里的代码/想法超出了已经指出的范围。您不能只是盲目地将任意 Python 对象指针转换为 C 数组指针,也不能将主机 C 数组指针传递给 cuFFT。您必须使用 Python buffer interface 来访问数组内存和适当的 CUDA API 来将该内存分配和复制到设备