2016-07-27 5 views
0

Ich schreibe gerade eine App zum Streamen von OpenGL-Inhalten, daher CUDA mit NVidias NVenc-API. Ich habe bemerkt, dass das Anrufen cuInit(0) - was als ein erster Aufruf erfolgen sollte, um Cuda zu initialisieren, gemäß vieler Tutorials, den Erfolg meines Cuda Kernel nicht ändert. Ob ich es anrufe oder nicht, das Programm läuft in beiden Szenarien.cuInit (0) nicht mehr benötigt?

Haben sie es geändert? Ich habe nach Informationen gesucht, konnte aber nichts finden.

Danke!

Bit A weitere Informationen:

erster Schritt wird ein Gerät unter Verwendung von cudaSetDevice() Cuda zu schaffen - Runtime API. Zweiter Schritt, erstellen Sie einen Kontext mit cuCtxCreate() - Driver API. Danach kann ich einen Kernel mit Triple-Chevron-Syntax mit einem Cuda-Array über cudaMalloc() zugewiesen starten.

+1

Verwenden Sie den CUDA-Treiber oder die Laufzeit-API? – talonmies

+0

Beide APIs funktionieren. – Christoph

+0

Das habe ich nicht gefragt. Verwendet Ihr Code die Laufzeit-API oder die Treiber-API? NVenc selbst hat nichts mit CUDA zu tun und benötigt keinen CUDA-Kontext. – talonmies

Antwort

1

Wenn der erste Aufruf in Ihrem Code ist, wie Sie sagen, cudaSetDevice(), und Ihre CUDA-Version ist CUDA 4 oder neuer, dann wird dies implizit einen Kontext einrichten, und es gibt keine Voraussetzung, etwas anderes zu tun, um eine CUDA zu machen Laufzeit-API-Sitzung funktioniert ordnungsgemäß.

Sie sollten nicht Anruf cuCtxCreate oder cuInit danach. Wenn Sie eine echte Anforderung haben, sowohl die Laufzeit- als auch die Treiber-API zu verwenden (und es klingt nicht wie Sie), gibt es eine supported and documented Methode dafür. Die Faustregel lautet entweder der Treiber-API oder die Laufzeit-API, aber nicht beide, und wenn Sie keinen Grund haben, die Treiber-API zu verwenden, dann verwenden Sie sie nicht. Die Laufzeit-API ist einfacher, sauberer und weniger ausführlich.

+0

Ok, danke. Also wenn ich ein Handle zu einem gültigen CudaContext benötige, muss ich den Treiber api verwenden und bestenfalls jeden Aufruf an die Runtime-API auslassen? – Christoph

+0

Nein. Wenn Sie Treiber-API-Funktionen benötigen, ist es immer noch OK, die APIs zu mischen, aber folgen Sie dem in meiner Antwort beschriebenen Prozess: Verwenden Sie die Treiber-API, um den Kontext zu erstellen, und verwenden Sie danach die Laufzeit-API muss in einem solchen Anwendungsfall 'cuInit (0)' als ersten Aufruf aufrufen) – talonmies

+0

Viel geholfen! Vielen Dank. – Christoph