2014-09-13 32 views
2

这是我的第一个问题,所以我会尽量做到尽可能详细。我正在CUDA 6.5中实施降噪算法。我的代码基于这个Matlab实现:http://pastebin.com/HLVq48C1
我很想使用新的cuFFT设备回调功能,但我卡在cufftXtSetCallback。每次我的cufft结果是CUFFT_NOT_IMPLEMENTED(14)。即使是由NVIDIA提供的示例失败同样的方式... 我的设备回调测试代码:使用“cuFFT设备回调”

__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,或者导致此错误的原因是什么?

回答

3

参照documentation

回调API是在静态链接库CUFFT仅提供,并且仅在64位Linux操作系统。使用此API需要当前许可证。 2015年6月30日前,注册开发商可获得免费评估许可证。要了解更多信息,请访问cuFFT developer page

我想你会得到未执行的错误,因为你不在Linux 64位平台上,或者你没有显式链接CUFFT静态库。 cufft callback sample中的Makefile将提供正确的链接方法。

即使您解决了该问题,除非获得了其中一个评估许可证,否则您可能会碰到CUFFT_LICENSE_ERROR

请注意,有各种device limitations as well链接到cufft静态库。应该可以构建一个静态链接的CUFFT应用程序,该应用程序将在cc 2.0及更高版本的设备上运行。

+0

你说得对。我错过的这个笔记的唯一部分是64位LINUX。好的,谢谢你的帮助! – Ghany 2014-09-13 15:55:10

+0

我们知道这些限制令人讨厌,我们正在努力在未来的版本中删除其中的一些。它们是出于技术原因而存在的,所以需要一些工程来解决它们。敬请期待... – 2014-09-21 01:59:58

+0

我发现这个网页对设置静态链接代码以及获取许可证更为明确。该网页还表示,未来将取消许可证。 http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-use-cufft-callbacks-custom-data-processing/ – MrMas 2015-09-01 18:29:35