2010-06-01 5 views
5

Ich bin in einer echten Reparatur. Bitte helfen Sie. Es ist dringend.Nicht in der Lage, fehlerhaften Kernel zu beenden, der auf NVIDIA GPU läuft

Ich habe einen Host-Prozess, der mehrere Host (CPU) -Threads (Pthreads) hervorbringt. Diese Threads rufen wiederum den CUDA-Kernel auf. Diese CUDA-Kernel werden von externen Benutzern geschrieben. Es könnten also schlechte Kernel sein, die in die Endlosschleife kommen. Um dies zu überwinden, habe ich eine Auszeit von 2 Minuten gesetzt, die den entsprechenden CPU-Thread auslöst.

Kill den CPU-Thread töten auch den Kernel auf der GPU ausgeführt wird? Was ich getestet habe, ist es nicht.

Wie kann ich alle laufenden Threads in der GPU beenden?

Edit: Der Grund, warum ich CPU-Threads verwende, die den Kernel aufrufen, ist, weil der Server zwei Tesla GPUs hat. Daher plant der Thread den Kernel alternativ auf dem GPU-Gerät.

Danke, Arvind

Antwort

0

Wird das Töten der CPU-Thread auch den Kernel töten auf der GPU ausgeführt wird? Was ich getestet habe, ist es nicht.

Wahrscheinlich nicht. Unter Linux können Sie cuda-gdb verwenden, um das herauszufinden.

Ich sehe nicht den Punkt des Sendens mehrerer Kernel an die GPU mit Threads .. Ich frage mich, was passiert, wenn Sie mehrere Kernel an die GPU zur Zeit senden .. Wird der Thread-Scheduler der GPU damit umgehen?

+0

Ich muss separate Kerne an die GPU senden, weil der Kontext variiert. Das heißt, die Initialisierungsdaten können variieren. Über die Verwendung von Threads .. Die Plattform wurde unter Berücksichtigung der CPU entwickelt. Aber dann haben wir es auch für die GPU wiederverwendet. Ich denke nicht, dass es wichtig sein sollte. Der GPU-Scheduler wird die Kernel-Anfragen in die Warteschlange stellen (Das ist, was ich denke, könnte ich falsch liegen.) – arvindkgs

+0

Versucht es, ja das ist was es tut .. könnten Sie herausfinden, was war falsch daran? Auf welcher Plattform bist du? (Linux, Windows oder Mac?) – Nils

+0

Nein, noch nicht. Arbeite an Linux (Centos 5.4) – arvindkgs

1

Es scheint nicht zu. Ich habe einen kaputten Kernel laufen lassen und eines meiner Geräte scheinbar unbegrenzt gesperrt (bis zum Neustart). Ich bin mir nicht sicher, wie ich den laufenden Kernel töten kann. Ich denke, es gibt eine Möglichkeit, die Ausführungszeit des Kernels über den Treiber zu begrenzen, also könnte das der richtige Weg sein.

1

Es sei denn, es gibt einen größeren Teil davon, den ich nicht wirklich bekomme, Sie könnten besser mit CUDA Streams API für Multi-Device Tasking, aber YMMV.

Wie für das Töten; Wenn Sie die Karten mit einem Display (und einem x-Server) ausführen, wird nach 5 Sekunden automatisch ein Timeout ausgegeben (wieder YMMV).

Angenommen, das ist nicht der Fall; Auschecken mit cudaDeviceReset() API Reference; aus dem "Eltern" -Thread nach Ihrem eigenen vorgeschriebenen "Kill" Timeout.

Ich habe diese Funktion in meinem eigenen Code noch nicht implementiert, aber ehrlich gesagt keine Ahnung, ob es in Ihrer Situation funktionieren wird, aber es ist eine Untersuchung wert.