// EDIT Vielen Dank an die Tester eukalyptus, UEZ und die vielen anderen, die ich mit meinen PN´s nerven, und auf deren Rechnern ich meine Programme testen darf
Hi,
hier gibts einiges zur n-Body-Simulation zu lesen.
Ich hab mich mal dran gemacht, den "inner loop" in 64-Bit-Assembler zu schreiben, und weil ich schon dabei war, gabs Multithreading noch dazu^^
Das folgende Script läuft nur unter 64Bit-Betriebssystemen!
Für die "Bastler" ist noch eine neue (Vorab-) Version von AssembleIt() angehängt. In dieser ist jetzt die FASM.dll im Script enthalten und wird direkt in den Speicher geladen (keine dll-Datei). Auf die FASM-UDF und Memory.UDF wird also völlig verzichtet
Weiterhin wurde das "inlinen" noch weiter vereinfacht, der Assemblercode wird einfach zwischen #cs und #ce geschrieben.
Bei Syntaxfehlern im Assemblercode springt der Cursor in Scite in die betreffende Zeile!
Einen kleinen Wermutstropfen gibt es aber....die FASM.dll ist nur in 32-Bit verfügbar. Sie kann zwar anstandslos 64-Bit-Code assemblieren, aber nur aus einer 32Bit-Umgebung gestartet werden.
Dazu habe ich mir folgenden Workaround überlegt:
Erst per
#AutoIt3Wrapper_UseX64=n
[/autoit]den Code assemblieren und dann einfach mit
[autoit]#AutoIt3Wrapper_UseX64=y
[/autoit]ausführen^^
Beim Assemblieren wird dann bspw. eine Datei mit dem Binärcode angelegt, die dann eingelesen werden kann, alternativ könnte man auch direkt in die Scriptdatei schreiben...
Vorteil bei 64Bit ist einfach die UNMENGE an verfügbaren Prozessorregistern. In der n-Body-Simulation gibt es nur noch Schreib- und Lesezugriffe in den Speicher um die Koordinaten einzutragen. Die gesamte Schwerkraft-Berechnung läuft in einer Handvoll Takte in den Prozessor-Registern ab!
Da auch die 128-Bit SSE-Register verwendet werden, kann man die Interaktionen von 4 Körpern gleichzeitig berechnen.
Um bei den heute vorhandenen Multi-Cores das letzte an Power rauszuholen, habe ich auch noch Multithreading integriert. Das war wesentlich einfacher, als ich gedacht hatte...
Wer also "FETTE" Prozessoren hat, der sollte mal schauen, was so geht....mein AMD A6-3400M (Laptop 4-cores @2400Mhz) schafft bei 30000 Partikeln 9.8e009 Interaktionen/Sekunde und 8 Takte/Interaktion, OHNE AVX, das 8 Körper gleichzeitig berechnet!
Mal zum Vergleich, ein XEON-Phi 5110P mit 61 physischen Kernen schafft bei 24400 Partikeln "NUR" 54e009 Interaktionen/Sekunde (gleicher Algorithmus, beste Optimierung INTEL-Compiler! ). Bei 15x mehr Prozessoren also nur 5x mehr Leistung....LÄCHERLICH!!!
Eine Tesla K20x liefert in etwa 80e009 Interaktionen/Sec. bei 24400 Partikeln, bei einer Million Partikeln (lmaa) ca. 120e009 Interaktionen/Sec, DAS ist Power
Genaueres zum Thema gibt es HIER (sehr lesenswert!!!)
Wer einmal assembliert hat, kann die ersten 325 Scriptzeilen weglassen^^ //EDIT oder gleich die Version "ohne ASM-Code und AssembleIt" starten
VIEL SPASS!
.....und schaut, ob eure Lüfter alle drehen....
-Update 06.07.2013
Rotation hinzugefügt, Anzeige verbessert
-Update 07.07.2013
Performance-Counter angepasst, RDTSC muss bei mehreren Threads durch CPUID serialisiert werden ! Thx an eukalyptus fürs testen!
GUI angepasst, um die Titelleiste des Fensters im Sichtbereich zu halten
-Update 13.07.2013
Assembler-Code angepasst von 1/sqrt() ^4 zu 1 / sqrt() ^3 (Thx an eukalyptus), beeinflusst die Benchmarkergebnisse nicht.
Vergleichbare Berechnungsschritte pro Sekunde zum Benchmark hinzugefügt
Setzen der Prozessorflags FTZ Flush To Zero und DAZ Denormals Are Zero, um auch bei unterschiedlichen Betriebssystemen gleiche Startparameter für das Behandeln von Floating-Point-Exceptions zu erhalten.
autoit.de/wcf/attachment/22322/
autoit.de/wcf/attachment/21992/
autoit.de/wcf/attachment/22327/ Benchmark
Als grafisches Gimmick habe ich zwei "Galaxien" kollidieren lassen:
autoit.de/wcf/attachment/22007/autoit.de/wcf/attachment/22087/
Benchmarkergebnisse:
Spoiler anzeigen
Benchmark n-Body-Simulation
Number Particles: 30000
Processor: AMD A6-3400M APU with Radeon(tm) HD Graphics
Number Processors(Cores): 4
Number Threads: 4
Overall Time: 73.81 Seconds
Number Loops benchmarked: 113
Average Interacts/sec: 5.80e+009
Maximum Interacts/sec: 6.20e+009
Average Steps/sec: 1.60
Maximum Steps/sec: 1.72
Average Ticks/Interact: 14.71 CAUTION! Depends on real Clockticks!
Minimum Ticks/Interact: 14.36 CAUTION! Depends on real Clockticks!
Average Clockticks[Mhz]: 1400 CAUTION! Clockticks may NOT match if over/underclocked! Please insert the real Clockticks!
Maximum Clockticks[Mhz]: 1400 CAUTION! Clockticks may NOT match if over/underclocked! Please insert the real Clockticks!
Average Looptime: 627.44 Milliseconds
Fastest Looptime: 580.69 Milliseconds
Spoiler anzeigen
Benchmark n-Body-Simulation
Number Particles: 30000
Processor: AMD A6-3400M APU with Radeon(tm) HD Graphics
Number Processors(Cores): 4
Number Threads: 4
Overall Time: 45.73 Seconds
Number Loops benchmarked: 97
Average Interacts/sec: 8.11e+009
Maximum Interacts/sec: 9.97e+009
Average Steps/sec: 2.23
Maximum Steps/sec: 2.77
Average Ticks/Interact: 9.56 CAUTION! Depends on real Clockticks!
Minimum Ticks/Interact: 8.89 CAUTION! Depends on real Clockticks!
Average Clockticks[Mhz]: 2300 Clockticks K10stat
Maximum Clockticks[Mhz]: 2300
Average Looptime: 451.31 Milliseconds
Fastest Looptime: 361.01 Milliseconds