Ich habe dieses Problem kürzlich angesprochen, indem ich einige dieser Antworten als Ausgangspunkt genommen habe. Das Hilfreichste ist, dass Boids eine Art einfache N-Körper-Simulation sind: Jedes Boid ist ein Partikel, das eine Kraft auf seine Nachbarn ausübt.
Ich fand das Linde-Papier schwer zu lesen; Ich schlage stattdessen vor, SJ Plimptons "Fast Parallel Algorithms for Short-Range Molecular Dynamics" zu betrachten , auf die sich Linde bezieht. Plimptons Artikel ist weitaus lesbarer und detaillierter mit besseren Zahlen:
Kurz gesagt, ordnen Atomzerlegungsmethoden jedem Prozessor permanent eine Untergruppe von Atomen zu, Zwangszerlegungsmethoden ordnen jedem Prozess eine Untergruppe von paarweisen Kraftberechnungen zu, und räumliche Zerlegungsmethoden ordnen jedem Prozess einen Unterbereich der Simulationsbox zu .
Ich empfehle Ihnen, AD zu versuchen. Es ist am einfachsten zu verstehen und umzusetzen. FD ist sehr ähnlich. Hier ist die n-Body-Simulation von nVidia mit CUDA unter Verwendung von FD, die Ihnen eine ungefähre Vorstellung davon geben soll, wie durch Kacheln und Reduzieren die Serienleistung drastisch gesteigert werden kann.
SD-Implementierungen sind im Allgemeinen Optimierungstechniken und erfordern ein gewisses Maß an Choreografie, um sie zu implementieren. Sie sind fast immer schneller und skalieren besser.
Dies liegt daran, dass AD / FD das Erstellen einer "Nachbarliste" für jedes Boid erfordert. Wenn alle boid Bedarf die Position seiner Nachbarn wissen, ist die Kommunikation zwischen ihnen O ( n ²). Sie können Verlet Nachbarlisten verwenden , um die Größe der Fläche , die jeweils boid Kontrollen zu reduzieren, was die Liste alle paar Zeitschritte statt jedem Schritt wieder aufbauen können, aber es ist immer noch O ( n ²). In SD hat jede Zelle eine Nachbarliste, während in AD / FD jede Zelle eine Nachbarliste hat. Anstatt also jedes Boid miteinander zu kommunizieren, kommuniziert jede Zelle miteinander. Diese Reduzierung der Kommunikation ist der Grund für die Geschwindigkeitssteigerung.
Leider sabotiert das Boids-Problem die SD etwas. Es ist am vorteilhaftesten, wenn jeder Prozessor den Überblick über eine Zelle behält, wenn die Boids über die gesamte Region verteilt sind. Aber Sie möchten, dass sich Boids zusammenballen! Wenn sich Ihre Herde richtig verhält, tickt die überwiegende Mehrheit Ihrer Prozessoren ab und tauscht leere Listen miteinander aus. Eine kleine Gruppe von Zellen führt dann dieselben Berechnungen wie AD oder FD durch.
Um dies zu bewältigen, können Sie entweder die Größe der Zellen (die konstant ist) mathematisch anpassen, um die Anzahl der leeren Zellen zu einem bestimmten Zeitpunkt zu minimieren, oder den Barnes-Hut-Algorithmus für Quad-Bäume verwenden. Der BH-Algorithmus ist unglaublich leistungsfähig. Paradoxerweise ist die Implementierung auf parallelen Architekturen äußerst schwierig. Dies liegt daran, dass ein BH-Baum unregelmäßig ist und daher von parallelen Threads mit sehr unterschiedlichen Geschwindigkeiten durchlaufen wird, was zu einer Thread-Divergenz führt. Salmon und Dubinski haben orthogonale rekursive Bisektionsalgorithmen vorgestellt, um die Quadtrees gleichmäßig auf die Prozessoren zu verteilen. Diese müssen für die meisten parallelen Architekturen iterativ angepasst werden.
Wie Sie sehen, befinden wir uns an dieser Stelle eindeutig im Bereich der Optimierung und der schwarzen Magie. Versuchen Sie erneut, Plimptons Zeitung zu lesen, und prüfen Sie, ob dies sinnvoll ist.