使用"cuFFT Device Callbacks"
Using "cuFFT Device Callbacks"
这是我的第一个问题,所以我会尽量详细。我正在CUDA 6.5中实现降噪算法。我的代码基于此Matlab实现:http://pastebin.com/HLVq48C1.
我很想使用新的cuFFT设备回调功能,但我一直使用cufftXtSetCallback。每次我的cufftResult都是CUFFT_NOT_IMPLEMENTED(14)。即使nVidia提供的例子也以同样的方式失败。。。我的设备回调测试代码:
__device__ void noiseStampCallback(void *dataOut,
size_t offset,
cufftComplex element,
void *callerInfo,
void *sharedPointer) {
element.x = offset;
element.y = 2;
((cufftComplex*)dataOut)[offset] = element;
}
__device__ cufftCallbackStoreC noiseStampCallbackPtr = noiseStampCallback;
CUDA我代码的一部分:
cufftHandle forwardFFTPlan;//RtC
//find how many windows there are
int batch = targetFile->getNbrOfNoiseWindows();
size_t worksize;
cufftCreate(&forwardFFTPlan);
cufftMakePlan1d(forwardFFTPlan, WINDOW, CUFFT_R2C, batch, &worksize); //WINDOW = 2048
//host memory, allocate
float *h_wave;
cufftComplex *h_complex_waveSpec;
unsigned int m_num_real_elems = batch*WINDOW*2;
h_wave = (float*)malloc(m_num_real_elems * sizeof(float));
h_complex_waveSpec = (cufftComplex*)malloc((m_num_real_elems/2+1)*sizeof(cufftComplex));
//init
memset(h_wave, 0, sizeof(float) * m_num_real_elems); //last window won't probably be full of file data, so fill memory with 0
memset(h_complex_waveSpec, 0, sizeof(cufftComplex) * (m_num_real_elems/2+1));
targetFile->getNoiseFile(h_wave); //fill h_wave with samples from sound file
//device memory, allocate, copy from host
float *d_wave;
cufftComplex *d_complex_waveSpec;
cudaMalloc((void**)&d_wave, m_num_real_elems * sizeof(float));
cudaMalloc((void**)&d_complex_waveSpec, (m_num_real_elems/2+1) * sizeof(cufftComplex));
cudaMemcpy(d_wave, h_wave, m_num_real_elems * sizeof(float), cudaMemcpyHostToDevice);
//prepare callback
cufftCallbackStoreC hostNoiseStampCallbackPtr;
cudaMemcpyFromSymbol(&hostNoiseStampCallbackPtr,
noiseStampCallbackPtr,
sizeof(hostNoiseStampCallbackPtr));
cufftResult status = cufftXtSetCallback(forwardFFTPlan,
(void **)&hostNoiseStampCallbackPtr,
CUFFT_CB_ST_COMPLEX,
NULL);
//always return status 14 - CUFFT_NOT_IMPLEMENTED
//run forward plan
cufftResult result = cufftExecR2C(forwardFFTPlan, d_wave, d_complex_waveSpec);
//result seems to be okay without cufftXtSetCallback
我知道我只是CUDA的初学者。我的问题是:
如何正确调用cufftXtSetCallback,或者是什么原因导致了此错误?
参考文档:
回调API仅在静态链接的cuFFT库中可用,并且仅在64位LINUX操作系统上可用。使用此API需要当前许可证。注册开发者可获得免费评估许可证,有效期至2015年6月30日。要了解更多信息,请访问cuFFT开发者页面。
我认为您得到了未实现的错误,因为您不是在Linux 64位平台上,或者您没有明确链接到CUFFT静态库。cufft回调示例中的Makefile将提供正确的链接方法。
即使您解决了这个问题,也可能会遇到CUFFT_LICENSE_ERROR
,除非您获得了其中一个评估许可证。
请注意,链接到cufft静态库也有各种设备限制。应该可以构建一个静态链接的CUFFT应用程序,该应用程序将在cc 2.0及更高版本的设备上运行。
一种新的(2019)可能性是cuFFT设备扩展(cuFFTDX)。作为数学库Early Access的一部分,它们是设备FFT函数,可以内联到用户内核中。
cuFFTDX公告:
https://developer.download.nvidia.com/video/gputechconf/gtc/2019/presentation/s9240-cuda-new-features-and-beyond.pdf
数学图书馆早期访问:
https://developer.nvidia.com/cuda-math-library-early-access-program-page
示例代码:
https://github.com/mnicely/cufft_examples
- 将 aws-iot-device-sdk-cpp-v2 与 CMake 结合使用
- 加载安全区图像"A device attached to the system is not functioning"
- CMake + CUDA "invalid device function"即使使用正确的 SM 版本
- 在 Python 中打开 Maya callBacks 或C++查询内存中的所有回调
- C++ API 中的张量流加载模型并得到"from device: CUDA_ERROR_OUT_OF_MEMORY"错误
- 文件打开时"QIODevice::write: device not open"
- 找不到'boost/iostreams/device/file_descriptor.hpp'文件错误
- Boost.Asio 在尝试加入多播组时引发'No such device'异常
- 尽管IP_MULTICAST_LOOP(Linux,C++,UDP),IP_ADD_MEMBERSHIP导致"No device found"
- 从连接的 USB 设备检索'Device Instance Path'
- 使用"cuFFT Device Callbacks"
- OpenNI: "Open failed: Device is in safe mode. Cannot start any stream!"
- 将 istream 中的字符回显到不寻常的"device"
- 当您泄漏"device"和"device context"时会发生什么 - 特别是 d3d?
- Exception_Access_Violation - external device-API - JNI
- 如何在 Boost::P rogram_Options 中支持命令行语法"-DEVICE:iphone"?
- "standard output stream"和"standard output device"有什么区别?