Hirdetés

Új hozzászólás Aktív témák

  • P.H.

    senior tag

    válasz dezz #1321 üzenetére

    ''#1320: Hát, ebből most nem igazán tudom kibogózni, hogy a válasz igen vagy nem. Vagy néha igen, néha nem?''

    Szó szerint, ahogy mondod, néha igen, néha nem. Az Optimization Manual-ok elég szűkszavúan írnak erről, érthetően: az Intel csak az OP reg,reg formájú utasítások időzítéseit teszi közzé, majd hozzáteszi, hogy az OP reg,mem formában az integer esetben +2, FPU-esetben +6 órajellel növekszik; AMD kiírja ugyan részletesen az OP reg,mem és az OP mem,reg formát is, de ő is megjegyzi, hogy az +2 órajelben különbözik a OP reg,reg formáétól. De mindkét esetben ők is egy ideális környezetet feltételeznek, a többivel nem foglalkoznak, mert nem is nagyon lehet. Mi is ez az ideális eset AMD esetében, egy load micro-opnál:
    Amikor az ütemező egy címszámítási micro-opot elindít az egyik AGU-ban, akkor egyszerre ezzel elküldi azt a LSU-ba is, egész pontosan az LS1-be. Az AGU 1 (illetve összetett cím esetén 2) órajel alatt kiszámolja a virtuális/effektív címet (utóbbi az effektív cím+szegmens bázis összeg), majd abban az esetben, ha az LS1 üres, akkor közvetlenül a L1 D-Cache-nek továbbítja ezt a virtuálius címet. Azonban az L1 D-Cache tartalmának indexeléséhez szükség van a virtuális mellett a fizikai címre is, ennek meghatározásában segít a kétszintű Translation Lookaside Buffer, az első, gyorsabb hozzáférésű szint az utolsó 40 virtuáliscímhez tartozó fizikai címet tartalmazza. (Itt azt hozzá kell venni, hogy a legszűkebb pipeline+LSU egységen kívül az egész rendszerben, tehát már a TLB-kben és a cache-ekben a memóriahozzáférés adategysége a 64 byte-os határra illesztett 64 összefüggő byte). Ha L1 TLB-ben megtalálja a szükséges fizikai címet, akkor ezzel a két értékkel ''megnyitja'' az L1 D-Cache megfelelő két (2-way set-associative) vonalát és összehasonlításra kerül a két cím az ott lévőkkel; itt derül ki, hogy a keresett adatot tartalmazza-e az L1 D-Cache (hit/miss). Találat esetén ez a megnyitás azt is jelenti, hogy a következő órajelben a kért adatot a cache közvetlenül az pipeline-ba, a megfelelő result-busra juttatja, az LS1-beli bejegyzés pedig törlődik.
    A load-ok D-Cache-hez való hozzáféréssel párhuzamosan ellenőrzik az LS1 és LS2 tartalmát, hogy van-e olyan függőben levő megfelelő méretű tárolás(i szándék) a kért címre. Ha van, akkor a cache hit/miss eredménytől függetlenül továbbítják az adatot a result-busra (ha az még nem ismert, csak a cím, akkor egy függőségi bejegyzést jelölnek be, hogy az adat megérkezésekor azonnal továbbíthassák). Ez a Store(-to-Load) Forwading.
    A normál store és load-store eset annyiban különbözik, hogy az LS1 bejegyzés nem törlődik, hanem átkerül az LS2-be, és ott várja meg a címhez tartozó tárolandó adatot. A cache-probe ugyanúgy megtörténik, a tényleges írás viszont nem, majd csak a retirement során, programsorrendben. A Non-Temporal Store-ok ezt az egész hierarchiát kikerülik, közvetlenül néhány 64 byte-os buffer-be írják adatukat, az AGU-k közvetlenül ezen buffer-controller-be továbbítják a címet, és az egységek az adatot (illetve a pipeline ezenkívül közvetlenül kommunikál vele, mert meghatározott szabályai vannak annak, hogy bizonyos adott körülmények között le kell zárni ezeket a buffer-eket, és tartalmukat ki kell írni a rendszermemóriába).

    Ez az ideális eset, ebben az esetben az AGU-k közvetlenül LSU-hoz (Store Forwarding céljából), a L1 TLB-khez + L1 D-Cache-hez szólnak, közvetlenül továbbítják az adatot a result-busra, tehát így a pipeline meghosszabbításának tekinthető (mint korábban, a K7-es leírásban jelen is vannak, mint stage-ek). A legfontosabb nem ideális esetek:
    - az LS1 nem üres: három AGU órajelenként akár három címet számíthat ki, viszont az L1 D-Cache csak két porttal rendelkezik. Ezután az LS1 mindig a ''legöregebb'' két hozzáférést továbbítja az L1 D-Cache felé, a többit átmenetileg tárolja.
    - a keresett cím nem található meg a 40 elemű L1 TLB-ben. Ekkor a lassabb, de 512 elemű L2 TLB-hez kell fordulni, ha ott találat van, akkor adatcsere szükséges a két TLB-szint között. Ha a L2 TLB-ben sincs meg, akkor kezdődik a lényegesen hosszabb négyszintű virtuális->fizikai cím fordítás (table-walking, esetlegesen rendszermemória-hozzáférés lehet szükséges már ehhez is).
    - ha a Store Forwarding nem jár sikerrel, valamint az L1 D-Cache-ben sincs meg a keresett vonal, akkor memory hierarchy mélyebb szintjeihez kell fordulni, ez L2 probe, adatcsere az L1-L2 között, esetleges rendszermemória-hozzáférés, legrosszabb esetben egy page miss, tehát a lapozófile-hoz kell fordulni.
    Utóbbi két esetben, illetve store-ok esetében kerül a bejegyzés át LS1-ból LS2-be.

    Ha ez még nem lenne elég, tovább bonyolítja a helyzetet, hogy az összes exclusive cache-nek értesülnie kell minden kell minden cache-hozzáféréshez systemwide, és megfelelően kezelnie kell a helyzetet (összes exclusive cache: ez magonként 3 AMD esetében, legutóbbi Intel-ek esetében natív 2-magonként 1-et vagy hármat? De úgy tudom, az I-Cache-ek sem exclusive-ek, mint ahogy a L1 D-Cache-ek sem), a MOESI protocol szerinti jelöléseket fenn kell tartani, self-modifying code-okat kezelni kell, illetve adott esetben továbbítani kell a kért adatvonalat egy másik cache-be. Mivel egy adott cache csak bizonyos számú hozzáférést tud kezelni egyszerre, ezért emiatt is esetlegesen várnia kell egy request-nek. Non-Temporal Store esetben semmi nem tartja fenn ezt a rendszerszintű koherenciát, ez kizárólag a programozó felelőssége.

    A fentiek valamelyikének felmerülésekor (tehát az ideális eset kivételével) a memóriahozzáférések nem tekinthetőek a pipeline részének, programozói szempontból csak annyi látszik, hogy
    - load esetben a cím kiszámolásra került az AGU által, eddig kezelhető/optimalizálható a kód, ezután várunk a kért adatra. Az adatok megfelelő elrendezése nagymértékben csökkentheti ezt a bizonytalanságot.
    - store esetben a címet az AGU, az adatot valamely egység adta, innen a művelet befejezettnek tekinthető.
    Tehát, hogy politikailag korrektek legyünk, minden memóriahozzáférést valamely AGU kezdeményezi (a cím kiszámításával), vele párhuzamosan az LSU felkészül, és nem ideális körülmények között vagy tárolás esetén átveszi.

    ''ps. előnyösebb lenne nem keverni egy válaszban jelzés nélkül mások szövegeit a címzettével.''
    Egy hsz-t néztem, és válaszoltam az ottaniakra, függetlenül, hogy idézet vagy válasz volt. :)


    [Szerkesztve]

    Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙

Új hozzászólás Aktív témák