2016-10-05 2 views
1

Das Race-Check-Tool berichtete Speicher Rennen mit meiner Anwendung. Ich habe es auf die CUFFT-Exec-Funktionen isoliert.Warum meldet cuda-memcheck racecheck Fehler mit der Manschette?

Mache ich etwas falsch? Wenn nicht, wie kann ich Racecheck dies ignorieren lassen?

ist hier ein minimales Beispiel, dass bei der Ausführung in cuda-memcheck --tool racecheck wie

eine Reihe von ‚Gefahren‘ produziert
========= 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] 

Das Beispiel

#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, ich habe einen nVidia-Bug # 1823484 gegen cuFFT eingereicht. Vielleicht wird es cuda-memcheck zugewiesen. –

Antwort

1

Sie nichts falsch machen. Ich glaube nicht, es ähnlich deaktiviert werden kann, um nvprof - cudaProfilerStart/cudaProfilerStop

Bitte beachten Sie geringfügige Unterschiede zwischen Beschreibungen von __syncthreads und BAR.SYNC Anweisung:

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

wartet, bis alle Gewinde in der Gewindesatz haben diesen Punkt

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

als 0

Barrieren sind auf einer Pro-warp Basis ausgeführt, wenn alle Threads in einem warp aktiv sind.“

Dies das gleiche Verhalten nicht genau ist. cuda-memcheck racecheck könnte folgen __synctreads- und cuFFT-Kernel BAR.SYNC one

Dies wird höchstwahrscheinlich in der nächsten Version behoben sein.

+0

'__synctreads()' kompiliert zu 'bar.sync', so dass ihr Effekt identisch ist. Der Unterschied liegt nur in der Dokumentation, wobei die Beschreibung von '__synctreads()' vereinfacht wird, um das Verhalten innerhalb von Bedingungscode wegzulassen. – tera

+0

"Dies wird wahrscheinlich in der nächsten Version behoben werden." - Haben Sie Insiderinformationen? Diese Diskrepanz in der Ebene der Dokumentationsdetails gibt es seit etwa sieben großen CUDA-Releases (im Grunde seit PTX offiziell dokumentiert wurde), also beobachte ich das vergangene Verhalten nicht so, wie Nvidia das in absehbarer Zeit ändern möchte. – tera

+0

Lassen Sie mich auf öffentlich verfügbare Informationen hinweisen, dass sich die Dinge in Zukunft wahrscheinlich ändern werden. Bitte werfen Sie einen Blick auf den letzten Teil der Präsentation, der den "Kooperativen Gruppen" gewidmet ist: http://on-demand.gputechconf.com/gtc/2016/presentation/s6224-mark-harris.pdf – llukas

Verwandte Themen