2

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;
}
4

1 回答 1

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

屏障是在每个 warp 的基础上执行的,就好像一个 warp 中的所有线程都处于活动状态一样。”

这不是完全相同的行为。cuda-memcheck racecheck 可能遵循 __syncthreads 定义和 cuFFT 内核 BAR.SYNC 之一

这很可能会在下一个版本中得到修复。

于 2016-10-16T06:26:01.723 回答