2014-09-13 3 views
2

Это мой первый вопрос, поэтому я постараюсь быть максимально подробным. Я работаю над внедрением алгоритма сокращения шума в CUDA 6.5. Мой код основан на этой реализации Matlab: http://pastebin.com/HLVq48C1.
Мне бы хотелось использовать новую функцию Callbacks устройства cuFFT, но я застрял на cufftXtSetCallback. Каждый раз, когда мой cufftResult равен 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 требуется действующая лицензия. Бесплатные лицензии для лицензирования доступны для зарегистрированных разработчиков до 30.06.2012. Чтобы узнать больше, посетите cuFFT developer page.

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

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

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

+0

Вы правы. Единственная часть этой заметки, которую я пропустил, - 64-битная LINUX. Хорошо, спасибо за вашу помощь! – Ghany

+0

Мы понимаем, что эти ограничения раздражают, и мы работаем над тем, чтобы удалить некоторые из них в будущих выпусках. Они существуют по техническим причинам, поэтому для их работы требуется определенная инженерия. Оставайтесь с нами ... –

+0

Я нашел эту веб-страницу более явно полезной для создания статически связанного кода, а также получения лицензии. На веб-странице также говорится, что лицензии будут устранены в будущем. http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-use-cufft-callbacks-custom-data-processing/ – MrMas

Смежные вопросы