Ich fange gerade an, 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. mit to_host()
), dass ich dies nicht tun, bevor alle notwendigen Berechnungen darauf durchgeführt wurden.
Durch einige Experimente scheint to_host(CudaArray)
zu warten, 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.
Im Moment verwende ich die Funktion launch()
, um meine Kernel auszuführen, wie in der Dokumentation zum Paket dargestellt.
Die CUDArt-Dokumentation gibt ein Beispiel mit Julias @sync
-Makro, das sehr nett zu sein scheint. Aber für die Zwecke von @sync
bin ich fertig mit meiner "Arbeit" und bereit weiterzumachen, sobald der Kernel mit launch()
gestartet wird, nicht sobald er fertig ist. Soweit ich die Operation von launch()
verstehe - gibt es keine Möglichkeit, diese Funktion zu ändern (z. B. um zu warten, bis sie die Ausgabe der Funktion erhält, die sie "startet").
Wie kann ich eine solche Synchronisation erreichen?
Ich denke, der kanonischere Weg besteht darin, für jedes Gerät einen Stream zu erstellen:
streams = [(device(dev); Stream()) for dev in devlist]
und dann innerhalb des Blocks @async
, nachdem Sie es angewiesen haben, die Berechnungen auszuführen, verwenden Sie die wait(stream)
-Funktion, um sie darauf hinzuweisen, dass der Stream seine Berechnungen beendet. Siehe das Streams-Beispiel in der README.
Ok, also, es gibt nicht eine Menge Dokumentation über das CUDArt-Paket, aber ich habe mir den Quellcode angeschaut und ich denke, dass es einfach aussieht, wie das geht. Insbesondere scheint es, dass es eine Funktion device_synchronize()
gibt, die blockiert, bis alle Arbeiten am gerade aktiven Gerät beendet sind. So scheint insbesondere folgendes zu funktionieren:
Ich würde gerne von jemandem mit mehr Sachkenntnis hören, wenn es noch etwas mehr zu beachten gibt.
Tags und Links parallel-processing julia-lang julia-gpu