OpenCL - Multiple GPU Buffer Synchronisation

Ich habe einen OpenCL-Kernel, der die Gesamtkraft auf ein Partikel berechnet, die von anderen Partikeln im System ausgeübt wird, und einen anderen, der die Partikelposition / -geschwindigkeit integriert. Ich möchte diese Kernel über mehrere GPUs hinweg parallelisieren und im Grunde genommen jeder GPU eine gewisse Partikelmenge zuweisen. Ich muss diesen Kernel jedoch mehrmals ausführen, und das Ergebnis jeder GPU wird auf jeder anderen verwendet. Lassen Sie mich das noch etwas näher erläutern:

Angenommen, Sie haben Partikel 0 auf GPU 0 und Partikel 1 auf GPU 1. Die Kraft auf Partikel 0 wird ebenso wie die Kraft auf Partikel 1 geändert, und dann werden ihre Positionen und Geschwindigkeiten vom Integrator entsprechend geändert. Dann müssen diese neuen Positionen auf jeder GPU platziert werden (beide GPUs müssen wissen, wo sich Partikel 0 und Partikel 1 befinden), und diese neuen Positionen werden verwendet, um die Kräfte auf jedes Partikel im nächsten Schritt zu berechnen, die von der GPU verwendet werden Integrator, dessen Ergebnisse zur Berechnung von Kräften usw. usw. verwendet werden.Grundsätzlich müssen alle Puffer die gleichen Informationen enthalten, bis die Kraftberechnungen durchgeführt werden.

Die Frage ist also:Was ist der beste Weg, um Puffer über GPUs hinweg zu synchronisieren, vorausgesetzt, jede GPU hat einen anderen Puffer? Sie können nicht einen gemeinsamen Puffer haben, wenn ich Parallelität beibehalten möchte,gemäß meiner letzten Frage (Wenn es jedoch eine Möglichkeit gibt, einen gemeinsamen Puffer zu erstellen und trotzdem mehrere GPUs zu behalten, bin ich dafür). Ich vermute, dass das Kopieren der Ergebnisse in jedem Schritt mehr Verlangsamung zur Folge hat, als es sich lohnt, den Algorithmus über GPUs hinweg zu parallelisieren.

Ich habe gefundendieser ThreadDie Antwort war jedoch nicht sehr eindeutig und galt nur für einen einzelnen Puffer auf allen GPUs. Ich würde gerne wissen, speziell für Nvidia-GPUs (genauer gesagt der Tesla M2090).

BEARBEITEN: Eigentlich lautDieser Thread in den Khronos-ForenLaut einem Vertreter der OpenCL-Arbeitsgruppe wird ein einzelner Puffer in einem gemeinsam genutzten Kontext tatsächlich auf mehrere GPUs verteilt, wobei jede darauf achtet, dass die neuesten Informationen im Speicher sind. Ich sehe dieses Verhalten jedoch nicht auf Nvidia-GPUs. wenn ich benutzewatch -n .5 nvidia-smi Während mein Programm im Hintergrund ausgeführt wird, wird die Speichernutzung einer GPU für eine Weile erhöht und dann verringert, während die Speichernutzung einer anderen GPU erhöht wird. Gibt es jemanden da draußen, der mir damit die richtige Richtung weisen kann? Vielleicht ist es nur ihre Umsetzung?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage