Okee, nu ben ik het zat...
Iedere keer weer krijg je dat gezeik over dat de Core2 traag zou zijn in 64-bit modus...
Van die verdwaalde AMD-fans die ergens een klok hebben horen luiden...
Mensen, we zijn hier toch tweakers? We willen hier toch weten hoe de vork in de steel zit? We gaan toch niet domweg mensen napraten zonder te weten waar we het precies over hebben?
Waar hebben we het hier dan over?
Nou, in het kort heeft Intel sinds de Pentium M een techniek die bekend staat als Macro Op Fusion.
Kortom, het samenvoegen van meerdere 'macro ops' tot een enkele operatie.
Zoals jullie waarschijnlijk wel weten, worden sinds de Pentium Pro de x86-instructies niet direct uitgevoerd, maar eerst uitgeplozen en vertaald naar kleinere operaties, omdat er een RISC-achtige execution core gebruikt wordt. De x86-achtige instructies worden macro-ops genoemd, en de RISC-achtige instructies worden micro-ops genoemd.
Nu heeft Intel in de implementatie van de 64-bit mode van de Core2 de macro-op fusion niet toegepast. Hier is dit hardnekkige gerucht zeer waarschijnlijk door ontstaan (overigens beschikt de processor ook over micro-op fusion, en die werkt WEL in 64-bit mode).
Maar wat betekent het nou eigenlijk in de praktijk?
Heel weinig... De macro-op fusion is zeer beperkt. Het werkt alleen op cmp en test-instructies, direct gevolgd door een conditional branch (en nog wat andere beperkingen qua 16-byte alignment, maar 1 fusion per cycle etc). Dus het wordt maar op een klein aantal instructies toegepast.
En als het al toegepast wordt, is de enige winst dat je wat bandbreedte bespaart in je pipeline, omdat je een micro-op minder te verwerken hebt. De verwerkingssnelheid van de instructies op zich wordt niet hoger.
Er wordt dus van een mug een olifant gemaakt.
Afgezien van dit detail heeft de 64-bit mode geen afwijkingen tov de executie in 32-bit mode. Je hebt alleen wel het voordeel van meer en grotere registers etc, die normaal gesproken het gebrek aan macro-op fusion ruimschoots compenseren, waardoor 64-bit toch wel een stuk sneller is dan 32-bit.
In mijn eigen code was dat ook duidelijk te zien:
Mijn voorlopige bevindingen over multicore-processing
Daarnaast wil ik ook nog even opmerken dat AMD een dergelijke techniek al helemaal niet heeft... Dus het is onzin dat het als nadeel van Intel gezien wordt... Het is eerder een voordeel van Intel in 32-bit mode ten opzichte van AMD.
Maar je hoeft mij niet te geloven (sommigen lijken te denken dat ik alleen maar pro-Intel ben ofzo)... Ook Agner Fog, een zeer bekende naam in de wereld van software optimalisaties en microarchitecturen zegt dit:
http://www.agner.org/optimize/microarchitecture.pdf
Iedere keer weer krijg je dat gezeik over dat de Core2 traag zou zijn in 64-bit modus...
Van die verdwaalde AMD-fans die ergens een klok hebben horen luiden...
Mensen, we zijn hier toch tweakers? We willen hier toch weten hoe de vork in de steel zit? We gaan toch niet domweg mensen napraten zonder te weten waar we het precies over hebben?
Waar hebben we het hier dan over?
Nou, in het kort heeft Intel sinds de Pentium M een techniek die bekend staat als Macro Op Fusion.
Kortom, het samenvoegen van meerdere 'macro ops' tot een enkele operatie.
Zoals jullie waarschijnlijk wel weten, worden sinds de Pentium Pro de x86-instructies niet direct uitgevoerd, maar eerst uitgeplozen en vertaald naar kleinere operaties, omdat er een RISC-achtige execution core gebruikt wordt. De x86-achtige instructies worden macro-ops genoemd, en de RISC-achtige instructies worden micro-ops genoemd.
Nu heeft Intel in de implementatie van de 64-bit mode van de Core2 de macro-op fusion niet toegepast. Hier is dit hardnekkige gerucht zeer waarschijnlijk door ontstaan (overigens beschikt de processor ook over micro-op fusion, en die werkt WEL in 64-bit mode).
Maar wat betekent het nou eigenlijk in de praktijk?
Heel weinig... De macro-op fusion is zeer beperkt. Het werkt alleen op cmp en test-instructies, direct gevolgd door een conditional branch (en nog wat andere beperkingen qua 16-byte alignment, maar 1 fusion per cycle etc). Dus het wordt maar op een klein aantal instructies toegepast.
En als het al toegepast wordt, is de enige winst dat je wat bandbreedte bespaart in je pipeline, omdat je een micro-op minder te verwerken hebt. De verwerkingssnelheid van de instructies op zich wordt niet hoger.
Er wordt dus van een mug een olifant gemaakt.
Afgezien van dit detail heeft de 64-bit mode geen afwijkingen tov de executie in 32-bit mode. Je hebt alleen wel het voordeel van meer en grotere registers etc, die normaal gesproken het gebrek aan macro-op fusion ruimschoots compenseren, waardoor 64-bit toch wel een stuk sneller is dan 32-bit.
In mijn eigen code was dat ook duidelijk te zien:
Mijn voorlopige bevindingen over multicore-processing
Daarnaast wil ik ook nog even opmerken dat AMD een dergelijke techniek al helemaal niet heeft... Dus het is onzin dat het als nadeel van Intel gezien wordt... Het is eerder een voordeel van Intel in 32-bit mode ten opzichte van AMD.
Maar je hoeft mij niet te geloven (sommigen lijken te denken dat ik alleen maar pro-Intel ben ofzo)... Ook Agner Fog, een zeer bekende naam in de wereld van software optimalisaties en microarchitecturen zegt dit:
http://www.agner.org/optimize/microarchitecture.pdf
quote: Agner FogThe fact that macro-op fusion doesn't work in 64-bit mode should not make any programmer
refrain from using 64-bit mode. The performance gain due to macro-op fusion is unlikely to
be more than a few percent, and only if uop throughput is a bottleneck. Macro-op fusion has
no effect in the much more likely case that the bottleneck lies elsewhere.