2014-02-28 4 views
5

Cuda Streams und Speicher cpyasync, so weit ich weiß, müssen wir verschiedene Kernels, Speicheroperationen zu verschiedenen Streams beschriften, um die GPU-Operationen gleichzeitig mit CPU-Operationen zu machen.Ist es möglich, einen persistenten Cuda Kernel asynchron laufen zu lassen und mit CPU zu kommunizieren?

Aber ist es möglich, einen persistenten Kernel zu haben. Dieser Kernel wird einmalig gestartet, wobei für immer eine Schleife durchlaufen wird und "einige Flags" überprüft werden, um zu sehen, ob ein Datenelement von der CPU kommt, das dann darauf arbeitet. Wenn diese "Stück" -Daten beendet sind, setzt die GPU ein "Flag" auf die CPU, die CPU sieht es und kopiert die Daten zurück. Dieser Kernel wird nie fertig ausgeführt.

Gibt es das im aktuellen Cuda Programmiermodell? Was wird mir am nächsten kommen?

Antwort

6

Ja, das ist möglich. Ein Ansatz besteht darin, einen Host-Speicher ohne Kopie (d. H. GPU-gemappt) zu verwenden. Der Host platziert seine Daten im zugeordneten Bereich, und die GPU kommuniziert zurück im zugeordneten Bereich. Offensichtlich erforderte das Polling, aber das ist in Ihrer Frage inhärent.

Diese answer gibt Ihnen die meisten Rohrleitungen, die Sie für einen einfachen Testfall benötigen.

Es gibt auch die simple zero-copy sample code.

Diese answer bietet ein komplizierteres, vollständig ausgearbeitetes Beispiel.

Natürlich möchten Sie dies in einer Umgebung tun, in der keine Timeout-Watchdogs aktiviert sind.