Stand: 10.05.2001


In meinem Praktikum arbeite ich nun schon seit ein paar Monaten an einem Pentium 4 (1.4 GHz). Meine Erfahrungen: -Ohne Ausnutzung seiner speziellen Befehle und Einheiten ist er langsamer als ein PentiumIII (aber ich denke das weiß eh schon jeder!)

-MMX ist sehr kritisch! Da die MMX-Register auf die Floating-Point-Register gemappt (verwendung der selben) werden, können diese logischerweise nicht gleichzeitig benutzt werden. Ebenso müssen die Inhalte der FPR vor der Verwendung von MMX gesichert werden. Dies dauert eine Weile, und kann bei häufigem Wechsel zwischen diesen beiden Betriebsarten die Zeitersparnis auffressen, und das Programm sogar verlangsamen! Deshalb verwende ich nur die XMM-Register (SSE, SSE2). Diese sind auch doppelt so lang (128 Bit) und unabhängig.

-Vorsicht bei der Programmierung des Prozessors unter Assembler: Bei der Verwendung des Compilers “gas” unter Linux können Probleme auftreten, da dieser Compiler selbst noch in der Entwicklung steckt. Zum Beispiel sind die Parameter der Befehle CVTPS2PD und CVTPS2DP vertauscht (im Vergleich zur INTEL Dokumentation). Durch vertauschen der Eintragungen in der Befehlsindexdatei des Compilers und Neucompelierung des selben lässt sich dieser Bug beheben. Schwieriger ist da schon der Bug bei dem Befehl “pextrw”. Ich habe es bis jetzt noch nicht geschafft, diesen zur Zusammenarbeit zu bewegen. Er verhält sich wie ein NOP-Befehl. Alle Register sind nach Aufruf unverändert! Wer eine Lösung weis kann sie mir ja mailen. Mit etwas Überlegung kann man diesen Befehl aber auch umgehen.

-Verwendung des NASM: Leider versteht dieser nur die Befehle bis zum PentiumIII (SSE, kein SSE2!), was schade ist, da dieser Compiler mit INTEL-schreibweise arbeitet.

-Verwendung des “gas”: Versteht die Befehle des Pentium4 (jedoch mit Vorsicht zu genießen), verwendet aber die AT&T-Schreibweise, die sehr gewöhnungsbedürftig ist (wenn man Intel gewohnt ist).

-Inlineassembler in C++: Hab’s versucht, hat funktioniert. Aber schneller wars nicht! Im Gegenteil. Entweder es bringt nicht sehr viel, oder ich hab’s nicht richtig kapiert. Lösungen und Vorschläge sind immer willkommen.

-Mischen von C++ und Assembler ist nicht sehr sinvoll. Wenn, dann sollte möglichst viel um die XMM-Befehle des Pentium4 herum in Assembler geschrieben werden, da jeder Wechsel von heftigem Sichern und zurückspeichern der Register begleitet wird. (Nach meiner Erfahrung nötig, da nicht sicher ist welche Register der Compiler verwendet. Gerade wenn die Optimierung (Parameter -O beim gcc) benutzt wird, ist dies unerlässlich!)