Vlákno názorů k článku Navrhujeme a vyrábíme vlastní CPU: druhy instrukcí a přerušení od Pavel Píša - Trochu zkouším svojí pozornost Skok na adresu uloženou v...

  • Článek je starý, nové názory již nelze přidávat.
  • 25. 3. 2025 21:04

    Pavel Píša

    Trochu zkouším svojí pozornost

    Skok na adresu uloženou v registru rX lze zapsat jako LD pc, rX, buď nepodmíněnou nebo podmíněnou variantu.

    Zdá se mi, že toto by měla být sekvence pro skok na funkci, jejíž adresa je uvedené v paměti na adrese, na kterou odkazuje rX. Tedy například konečné fáze volání přes VMT tabulku v C++.

    Jednoduchý skok na adresu uvedenou v registru by pak měl být jen MV pc, rX.

    Co se pak týče celočíselného dělení, tak to je celkem zásadní problém a i současná výkonnostní špička vykazuje latence okolo 10 až 12 cyklů na 32-bit dělění. Často přitom tato jednotka zvládá startovat další dělení jen jednou za čtyři cykly a podobně. Intel před lety přišel se schopností počítat dva bity v jednom cyklu a i to byl celkem velký posun vpřed... Takže souhlasím, že celočíselné dělění s garantovaným výsledkem, který se nikdy neliší od dělění s oříznutím na integer dolů je velký problém. Při určité minimální toleranci, která je u plovoucí řádové čárky se aproximace kombinovaná s iterací řeší mnohem lépe.

    Pro zajímavost: Sám pro výpočty v naší motion control jednotce LX_RoCoN potřebuji jak dělění tak sinus a cosinus. Dělění jsem vyřešil jako reciprocal, kdy nějdříve zjistím, kolik je nulových bitů v daném čísle, pak ho posunu, spočítám převrácenou hodnotu čísla v rozsahu jedné poloviny MAX_INT a pak provedu korekci. Port firmware ze staršího řešení s architekturou TUMBL (ořezaný open source Microblaze) na RISC-V běžící jako komutační Park, Clarke PMSM koprocesor vedle ARMu na Zynqu obsahuje danou sekvenci na řádce 532 až 554. Vlastní reciprocal je vyhodnocený na paměťově mapované periferii aproximátoru, který používá tabulku s aproximací polynomy druhého řádu a chyba převrácené hodnoty je někde okolo 2^(-20). Funkce se nachází ve vlastní navržené jednoctce lx-fncapprox pro sin, cos, reciprocal. Přitom tabulky jsou zkombinované do dvou vektorů o šířce 36 bitů, které přesně odpovídají vlastnostem BRAM na použitých FPGA (Xilinx XC6SLX9 na LX_RoCoN a Xynq na MZ_APO). Jednotka pak idexaci do tabulky a výpočet polynomu provádí za tři cykly, proto ty NOPy.

  • 25. 3. 2025 21:35

    Martin Beran

    Jednoduchý skok na adresu uvedenou v registru by pak měl být jen MV pc, rX.

    Máte pravdu, v článku je chyba, měla tam být instrukce MV, nikoliv LD.