Это мой первый вопрос, поэтому я постараюсь быть максимально подробным. Я работаю над внедрением алгоритма сокращения шума в 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 или что является причиной этой ошибки?
Вы правы. Единственная часть этой заметки, которую я пропустил, - 64-битная LINUX. Хорошо, спасибо за вашу помощь! – Ghany
Мы понимаем, что эти ограничения раздражают, и мы работаем над тем, чтобы удалить некоторые из них в будущих выпусках. Они существуют по техническим причинам, поэтому для их работы требуется определенная инженерия. Оставайтесь с нами ... –
Я нашел эту веб-страницу более явно полезной для создания статически связанного кода, а также получения лицензии. На веб-странице также говорится, что лицензии будут устранены в будущем. http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-use-cufft-callbacks-custom-data-processing/ – MrMas