Почему cuda-memcheck racecheck сообщает об ошибках с cufft?

Инструмент racecheck сообщил о моих гонках памяти с моим приложением. Я выделил его для функций exec 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;
}

cuda,race-condition,nvcc,cufft,

1

Ответов: 1


1 принят

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

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

__syncthreads - http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#synchronization-функции

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

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

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

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

Скорее всего, это будет исправлено в следующем выпуске.

CUDA, гонки состояние, NVCC, CUFFT,
Похожие вопросы