2016-10-05 12 views
1

レースチェックツールが自分のアプリケーションでメモリレースを報告しました。私はそれをCUFFT exec関数に分離しました。cuda-memcheck racecheckが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; 
} 
+0

FWIW、私はcuFFTに対してnVidiaバグ#1823484を提出しました。多分それはcuda-memcheckに再割り当てされるでしょう。 –

答えて

1

の束を生成すること、最小限の例です。私はnvprofに似無効にすることができるとは思わない - cudaProfilerStart/cudaProfilerStop

__syncthreadsとBAR.SYNC命令の記述の間のわずかな違いを観察してください:

__syncthreads - すべてまでhttp://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#synchronization-functions

待機をhttp://docs.nvidia.com/cuda/parallel-thread-execution/index.html#texture-instructions

- スレッドブロック内のスレッドは

BAR.SYNCこの点に達しています ワープ内のすべてのスレッドがアクティブであるかのように0

障壁はあたりワープ基づいて実行される。」

これは全く同じ動作ではありません。 cuda-memcheck racecheckが__syncthreads定義とcuFFTカーネルBAR.SYNCのどちらかに続く可能性があります

これは、次回リリースで修正される可能性が高いです。

+0

'__syncthreads()'は 'bar.sync'にコンパイルされるので、その効果は同じです。相違点はドキュメントのみであり、 '__syncthreads()'の記述は条件付きコード内の動作を除外するために簡略化されています。 – tera

+0

"これは次のリリースで修正される可能性が最も高いです。" - 内部情報はありますか?このようなドキュメンテーションの詳細レベルの差異は、CUDAの7つの主要リリース(基本的にPTXが正式に文書化されて以来)に存在していたため、Nvidiaは過去の動作を観察するだけですぐに変更する予定です。 – tera

+0

将来的に物事が変わる可能性がある公に利用可能な情報を教えてください。プレゼンテーションの最後の部分を見てください "協力グループ"に専念してください: http://on-demand.gputechconf.com/gtc/2016/presentation/s6224-mark-harris.pdf – llukas

関連する問題