Использование «обратных вызовов устройств cuFFT»

Это мой первый вопрос, поэтому я постараюсь быть максимально подробным. Я работаю над реализацией алгоритма шумоподавления в 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 или в чем причина этой ошибки?

2

Решение

Ссылаясь на документация:

API обратного вызова доступен только в статически связанной библиотеке cuFFT и только в 64-битных операционных системах LINUX. Для использования этого API требуется текущая лицензия. Бесплатные ознакомительные лицензии доступны для зарегистрированных разработчиков до 30.06.2015. Чтобы узнать больше, пожалуйста, посетите Страница разработчика cuFFT.

Я думаю, что вы получаете не реализованную ошибку, потому что либо вы не на 64-битной платформе Linux, либо вы явно не ссылаетесь на статическую библиотеку CUFFT. Makefile в образец обратного вызова cufft даст правильный метод для ссылки.

Даже если вы решите эту проблему, вы, скорее всего, столкнетесь с CUFFT_LICENSE_ERROR если вы не получили одну из лицензий на оценку.

Обратите внимание, что есть различные ограничения устройства для ссылки на статическую библиотеку cufft. Должна быть возможность создать статически связанное приложение CUFFT, которое будет работать на устройствах cc 2.0 и выше.

3

Другие решения