Doping für CPUs — Möglichkeiten der Leistungssteigerung

Artikel-Index:

Ansätze der Optimierung per Software

Ansät­ze, die Leis­tung der Pro­zes­so­ren aufs Volls­te aus­zu­rei­zen, gibt es eini­ge. Deren Effek­ti­vi­tät und Ver­brei­tung steht jedoch auf einem ganz ande­ren Blatt. Auch gibt es Tech­ni­ken, die zwar eine her­vor­ra­gen­de Effek­ti­vi­tät auf­wei­sen kön­nen, jedoch lei­der Ände­run­gen an der Hard­ware vor­aus­set­zen. Somit stel­len die­se Lösun­gen tech­nisch betrach­tet die opti­ma­le Lösung für neue Hard­ware dar. Markt­tech­nisch betrach­tet ist die­se Lösung jedoch alles ande­re als opti­mal, schließ­lich folgt im Rat­ten­schwanz der Kon­se­quen­zen die Inkom­pa­ti­bi­li­tät zum bestehen­den x86 Standard.
Die im fol­gen­den vor­ge­stell­ten Tech­ni­ken sind geord­net, vom unters­ten Level, der Opti­mie­rung ein­zel­ner Instruk­tio­nen und Befeh­le, über Stei­ge­rung des Par­al­le­lis­mus von Instruk­tio­nen und Threads bis hin zu Ände­rung des Befehls­sat­zes um einen mög­lichst hohen TLP mit hohem ILP (sie­he nächs­te Sei­te) bei opti­ma­ler Anpas­sung an die Hard­ware zu errei­chen. Aber der Rei­he nach.

Opti­mie­rung der Com­pi­ler auf bestimm­te Befehls­sät­ze / Generationen
Auf der unters­ten Ebe­ne steht die Opti­mie­rung ein­zel­ner Instruk­tio­nen an bestehen­de Hardware/Befehlssätze. Frü­her, als Assem­bler noch Stan­dard­spra­che für jeden Pro­gram­mie­rer war, stell­te Pro­gram­mie­ren noch ech­te “Fie­sel­ar­beit” dar. Regis­ter woll­ten ein­zeln belegt, addiert oder gelöscht wer­den, Spei­cher sepa­rat zuge­wie­sen, etc. Der Spruch “Was man nicht mit Assem­bler pro­gram­mie­ren kann, muss man halt löten” besitzt erstaun­lich hohen Rea­li­täts­be­zug, jeder Assem­bler-Pro­gram­mie­rer wird sich lächelnd erinnern.
Mit dem Erfolg der sog. hohen Pro­gram­mier­spra­chen, änder­te sich die­ser Zustand jedoch schlag­ar­tig. Plötz­lich war der Pro­gram­mie­rer nicht mehr Herr über den im End­ef­fekt von ihm pro­du­zier­ten Maschi­nen­code, son­dern muss­te die­se Kon­trol­le dem Com­pi­ler über­tra­gen (to com­pi­le = über­set­zen, kom­pi­lie­ren; Com­pi­ler über­set­zen die Befeh­le höhe­rer Pro­gram­mier­spra­chen in für den Pro­zes­sor ver­ständ­li­chen Maschi­nen­code). Die Pro­gram­mie­rer sel­ber haben hier­bei kei­ner­lei Ein­fluß auf die tat­säch­li­che Lauf­zeit der eige­nen Pro­gram­me und müs­sen sich auf den Com­pi­ler verlassen.
Da der Mensch jedoch nicht per­fekt ist und Pro­zes­so­ren sich bestän­dig wei­ter­ent­wi­ckeln, erzeu­gen Com­pi­ler sel­ten per­fek­ten Maschi­nen­code und altern zudem rela­tiv schnell. Den­noch darf man die Rol­le der Com­pi­ler auf kei­nen Fall unter­schät­zen, denn hier liegt das größ­te, per Soft­ware erreich­ba­re Opti­mie­rungs­po­ten­zi­al wel­ches die zwin­gend erfor­der­li­che x86-Kom­pa­ti­bi­li­tät wahrt.

Com­pi­ler arbei­ten auf eine bestimm­te Art und Wei­se: Jeder noch so kom­ple­xe Befehl, jede noch so gro­ße, lan­ge oder ver­schach­tel­te Schlei­fe einer hohen Pro­gram­mier­spra­che, kann in ein­zel­ne, sog. Ele­men­tar­be­feh­le zer­legt wer­den und somit letzt­end­lich in Maschi­nen­be­feh­le. Unter­schied­li­che Pro­zes­sor­ge­ne­ra­tio­nen ver­ar­bei­ten jedoch ein und den­sel­ben Maschi­nen­be­fehl unter Umstän­den auf kom­plett unter­schied­li­che Art und Wei­se mit signi­fi­kant unter­schied­li­cher Lauf­zeit. Somit muss ein guter Com­pi­ler mög­lichst vie­le ver­schie­de­ne Arten der Opti­mie­rung beherr­schen, je nach Gene­ra­ti­on des zu ver­wen­den­den Ziel-Pro­zes­sors. So benö­tigt die i686 Archi­tek­tur bei­spiels­wei­se eine kom­plett ande­re Rei­hen­fol­ge und Anord­nung der Befeh­le an den Deco­der als die i786 Archi­tek­tur und noch anders gar die K7 Architektur.
Letzt­end­lich liegt hier das größ­te Poten­zi­al, auf­grund der Inkon­sis­tenz der Pro­zes­so­ren und ihres Befehls­sat­zes jedoch auch das größ­te Kon­flikt­po­ten­zi­al. Schließ­lich läuft Soft­ware, die spe­zi­ell für neue­re Pro­zes­so­ren opti­miert wur­de (Bei­spiels­wei­se durch Nut­zung der SSE/SSE2 Ein­hei­ten oder zusätz­li­cher CISC/RISC Befeh­le) nicht immer auch auf älte­ren Pro­zes­so­ren. Im Markt der ewig kom­pa­ti­blen x86-Pro­zes­so­ren ist so etwas für vie­le Fir­men nicht ver­tret­bar, wes­halb sich pro­prie­tä­re Befehls­er­wei­te­run­gen auf lan­ge Sicht nicht durch­set­zen konn­ten. Drei bekann­te Bei­spie­le sind MMX, 3DNow! und SSE.