"1. Mint az általad linkelt doksiból kiderül, csak a simple instruction ALU-ból van kettõ, a lassabb complex instruction ALU-ból csak egy van."
Az esetek 90%-ban egyszerû aritmetikai mûveletek történnek (rotálás, shiftelés, add, adc, stb.), de nem is ezért írtam, csak példának hogy igenis duplikálva van.
"2. A K7-K8-ban is több ALU van, függetlenül attól, hogy nem HT/SMT-s. Ettõl van, hogy több (integer) utasítást tud végrehajtani egy órajelciklus alatt (még többet, mint a P4)."
Megint kevered.
Megpróbálom röviden:
- A modernebb CPUkban a magas órajel és a komplex utasítások miatt (több órajel egy utasítás) pipelineokat vezettek be, ezeken ülnek a végrehajtási egységek.
- Intelnél hosszú pipelineok vannak, AMDnél rövidek (P3 is rövid volt)
- Minél hosszabb a pipe, annál költségesebb egy ugrás (ki kell dobni az összes elõkészített adatot a pipeline-ból).
- Viszont a hosszú pipeline elõnye, hogy ha jó predikciós egységed van, össze tudod válogatni úgy a következõ n darab utasítást, hogy viszonylag jól ki legyen használva mindegyik funkcionális egység. Minnél hosszabb a line, annál nagyobb az n.
Namost eddig a pontig a HT nélküli P4 és az A64 azonosak, egy szálat futtatnak. Nyilván, minnél jobban van duplikálva az összes belsõ egység, annál több utasítást tudnak futtatni.
Ámde! Sokszor van olyan, hogy van egymás után sok olyan utasítás, melyek ugyanazokat a belsõ részeket használják. Ilyenkor rengeteg rész üzemen kívül van (ezt használja ki az M, ezeket lekapcsolja), de van egy másik mód: duplikáljuk meg a címregisztert, illetve lássuk el az összes belsõ egységet egy bittel, ami jelzi hogy az adott részegység mely szálat futtat. Így, ha olyan a kód, lehetõség van két független szál futtatására: az egyes szálak ugyanazt a pipeline-t használják, ám (szerencsés esetben) más más belsõ részeket vesznek igénybe. Tehát ha ilyen kódod van végtelen ciklusban:
cyc1:
add eax, ebx
mul ecx
jmp cyc2
akkor látható hogy a 2. utasítás az elsõ eredményére vár, viszont más ALU-t használ.
Namost ha van két ilyen szálad és HT futtatod õket, akkor az egyik szál az 1. utasítást hajtja végre, a második a 2. at (egyszerre), és utána fordítva.
Belátható hogy ebben az esetben a teljesítménynovekedés 100%, hiszen a kódot amúgy nem lehetne párhuzamosítani semmilyen módon az egymásra utaltság miatt.
Remélem sikerült értelmesen leírnom.
A lényeg tehát az, hogy a HT lényegében minimális új egység hozzáadásával segíthet a nem használt pipeline egységek kihasználásában.
Ja, még annyi hogy a plusz SSE2 (vagy persze 3, ami +13 új utasítás) alig valamennyi helyet fogkal a DIE-on, mert nincs hozzá se cache, se predikció, se mikrokód (illetve elenyészõ).