Was braucht mehr Rechenleistung,...



  • otze schrieb:

    SeppJ schrieb:

    Verwechsele Latenz nicht mit Rechenzeit! Es mag zwar 100 ns dauern bis der Hauptspeicher antwortet, aber dann kommen mit der Antwort auch gleich 8 Bytes und das viele Milliarden mal pro Sekunde, ohne weitere Verzögerung. Mehr als genug, um den Prozessor voll zu beschäftigen, außer bei den allertrivialsten Rechnungen.

    Normalerweise ist ja der L1-Cache darauf ausgelegt, den Prozessor zu saturieren. RAM ist Faktor 50-100 langsamer. Also so ziemlich alle operationen unter exp stoßen damit an das Speicherbottleneck. Das merkt man sehr schnell, wenn man mal matrix-vektor produkte benchmarkt. Wenn die Matrix nicht in den Cache passt, tut das der performance richtig weh. Also so 5 floating point multiplikationen sollte man schon machen, bevor man das nächste element vom speicher nimmt.

    vielleicht bei vector dot vector, aber matritzen multiplikationen sind sehr cache freundlich. die benchmarks die gemacht werden bei sowas sind normalerweise viele MB gross, da passt wenig in den L1, allerdings kannst du die operationen so anlegen, dass sie cache freundlich sind. jedes element einer N*N matrix wird N mal mit einer ganzen zeile bzw spalte multipliziert. reuse ist also sehr hoch.
    entsprechend kann intel jedesmal wenn sie die rechenleistung verdoppel und die bandbreite um magere 10% oder so steigt, trotzdem 80% ihres theoretischen GFlop wertes rausbekommen.
    z.b. wenn man 50% mehr cores hat http://www.intel.com/content/www/us/en/benchmarks/server/xeon-e5-2600-v2/xeon-e5-v2-hpc-matrix-multiplication.html
    steigt die performance um 48% bei der matrix multiplikation in Linpack. und falls du dich wunders wie gross die matrix ist:

    For HPL What problem size N should I run ?

    In order to find out the best performance of your system, the largest problem size fitting in memory is what you should aim for. The amount of memory used by HPL is essentially the size of the coefficient matrix. So for example, if you have 4 nodes with 256 Mb of memory on each, this corresponds to 1 Gb total, i.e., 125 M double precision (8 bytes) elements. The square root of that number is 11585. One definitely needs to leave some memory for the OS as well as for other things, so a problem size of 10000 is likely to fit. As a rule of thumb, 80 % of the total amount of memory is a good guess. If the problem size you pick is too large, swapping will occur, and the performance will drop. If multiple processes are spawn on each node (say you have 2 processors per node), what counts is the available amount of memory to each process.

    quasi: je groesser die matrix, desto besser fuer dich.

    ich wollte das schon immer mal Benchmarken, wieviele multiplikationen man da pro element braucht...

    das kannst du leicht ausrechnen, ein core kann 2float operationen durchfuehren, die komplexeste ist FMAC, was also *+ ist und das kann ein intel core auf 8floats dank AVX2. wenn ich mich nicht verrechne, konsumierst du also 32flots ->128byte pro operation, bei 4GHz sind das ca 512GB/s. ein quad channel system von intel auf dem 2011 socket kann da 51.2GB/s schaffen (zufall? :D), du kannst also 5multiplikationen und 5additionen pro speicher transaktion machen. theoretisch.



  • SeppJ schrieb:

    Etwas, das < 5 Multiplikationen benötigt würde ich unter triviale Berechnung verbuchen.

    er meint 5 pro speicher zugriff, ob es trivial ist haengt dann von der datenmenge ab.


  • Mod

    rapso schrieb:

    SeppJ schrieb:

    Etwas, das < 5 Multiplikationen benötigt würde ich unter triviale Berechnung verbuchen.

    er meint 5 pro speicher zugriff

    Ich auch.

    Wenn du einfach nur die Summe von 1 GB Zahlen berechnen willst, ja, dann ist der Hauptspeicher zu langsam für die CPU. Das meine ich mit trivialer Rechnung: Den Rechenaufwand pro Zahl (Im Beispiel also eine Addition). Und 5 FPU-Multiplikationen pro Wert sind (wenn die Zahlen stimmen) schon genug um mit der Speicherpipeline die CPU 100% auszulasten. Das ist wirklich keine ungewöhnlich komplexe Rechnung -> trivial.



  • rapso schrieb:

    vielleicht bei vector dot vector, aber matritzen multiplikationen sind sehr cache freundlich. die benchmarks die gemacht werden bei sowas sind normalerweise viele MB gross, da passt wenig in den L1, allerdings kannst du die operationen so anlegen, dass sie cache freundlich sind. jedes element einer N*N matrix wird N mal mit einer ganzen zeile bzw spalte multipliziert. reuse ist also sehr hoch.

    Das ist mir alles bekannt 🙂 deswegen habe ich ja explizit matrix dot vector gemeint. Da sieht das nämlich optimiert so aus:
    http://download.tuxfamily.org/eigen/btl-results-110323/matrix_vector.pdf

    und da kannst du nichts dran machen, auch wenn der reuse des vektors hoch ist.

    das kannst du leicht ausrechnen, ein core kann 2float operationen durchfuehren, die komplexeste ist FMAC, was also *+ ist und das kann ein intel core auf 8floats dank AVX2. wenn ich mich nicht verrechne, konsumierst du also 32flots ->128byte pro operation, bei 4GHz sind das ca 512GB/s. ein quad channel system von intel auf dem 2011 socket kann da 51.2GB/s schaffen (zufall? :D), du kannst also 5multiplikationen und 5additionen pro speicher transaktion machen. theoretisch.

    hübsch. Danke!


Anmelden zum Antworten