CUDA-Runtime-API-Fehler 30: Wiederholt kernel-Aufrufe

Habe ich vor kurzem begonnen zu lernen CUDA, und ich stolperte ein sehr seltsames Verhalten, das ich nicht verstehen kann.

Mein code im wesentlichen berechnet eine Durchschnittliche Ausführungszeit für eine einfache atomicAdd kernel. Um dies zu erreichen, nenne ich den kernel in einer Schleife um einen besseren Durchschnitt. Ich schließe das Gerät Speicher-Allokation und-Kopien in der Schleife will ich auch in meiner Ausführung mal schätzen. Das problem ist, dass das Programm oft nicht mit Laufzeit-API-Fehler 30, wenn die Anzahl der Durchläufe durch die Schleife ist zu hoch.

Ich vermutete, dass ich vielleicht ein Problem mit meiner memory access, also ich habe memcheck laufen auf dem Programm-ohne Erfolg. Es gibt anscheinend kein memory-Fehler. Auch, wenn der kernel nur ein paar mal, es gibt keine Probleme, die auch scheinen zu zeigen, der kernel ist nicht genau das das Problem. Es ist nur, wenn ich nenne es auch Häufig in Folge, dass ich Probleme habe.

Einem Skelett mein code folgt:

for(int i = 0; i < runs; i++)
{


    //////////////////////////////////
    //Copy memory from Host to Device
    //////////////////////////////////

    cutilSafeCallNoSync( cudaMemcpy(dev_waveforms, waveforms, num_wf * wf_length *  sizeof(float), 
                        cudaMemcpyHostToDevice) );
    cutilSafeCallNoSync( cudaMemcpy(dev_delays, delays, num_wf * sizeof(int), 
                        cudaMemcpyHostToDevice) );




    ////////////////////////
    //Kernel Call
    ////////////////////////

    kernel_wrapper<float>(dev_waveforms, dev_focused, dev_delays, 
                    wf_length, num_wf, threads, blocks, kernel); 

    //copy back to host memory.
    cutilSafeCallNoSync( cudaMemcpy(focused, dev_focused, J * wf_length * sizeof(float), 
        cudaMemcpyDeviceToHost) );

}

Wieder, dieser schlägt nur, wenn läuft ist ausreichend groß. Es gibt auch andere seltsame Dinge gehen auf, aber ich werde es dabei belassen das jetzt.

Oh, ich entwickle auf Windows 7 mit Visual Studio 2010. Meine GPU ist auch als meine Grafikkarte, und ich bin besorgt darüber, dass diese seltsame Effekte.

Vielen Dank im Voraus!

  • Unter Windows gibt es einen watchdog-timer, die können Reise, die auf lange Kerne. Es ist möglich, dass mehrere Kerne mit no sync führen könnte, das gleiche problem. Sehen Sie, wenn es um eine Zeit-Schwellwert (z.B. 30 Sekunden).
  • Basierend auf dem, was @PaulR sagte, versuchen Sie, ein cudaDeviceSynchronize(); im inneren der Schleife.
  • Ein kurzes update: ich habe eingestellt, dass der Schwellwert für den watchdog-timer auf 8s aus dem Standard-2. Ich zunächst dachte, das geholfen hatte, als ich Erfolg 8/10 mal. Aber, ich habe wieder mal versucht und hatte eine 0% Erfolgsquote. Die Inkonsistenz macht es schwierig zu Debuggen. Noch nicht erklären, wie die änderung der array-Größe wirkt sich auf das problem. Auch der Inhalt des arrays zu haben scheint auch eine Wirkung.
InformationsquelleAutor Chance Fate | 2012-08-30
Schreibe einen Kommentar