Jestli jste to zkoušel programem napsaným v Pascalu a přeloženým Turbo/Borland Pascalem, tak to mohl být spíš problém překladače. Když jsem si ke své 386 pořídil koprocesor (kvůli programu Mathematica), tak jsem si chtěl hned vyzkoušet, o kolik je to rychlejší, a napsal jsem si jednoduchý prográmek, který kreslil Juliovu množinu a počítal to ve floatech. Při překladu s použitím koprocesoru to sice rychlejší bylo, ale IIRC jen asi třikrát, což u programu, který v podstatě nic jiného než float aritmetiku nedělal, bylo docela zklamání.
Pak jsem se ale podíval na přeložený program a zjistil jsem, že překladač každou aritmetickou operaci provedl tak, že zkopíroval argumenty do FPU, provedl příslušnou FPU instrukci a pak zkopíroval výsledek zpátky. A i v případě, že se ten výsledek hned vzápětí znovu použil (třeba při násobení tří čísel), tak ho stejně znovu nakopíroval zpátky do FPU. Tak jsem zkusil tu vnitřní smyčku přepsat do assembleru tak, aby se hodnoty do FPU posílaly jen jednou, celý výraz se spočítal v FPU a použil se jen finální výsledek. Zrychlení bylo asi tisícinásobné.
Jj, to si pamatuji, investoval jsem do 287 a takhle to vypadalo. Mam ten dojem, ze duvodem bylo zjednoduseni prekladace. Pri sw reseni se do kodu vlozilo volani floating funkce z knihovny, pri pouziti FPU se tam vlozil monoliticky kus kodu bez zavislosti (v FPU - ST reg.) na predchozi/nasledujici fp operaci.
pri pouziti FPU se tam vlozil monoliticky kus kodu bez zavislosti (v FPU - ST reg.) na predchozi/nasledujici fp operaci.
Asi to souvisí i s tím, co se řeší v jiné části této diskuse. Pokud se data mezi CPU a FPU předávala opravdu tak neefektivním způsobem, jak se tam píše, tak se ani nedivím, že jejich neustálé posílání tam a zpátky spotřebovalo víc času než samotný výpočet.
Pokud mne paměť neklame, je rezervovaná konkrétní výjimka, která se vyvolá, pokud procesor narazí na FPU instrukci, ale FPU není k dispozici. Emulátor instaluje obsluhu této výjimky, která se podívá na instrukci, provede její emulaci (v CPU) a vrátí se, načež se pokračuje další instrukcí. Stejně funguje (nebo spíš asi fungovala) emulace FPU v linuxovém jádře.
Tahle SW podpora byla ve Windows od 3.x, takže narozdíl od macOS Classic nebyl problém (Apple programy od určité verze Motoroly počítaly s koprocesorem, např. Excel, a on ho pak vyhodil v laptopech, protože se čip v jedné generaci přehříval).
V DOSu určitě byla podpora třetích stran, ale třeba Pascal si to řešil sám, čímžto to bylo znatelně rychlejší - podporu FPU zjistil jednou a pak modifikoval instrukce v kódu (rychlost, jakoby byl program zkompilován jen se SW podporou).
Pamatuji si, ze na 386 jsem pod dosem (simulace ve SPICE apod.) mel v tech nevyuzitych 3 MB nejaky 900 kB emulator koprocesoru. Z velikosti je zrejme, ze byl zalozen na rozsahlych LUT, a zrychleni oproti klasickym emulatorum bylo v zavislosti na typu operaci az nekolikanasobne (jednociferne). Ono cekat na vypocet hodinu nebo tri hodiny byl stale rozdil.