Ich beginne gerade Julias CUDArt-Paket zu verwenden, um GPU-Computing zu verwalten. Ich frage mich, wie ich sicherstellen kann, dass, wenn ich gehe, um Daten von der GPU zu ziehen (z. B. unter Verwendung von to_host()
), dass ich dies nicht tue, bevor alle notwendigen Berechnungen daran durchgeführt worden sind.Synchronisieren mit Julia CUDArt?
Durch einige Experimente scheint es, dass to_host(CudaArray)
verzögert wird, während das bestimmte CudaArray aktualisiert wird. Also, vielleicht reicht das nur aus, um die Sicherheit zu gewährleisten? Aber es scheint ein bisschen chancy.
Momentan verwende ich die launch()
Funktion, um meine Kernel auszuführen, wie im Paket documentation dargestellt.
Die CUDArt-Dokumentation gibt ein Beispiel mit Julias @sync
Makro, das scheint, als könnte es schön sein. Aber für die Zwecke von @sync
bin ich fertig mit meiner "Arbeit" und bereit, weiterzugehen, sobald der Kernel mit launch()
gestartet wird, nicht sobald es fertig ist. So weit ich die Operation von launch()
verstehe - gibt es keine Möglichkeit, diese Funktion zu ändern (z. B. um zu warten, dass sie die Ausgabe der Funktion erhält, die sie "startet").
Wie kann ich eine solche Synchronisation erreichen?
Guter Punkt. Ich denke, 'device_synchronize' kann immer noch in einer Reihe von Einstellungen nützlich sein. 1. Sie können es zusammen mit anderen Funktionen wie CUBLAS, CUSPARSE usw. verwenden, die keine Streams als Argumente verwenden. Wenn Sie nur mit einer einzigen GPU arbeiten, benötigen Sie möglicherweise nicht einmal Streams, und so kann 'device_synchronize' zu etwas einfacheren Anwendungen führen. –