Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

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.

courses/b35apo/homeworks/bonus/start.txt · Last modified: 2023/06/12 14:47 by pisa