Table of Contents

Bonusové úlohy pro simulátor

Úlohy se odevzdávají uložením navrženého kódu do osobního GitLab repozitáře pro předmět APO, viz dokumentace použití osobního GITu.

Bubble-sort a případně další odevzdávané práce v assembleru

Pro zvládnutí předávání a hodnocení většího objemu prací hledáme způsob, jak maximálně jak pro studenty tak pro cvičící interakci zautomatizovat. V případě kontroly a zpětné vazby k implementaci algoritmu bubble-sort budeme předpokládat, že se implementace nachází v souboru work/bubble-sort/bubble-sort.S vašeho repozitáře. Implementace musí direktivou .globl exportovat symboly array_size a array_start, přitom za symbolem array_start nesmí být v následujících 200 bytech žádná data nebo kód, jejichž přepsání by mělo negativní vliv na běh programu. Testovací program nahraje od adresy array_start testovací sadu dat, do slova na adrese array_size vyplní počet prvků, program je spuštěný a po zastavení na instrukci ebreak dojde k vyzvednutí dat z adresy array_start. V repozitáři stud-support je připravená šablona projektu (seminaries/qtrvsim/buble-sort) a v tomto adresáři šablona work/bubble-sort/bubble-sort.S vlastní implementace. Soubor a případně i ostatní soubory zkopírujte pod správným jménem do adresáře work/bubble-sort vašeho repozitáře. Veškerý vývoj lze provést s využitím interního assembleru. Pokud chcete provádět testování tak, jak jsme schopní ho zautomatizovat, tak je potřeba externí riscv32-unknown-elf compiler. S interním se zatím neumíme při nahrávání odkázat na správné adresy. Při zápisu adres absolutními hodnotami lze testovat i vnitřním assemblerem

qtrvsim_cli --dump-cycles --asm bubble-sort.S --load-range 0x12340,array_size.in --load-range 0x12344,array_data.in --dump-range 0x12344,60,array_data.out
Automatický systém zjišťuje každé 2 minuty ze kterých repozitářů přišla informace o změně kódu. Pro ty pak provede testy a zapíše výsledky do souboru pojmenovaného podle přihlašovacího jména do adresáře http://pisa-virt.felk.cvut.cz/apo/bubble-sort-ci/.

Optimalizace kódu a návrhu cache

Testovací systém předpokládá, že se v souboru work/apo-sort/apo-sort.S vašeho repozitáře nachází třídící algoritmus. Implementace musí direktivou .globl exportovat symboly array_size a array_start, přitom za symbolem array_start nesmí být v následujících 200 bytech žádná data nebo kód, jejichž přepsání by mělo negativní vliv na běh programu. Testovací program nahraje od adresy array_start testovací sadu dat, do slova na adrese array_size vyplní počet prvků, program je spuštěný a po zastavení na instrukci ebreak dojde k vyzvednutí dat z adresy array_start. V repozitáři stud-support je připravená šablona projektu (seminaries/qtrvsim/apo-sort) a v tomto adresáři šablona work/ao-sort/apo-sort.S vlastní implementace. Soubor a případně i ostatní soubory zkopírujte pod správným jménem do adresáře work/apo-sort vašeho repozitáře. Veškerý vývoj lze provést s využitím interního assembleru. Při testování je procesor natavený na volbu No pipeline no cache.

Parametry paměti cache se nastavují v souboru work/apo-sort/d-cache-template.par ve formátu

policy,sets,words_in_block,ways,write_method
například
lru,1,1,1,wb
Maximální povolená velikost vyrovnávací paměti je 16 32-bitových slov. Nahrávaná testovací sada obsahuje mezi 24 a 32 slovy. Latence prvního přístupu do hlavní paměti je nastavena na 10 cyklů, při sekvenčním přístupu je nastavená hodnota burst na 2 (ve vlastním výpočtu jsem nalezl drobnou chybu v korekci času přístupů při použití burst, můžete jí zkusit popsat, první dostane bod).

Pokud chcete provádět testování tak, jak jsme schopní ho zautomatizovat, tak je potřeba externí riscv32-unknown-elf compiler. S interním se zatím neumíme při nahrávání odkázat na správné adresy. Při zápisu adres absolutními hodnotami lze testovat i vnitřním assemblerem

qtrvsim_cli --dump-cycles --dump-cache-stats --d-cache lru,1,2,2,wb --read-time 10 --write-time 10 --burst-time 2 --asm apo-sort.S --load-range 0x12340,array_size.in --load-range 0x12344,array_data.in --dump-range 0x12344,60,array_data.out

Automatický systém zjišťuje každé 2 minuty ze kterých repozitářů přišla informace o změně kódu. Pozor, testuje se větev master. Větev main tento běh již do testů přidávat nebudu. Pokud byl repozitář změněný, provede se test a ten zapíše výsledky do souboru pojmenovaného podle přihlašovacího jména do adresáře http://pisa-virt.felk.cvut.cz/apo/apo-sort-ci/.

Vyřešení/eliminace datových hazardů přizpůsobením/optimalizací kódu pro nestandardní RISC-V CPU

Implementovat Fibonacciho posloupnost pro CPU bez hazard unit (fibo-hazards). Kód se odevzdává zasláním do osobního GITu. Aktuální seznam (informace o chybách v individuálním logu v adresáři).

Hexadecimální výpis na sériový port

Zadání úlohy naleznete v šabloně print-hex-to-uart. Výsledky hodnocení http://pisa-virt.felk.cvut.cz/apo/print-hex-to-uart-ci/. Vstupem je náhodné číslo, úlohu lze řešit i tak v konstantním čase a optimalizovat na rychlost, ale nemá to příliš význam.

Implementace jednoduchého "kalkulátoru" v jazyce C

Cílem úkolu je implementovat jednoduchou “kalkulačku” v jazyce C. Šablonu najdete na seminaries/qtrvsimuart-calc-add/uart-calc-add-template.c . Výsledky hodnocení naleznete v souboru rank.txt v adresáři http://pisa-virt.felk.cvut.cz/apo/uart-calc-add-ci/. Přechod do prostředí jazyka C odpovídá přechodu na vyšší úroveň přístupu k periferiím z programu běžícího na výukovém kitu MZ_APO (téma semestrální práce).

Spuštění C programu pro přímý běh na CPU vyžaduje i pro QtRvSim alespoň minimální sekvenci pro nastavení globálního ukazatele a zásobníku, viz soubor crt0local.S ve složce šablony. Poskytnutý Makefile sestaví program a otestuje ho. Potřebujete kompilátor C pro architekturu RISC-V a běh bez operačního systému. Testovat můžete v laboratoři i na serveru Postel.