Почему cuda-memcheck racecheck сообщает об ошибках с помощью cufft?
Инструмент racecheck сообщил о скачках памяти с моим приложением. Я выделил его для exec-функций CUFFT.
Я делаю что-то неправильно? Если нет, то как я могу заставить гонку игнорировать это?
Вот минимальный пример того, что при запуске в 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;
}
1 ответ
Вы не делаете ничего плохого. Я не думаю, что это может быть отключено, как nvprof - cudaProfilerStart/cudaProfilerStop
Обратите внимание на небольшие различия между описаниями __syncthreads и инструкцией BAR.SYNC:
__syncthreads - http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
ожидает, пока все потоки в блоке потоков достигнут этой точки
BAR.SYNC - http://docs.nvidia.com/cuda/parallel-thread-execution/index.html
Барьеры выполняются на основе основы, как будто все потоки в основе являются активными."
Это не совсем то же самое поведение. cuda-memcheck racecheck может следовать определению __syncthreads и ядрам cuFFT BAR.SYNC
Скорее всего, это будет исправлено в следующем выпуске.