einfache frage zu 64bit
-
Hallo,
ich programmiere seit kurzem an einem Programm, das einen Algorithmus bzw. dessen Koeffizienten sucht. Die Datenmenge liegt bei ca. 40MB, und es müssen ca. 500x die 40MB eingelesen werden, bis ich ein Ergebnis habe. Anhand des Ergebnisses kann ich feststellen, wie der nächste Schritt auszusehen hat. Optimiert habe ich es inzwischen so weit, dass ich versuche, jeweils immer 1/4 der Datenmenge zu berechnen, und dann mit dem nächsten weitermache (um den L3-Cache - 16MB - ausnutzen zu können). Das hat die Geschwindigkeit des Programms etwas erhöht.
Das alles läuft jetzt jedoch im 32-bit-Modus auf einer Win7-64bit-Maschine. HP Z800 mit 2x Xeon X5680 und 24GB RAM. Compiler: neuster gcc über mingw.
Frage: Was sind die Vorteile für die Effizienz, Geschwindigkeit eines Programmes, wenn man einen 64bit-Compiler nutzt? Meine Daten liegen in double vor, d.h. 64-bit-Werte, und mein Verstand sagt, dass ein Prozessor doch nur die halbe Bandbreite nutzen müsste, wenn der Datenbus auf 32bit beschränkt wird. Andererseits klingt diese Behauptung so blöd, dass ich sie selber nicht glaube.
Kurz gesagt: Bedeutet 64bit nur, dass mehr Hauptspeicher ansprechbar ist, oder auch, dass mehr Daten auf einmal gelesen werden können?
Grüßchen,
dommynik
-
Kurze Antwort: Allein durch eine Umstellung auf 64 Bit ergibt sich noch nicht unbedingt eine höhere Effizienz. Technisch gesehen hatte auch der erste Pentium 1993 schon einen 64 Bit Datenbus, aber nur einen 32 Bit Adress Bus. Die primäre Motivation für x64 ist die praktisch unbegrenzte Menge an adressierbarem RAM (halt eben mit einem 64 Bit Bus), die man damit verwalten kann.
Zusätzlich dazu kommen aber natürlich noch weitere Features dazu, im besonderen standardmässig grössere Register (EAX vs. RAX etc.) und entsprechende Intruktionen. In deinem Fall von Bedeutung ist wohl auch, dass die SSE SIMD-Instruktionen zwingend vorhanden sein müssen (bei x86 ist dies nicht unbedingt der Fall) und die Anzahl 128 Bit XMM-Register auf mindestens 16 erhöht wurde. Wenn der Compiler also diese Instruktionen uneingeschränkt nutzen kann, kann sich durchaus ein massiver Vorteil ergeben.
Neuere Prozessoren unterstützen neben SSE auch AVX, wo die Register dann 32 Byte (!) lang sind. Dort kann der Compiler im Ideallfall 4 doubles reinschieben und Operationen parallel anwenden. Mit x64 hat SIMD aber nur bedingt etwas zu tun. Alle CPUs, die das unterstützen, sind seit Jahren 64 Bit CPUs - und alles was neu programmiert wird, kann getrost für x64 implementiert werden, solange nicht ein konkreter Grund für den Kompatibilitätsmodus (= x64/32 Bit Modus) spricht.
-
@/rant/
Danke für die Antwort. Du willst mir also sagen, dass ich durch 64bit-Compiling keine Optimierungen bezüglich der Geschwindigkeit als Ergebnis erhalte. Nächste Frage: Kann ich die 32Byte-Register, die durch AVX neu dazukommen, benutzen, und dadurch schneller werden, oder registriert der Gnu Compiler (neuste Version) dies direkt? Als Flags nutze ich -O3 -ofast -march=native -Walledit: Mist, das kommt davon, wenn man ein Kurzzeitgedächtnis wie ein Sieb hat. 64bit-Compiling bringt also doch was. Frage: Welcher freie Compiler für Windows kann das?
-
Ich würde inzwischen eh auf 64 Bit setzen. Warum auch nicht. Im Prinzip ist es dieselbe Diskussion, die man damals mit den 16 Bit Programmen hatte auf Windows 9x

Visual C++ 2010 bzw. jetzt 2012 mit .NET Framework SDK kann das alles und ist gratis als Express Edition. Dort gibt es auch einen Schalter
/arch:AVX. Aber du musst aufpassen: Unterstützt deine CPU bereits AVX? Geh mal auf ark.intel.com. Ich habe extra auf Sandy Bridge gewartet, da ich raytracen wollte auf dem Notebook
-
@/rant/
AVX wird nicht unterstützt, nur SSE4.2 - schade.
Welche Compiler können 64bit auf Linux/Unix? Ich werde wohl bald umsteigen müssen (die Workstation wird auf RHEL6 umgestellt, kann nichts dagegen tun).
-
dommynik schrieb:
Welche Compiler können 64bit auf Linux/Unix?
Alle für deinen Prozessor relevanten? Unter x86_64-Distributionen erstellt der Standardcompiler schon seit Jahren 64-Bit-Code. AVX können neue Versionen des GCC auch.