2013-02-15 2 views
10

Ich weiß, dass NVIDIA-GPUs mit Rechenkapazität 2.x oder höher ausführen kann u 16 Kerne gleichzeitig PTO. Allerdings erzeugt meine Anwendung 7 "Prozesse" und jeder dieser 7 Prozesse startet CUDA-Kernel.Mehrere Prozesse starten CUDA Kerne parallel

Meine erste Frage ist, was das erwartete Verhalten dieses Kerns wäre. Werden sie gleichzeitig ausgeführt, oder würden sie von verschiedenen Prozessen gestartet, würden sie sequentiell ausgeführt werden.

Ich bin verwirrt, weil der CUDA C Programming Guide, sagt: „Ein Kernel von einem CUDA Kontext kann nicht gleichzeitig mit einem Kern aus einem anderen CUDA Kontext ausführen“

Das bringt mich zu meiner zweiten Frage, was sind CUDA "Kontexte"?

Danke!

Antwort

14

A CUDA Kontext ist ein virtueller Ausführungsraum, der den Code und die Daten im Besitz von einem Host-Thread oder Prozess hält. Mit der aktuellen Hardware kann immer nur ein Kontext auf einer GPU aktiv sein.

So, um Ihre erste Frage zu beantworten, wenn Sie sieben separate Threads oder Prozesse haben alle versuchen, einen Kontext zu etablieren und auf der gleichen GPU gleichzeitig laufen, werden sie serialisiert und alle Prozesse warten auf den Zugriff auf die GPU gesperrt werden bis der Besitzer des laufenden Kontextes ergibt. Es gibt meines Wissens keine Zeitaufteilung und die Scheduling-Heuristiken sind nicht dokumentiert und (ich würde vermuten) nicht einheitlich vom Betriebssystem zum Betriebssystem.

würden Sie besser sein, einen einzelnen Worker-Thread zu starten, um einen GPU Zusammenhang hält und Messaging von den anderen Threads verwenden Arbeit auf die GPU zu schieben. Alternativ dazu steht in der CUDA-Treiber-API eine Kontextmigrationsfunktion zur Verfügung, die jedoch nur mit Threads aus demselben Prozess funktioniert und der Migrationsmechanismus Latenz und Host-CPU-Overhead aufweist.

0

Benötigen Sie wirklich separate Threads und Kontexte haben? Ich glaube, dass Best Practice ein Kontext pro GPU ist, weil mehrere Kontexte auf einer einzelnen GPU einen ausreichenden Overhead bringen.

Um viele Kernel concrurrenlty auszuführen, sollten Sie einige CUDA-Streams in einem CUDA-Kontext erstellen und jeden Kernel in einen eigenen Stream einreihen - damit sie gleichzeitig ausgeführt werden, wenn genügend Ressourcen dafür vorhanden sind.

Wenn Sie den Kontext aus wenigen CPU-Threads zugänglich machen müssen - Sie können cuCtxPopCurrent(), cuCtxPushCurrent() verwenden, um sie herumzugeben, aber nur ein Thread kann jederzeit mit dem Kontext arbeiten.

+0

Würden Sie bitte bestätigen, dass mehrere Kontexte gleichzeitig auf einer einzelnen GPU aktiv sein können? – Tariq

+0

@Tariq, ich habe nicht gesagt, daß) Ich kann bestätigen, dass Sie zwei Programme mit zwei Kontexten auf einer gpu gleichzeitig laufen können, aber ich aw nicht bewusst, wenn sie beide aktiv sein werden oder der Fahrer Workflow wechselt irgendwie. – ShPavel

+0

http://stackoverflow.com/questions/31643570/running-more-than-one-cuda-applications-on-one-gpu – pgoetz