2016-10-05 9 views
1

Инструмент гонки показывает отчеты о расе с моим приложением. Я выделил его для функций exec CUFFT.Почему cuda-memcheck racecheck сообщает об ошибках с cufft?

Я что-то не так? Если нет, как я могу заставить racecheck игнорировать это?

Вот минимальный пример, который при запуске в cuda-memcheck --tool racecheck производит кучу «опасности», как

========= Race reported between Write access at 0x00000a30 in void spVector0128C::kernelTex<unsigned int, float, fftDirection_t=-1, unsigned int=8, unsigned int=8, LUT, ALL, WRITEBACK>(kernel_parameters_t<fft_tex_t, unsigned int, float>) 
=========  and Read access at 0x00000a70 in void spVector0128C::kernelTex<unsigned int, float, fftDirection_t=-1, unsigned int=8, unsigned int=8, LUT, ALL, WRITEBACK>(kernel_parameters_t<fft_tex_t, unsigned int, float>) [4 hazards] 

На примере

#include <cufft.h> 
#include <iostream> 

#define ck(cmd) if (cmd) { std::cerr << "error at line " << __LINE__ << std::endl;exit(1);} 

int main(int argc,char ** argv) 
{ 
    int nfft=128; 
    cufftComplex * ibuf; 
    cufftComplex * obuf; 
    ck(cudaMalloc((void**)&ibuf, sizeof(cufftComplex)*nfft)); 
    ck(cudaMalloc((void**)&obuf, sizeof(cufftComplex)*nfft)); 
    ck(cudaMemset(ibuf,0,sizeof(cufftComplex)*nfft)); 

    cufftHandle fft; 
    ck(cufftPlanMany(&fft,1,&nfft, 
       NULL,1,nfft, 
       NULL,1,nfft, 
       CUFFT_C2C,1)); 

    ck(cufftExecC2C(fft,ibuf,obuf,CUFFT_FORWARD)); 

    ck(cudaDeviceSynchronize()); 
    cufftDestroy(fft); 
    ck(cudaFree(ibuf)); 
    ck(cudaFree(obuf)); 
    return 0; 
} 
+0

FWIW, я отправил ошибку nVidia # 1823484 против cuFFT. Возможно, он будет переназначен в cuda-memcheck. –

ответ

1

Вы не делаете ничего плохого. Я не думаю, что она может быть отключена похожа на nvprof - cudaProfilerStart/cudaProfilerStop

Учитывайте небольшие различия между описаниями __syncthreads и инструкции BAR.SYNC:

__syncthreads - http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#synchronization-functions

ждет, пока все нити в блоке нити достигли этой точки

BAR.SYNC - http://docs.nvidia.com/cuda/parallel-thread-execution/index.html#texture-instructions

барьеры выполнены на основе за перекоса, как если бы все нити в основы являются активными.»

Это не совсем такое же поведение. cuda-memcheck racecheck может следовать определению __syncthreads и ядрам cuFFT BAR.SYNC один

Это, скорее всего, будет исправлено в следующей версии.

+0

'__syncthreads()' компилируется в 'bar.sync', поэтому их эффект идентичен. Разница заключается только в документации, при этом описание '__syncthreads()' упрощается, чтобы исключить поведение внутри условного кода. – tera

+0

«Скорее всего, это будет исправлено в следующем выпуске». - У вас есть какая-либо внутренняя информация? Это расхождение в уровне детализации документации имело место для 7 или более крупных выпусков CUDA (в основном с тех пор, как PTX официально задокументировался), поэтому, просто наблюдая за прошлым поведением, мне не кажется, что Nvidia намерена изменить это в ближайшее время. – tera

+0

Позвольте мне указать на общедоступную информацию о том, что в будущем ситуация изменится. Пожалуйста, посмотрите, что последняя часть презентации посвящена «Совместным группам»: http://on-demand.gputechconf.com/gtc/2016/presentation/s6224-mark-harris.pdf – llukas

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

  • Нет связанных вопросов^_^