Dobrý úvod do problematiky, ale musím říct, že se už těším na další díl, jestli se tam dostaneme k vlastnímu fungování spolupráce CPU a FPU. Zarazil mě tady ten pro mě ne úplně jasný a přesný pojem "pomocí sdílení sběrnice". Našel jsem si jedno PDF, kde popisují 8087 s modelem "sdílení toku instrukcí" což má být asi to, co myslíte, a "model 80387". Mimo jiné obojí potřebuje vlastní typ přerušení, jak jsem očekával. Tak jsem zvědavý na podrobnější popis a následně pak i na popis instrukční sady FPU. Např. jak se v praxi přenášely ty 80bit hodnoty a ne jen ořezané na 64 bitů? A ten přenos do RAM zařizoval CPU nebo mělo FPU svoje DMA?
Sdileni sbernice umoznuje x86 pomoci pinu "#HOLD", kdyz se aktivuje a cpu potvrdi odevzdani, tak je masterem jiny obvod, ktery muze delat pristupy kam jenom chce.
Viz https://www.righto.com/2023/08/intel-8086-bus-hold.html
Spravna odpoved je "FPU melo svoje DMA", data neslo sdilet mezi CPU registry a FPU jinak, nez obloukem skrze RAM.
jeste se k tomu dostanu, ale podrobny popis zapojeni a signallingu je tady https://roboticelectronics.in/8087-interfacing-with-8086/
Mozna zacit az s popisem signalu TEST, tam je sdileni popsano. Ale dostaneme se k tomu
(jaky by mel byt problem s 80 bity? prenesou se normalne 10x bajt nebo 5x slovo, jestli se ptate na toto)
Já jsem našel stručný popis v https://dougx.net/gaming/coproc.html#howtheywork
A tam se mi potvrdily dvě věci, co jsem čekal:
- CPU a FPU musejí mít definovaný vlastní (společný) typ přerušení,
- nestačí sdílet sběrnici, musejí sdílet něco jako instrukční registr (v této terminologii je to BIU ?)
A jestli dobře koukám, tak v tom dokumentu, co odkazujete, se to potvrdilo. Ale přiznávám, že jsem oboje jen proletěl.
Ohledně těch 80 bitů mě jenom zaujalo, že se to muselo načítat po kouskách, na 8087 počítám dokonce jen po 16 bitech, protože ještě neměla 32bitové registry... To muselo být cyklů navíc! Nevyplatilo se jednodušší výpočty dělat v CPU? Na ty praktické záležitosti jsem právě zvědavý: jak se to opravdu používalo.
BIU obecně znamená Bus Interface Unit.
Ano, data se do FPU přenášela normálně po externí sběrnici, takže po 8/16 bitech (tam nezáleží na šířce registrů, omezuje to šířka sběrnice). Rychlé to extra nebylo, ale zase FP operace v SW emulátoru byly mnohem pomalejší. Třeba IDIV mělo 171-190+EA cyklů a IMUL na tom nebyl o moc líp se 134-160+EA cykly. A to při SW FP operacích bylo potřeba mnohem více instrukcí, včetně normalizací, převodů operandů na stejné exponenty atd.
Tak ty stare procesory nebyli vubec pipelinovane - byl to v podstate stavovy automat co si jel to sve dokola, tudiz pak mate tento vykon:
Intel 8086: 0.330 MIPS at 5.000 MHz
Coz znamena prumerne 15 taktu "sbernice" na instrukci.
Ohledne instrukci - k cemu preruseni? To se v pripade FPU pouziva jen k indikaci chyby, a je to drat bokem dokola, do standardniho radice preruseni.
Instrukci registr se nesdili (nic takoveho ani neexistuje). Oba cipy dekoduji sled instrukci - a ty co pro nej urceny nejsou (podle prefixu) jednoduse ignoruji. V podstate by se dalo rict, ze to cele ridi procesor (vcetne treba cteciho cyklu pro IMM argument instrukce), a koprocesor nasloucha.. a kdyz uslysi magicke sluvko (svoji instrukci) tak se probere k nejake cinnosti. V pripade ze potrebuje sbernici, tak si ji prevezme.
"instrukčním registrem" jsem myslel interní registr nepřístupný programátorovi, místo kam se z RAM načte kód instrukce a následně zpracovává - rozhoduje CPU/FPU, převádí na mikrokód apod.
Neznám pořádně architekturu x86, takže neřeknu terminologicky věci správně (proto jsem rád za tento seriál), myslel jsem to obecně jak fungují procesory.