n-Body Simulation -> 64-Bit-Assembler + MultiThread + AssembleIt2() Update Benchmark


  • Hatte ich auch schon getestet, habe aber das mit 4 Threads gepostet, da ihr alle auch 4 Threads benutzt habt (Direkter Vergleich).

    Ist noch wesentlich mehr drin, da lief noch so einiges nebenbei. Außerdem bleibt die CPU konstant bei 2.20 GHz, und feuert nicht in den Turbo. ^^

    lg

  • Zitat

    Ist noch wesentlich mehr drin, da lief noch so einiges nebenbei. Außerdem bleibt die CPU konstant bei 2.20 GHz, und feuert nicht in den Turbo.

    Das würde ich gerne sehen, denn imho schalten die INTEL Prozessoren einen Core nur dann in den Turbo-Modus, wenn dafür ein anderer Schlafen gelegt wird.
    Daher auch der Vorsprung der single-thread-Performance gegenüber AMD.

    Starte doch mal mit nur einem oder zwei Threads, dann sollte sich der Turbo einschalten. Dann aber den Prozessortakt mit bspw. CPUZ verifizieren und per Hand in das Ergebnis eintragen.
    Bei mir funktioniert die richtige Darstellung des Prozessortaktes im Benchmark nicht (ich benutze K10STAT )

  • Nein, auch bei 1 oder 2 Threads taktet er nicht hoch. Und ich habe die Taktfrequenz die ganze Zeit über mit einem externen Tool überprüft. ^^

    Man muss doch irgendwie den Turbo erzwingen können... Per OC oder so. Da der Turbo auf 3.2 GHz taktet, sollte die CPU ja auch so viel aushalten.

    lg

    edit:

    Hab grad durch ein wenig rumspielen im BIOS scheinbar was gedreht: Bei 8 Threads taktet er auf 2.80 GHz hoch:

    Das sieht schon besser aus. 8)

  • Meine Ergebnisse:

    Spoiler anzeigen

    Benchmark n-Body-Simulation

    Number Particles: 30000
    Processor: Intel(R) Core(TM) i5-3570K CPU @ 3.40GHz
    Number Processors(Cores): 4
    Number Threads: 4
    Overall Time: 109.97 Seconds
    Number Loops benchmarked: 475

    Average Interacts/sec: 1.58e+010
    Maximum Interacts/sec: 2.02e+010

    Average Ticks/Interact: 11.50 CAUTION! Depends on real Clockticks!
    Minimum Ticks/Interact: 10.68 CAUTION! Depends on real Clockticks!

    Average Clockticks[Mhz]: 3400
    Maximum Clockticks[Mhz]: 3400

    Average Looptime: 230.20 Milliseconds
    Fastest Looptime: 178.02 Milliseconds

  • Joa,
    hier mal von nem halbwegs altem Quad-Core(AMD)

    Spoiler anzeigen


    Benchmark n-Body-Simulation

    Number Particles: 30000
    Processor: AMD Phenom(tm) II X4 955 Processor
    Number Processors(Cores): 4
    Number Threads: 4
    Overall Time: 10.39 Seconds
    Number Loops benchmarked: 24

    Average Interacts/sec: 8.84e+009
    Maximum Interacts/sec: 1.13e+010

    Average Ticks/Interact: 20.15 CAUTION! Depends on real Clockticks!
    Minimum Ticks/Interact: 17.86 CAUTION! Depends on real Clockticks!

    Average Clockticks[Mhz]: 3200 CAUTION! Clockticks may NOT match if over/underclocked! Please insert the real Clockticks!
    Maximum Clockticks[Mhz]: 3200 CAUTION! Clockticks may NOT match if over/underclocked! Please insert the real Clockticks!

    Average Looptime: 417.86 Milliseconds
    Fastest Looptime: 318.17 Milliseconds



    nr2: , 10 sec

    Spoiler anzeigen


    Benchmark n-Body-Simulation

    Number Particles: 30000
    Processor: AMD Phenom(tm) II X4 955 Processor
    Number Processors(Cores): 4
    Number Threads: 4
    Overall Time: 31.26 Seconds
    Number Loops benchmarked: 87

    Average Interacts/sec: 1.04e+010
    Maximum Interacts/sec: 1.14e+010

    Average Ticks/Interact: 18.32 CAUTION! Depends on real Clockticks!
    Minimum Ticks/Interact: 17.85 CAUTION! Depends on real Clockticks!

    Average Clockticks[Mhz]: 3172 CAUTION! Clockticks may NOT match if over/underclocked! Please insert the real Clockticks!
    Maximum Clockticks[Mhz]: 3200 CAUTION! Clockticks may NOT match if over/underclocked! Please insert the real Clockticks!

    Average Looptime: 347.16 Milliseconds
    Fastest Looptime: 315.80 Milliseconds


  • Andy: Auf meinem anderen Rechner läufts tadellos. Sogar relativ flott :)

    Mal schauen was passiert wenn man ihn auf 4GHz schraubt :D (mach ich aber jetzt nicht, hab nen schlechten Kühler drauf...)

  • Zitat

    hier mal von nem halbwegs altem Quad-Core(AMD)

    hehe, ich glaube ich habe meine Aufrüstprozessor für meinen X2 250^^, den X4 955 gibts für 70€, der hält mit den doppelt so teuren Intels ja locker mit :D
    ...wobei es für einen 10er mehr gibts schon nen Quadcore-Piledriver mit FM4A und AVX 8o
    ...und für noch nen 10er mehr gibts den als 6-Core....ich denke, da gibts nicht mehr viel zu diskutieren :rolleyes:

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (7. Juli 2013 um 21:24)

  • Dafür dass der PC schon fast 5 Jahre alt ist und die früher nach dieser Zeit hoffnungslos veraltet waren, ist mein Prozessor im Vergleich erstaunlich gut:

  • Zitat

    Dafür dass der PC schon fast 5 Jahre alt ist und die früher nach dieser Zeit hoffnungslos veraltet waren, ist mein Prozessor im Vergleich erstaunlich gut:

    im Vergleich zu den in der c´t mit diesem Algorithmus beaufschlagten Kalibern wie XEON ES, Opteron und XEON Phi schlagen sich die 08/15 Prozessoren hier erstaunlich gut! Gegen die Tesla K20x mit CUDA-Kerneln ist aber kein Kraut gewachsen....
    Weder wurde im vorliegenden Programm AVX verwendet (bringt ca. Faktor 2), noch irgendwelche schweinischen Tricks wie "flush denormals to Zero" (fängt underflows ab). Ich glaube mit einigen weiteren Optimierungen könnte man sogar noch etwas Speed herausholen.
    Als C/C++-Programmierer hat man es einfach und die Optimierungen sind ruckzuck per diversen Compilerschaltern erledigt. WENN man SoA beachtet, ansonsten hilft einem der schönste und beste Compiler nichts, ein schlecht designtes Programm optimiert auch kein INTEL-Compiler zu einem guten...wzbw.

    Ich werde mal die Prozessorflags zur "schnelleren" Berechnung von floats aktivieren und ggf. noch Tiling (optimiertes Verfahren um die im Cache befindlichen Daten möglichst häufig zu nutzen) einbauen. Und mir von einigen von euch noch Tips fürs MultiThreading holen (müssen^^)
    Dann wird es spannend, denn die Benchmarks soll(t)en in überschaubaren Zeiten auch bis zu 100000 Partikel berechnen 8o.

    Ich hab mir schon diverse Profiling-Tools runtergeladen, leider habe ich es bis jetzt nioch nicht fertiggebracht, den Code zur Laufzeit zu untersuchen. Ggf. muss ich eine DLL erstellen, um Zugriff über die Symbolbibliotheken zu erhalten...
    Kennt sich jemand von euch mit CodeAnalyst oder CodeXL aus?

  • Was ich interessant finde ist, dass die ganzen i7er alle nicht überragend sind.
    Dabei sind die je nach Modell schweine teuer.

    Hat nicht zufällig jemand einen i7 Extreme oder sowas mit mehr als 4 Kernen, oder einen AMD mit mehr als 4 Kernen ?

  • -Update 13.07.2013
    Assembler-Code angepasst bei der Kräfteberechnung 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.

    Beim Testen ist mir aufgefallen, dass eine höhere Threadanzahl eine höhere durchschnittliche Performance nach sich zieht!
    Die Antwortzeiten der Threadschleife werden besser, was die Schlussfolgerung nach sich zieht, dass einem Prozess mit mehr Threads auch mehr Rechenzeit zugeordnet wird.
    Mit meinem 4-Core Prozessor bekomme ich bei 16 Threads die besten Durchschnittswerte.
    Die ersten Threads sind extrem schnell "fertig", je weniger Threads noch zu bearbeiten sind, desto länger dauert deren Ausführungszeit.
    Ich werde mal testen ob es sich lohnt, einen neuen Thread anzuwerfen, sobald einer fertig geworden ist. Zzt. wird ja so lange gewartet, bis ALLE Threads fertig sind.

    Weiterhin habe ich keine Auswirkungen beim Setzen bzw. Ausschalten der Prozessorflags FTZ Flush To Zero und DAZ Denormals Are Zero bemerkt. In der Literatur wird von stark verbesserter Performance gesprochen, ihr könnt das ausprobieren, indem ihr die entsprechenden Zeilen im Assemblercode (ganz am Anfang) aus bzw. einschaltet. (Neu Assemblieren danach nicht vergessen^^)

    Um die Ergebnisse der verschiedenen Prozessoren untereinander vergleichbar zu machen, wurde beim Benchmark der Wert "Steps per second" eingeführt. Er beschreibt die Anzahl der Berechnungsschritte pro Sekunde (ähnlich FPS).