====== Bonusové úlohy pro simulátor ====== [[..:..:en:homeworks:bonus:start|The link to English version of the bonus task description]]. Ú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í [[..:..:documentation:githowto:start|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 [[https://en.wikipedia.org/wiki/Bubble_sort|bubble-sort]], který řadí čísla od nejmenšího po největší, budeme předpokládat, že se implementace nachází v souboru ''work/bubble-sort/bubble-sort.S'' vašeho repozitáře ve větvi ''master'' nebo ''main''. 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 [[https://gitlab.fel.cvut.cz/b35apo/stud-support|stud-support]] je připravená šablona projektu ([[https://gitlab.fel.cvut.cz/b35apo/stud-support/-/tree/master/seminaries%2Fqtrvsim%2Fbuble-sort|seminaries/qtrvsim/buble-sort]]) a v tomto adresáři šablona ''[[https://gitlab.fel.cvut.cz/b35apo/stud-support/-/blob/master/seminaries/qtrvsim/buble-sort/bubble-sort-template.S|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/|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 (můžete použít bubble sort z předchozí úlohy nebo jakýkoliv jiný třídicí 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 [[https://gitlab.fel.cvut.cz/b35apo/stud-support|stud-support]] je připravená šablona projektu ([[https://gitlab.fel.cvut.cz/b35apo/stud-support/-/tree/master/seminaries%2Fqtrvsim%2Fapo-sort|seminaries/qtrvsim/apo-sort]]) a v tomto adresáři šablona ''[[https://gitlab.fel.cvut.cz/b35apo/stud-support/-/blob/master/seminaries/qtrvsim/apo-sort/apo-sort-template.S|work/apo-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 ''[[https://gitlab.fel.cvut.cz/b35apo/stud-support/-/blob/master/seminaries/qtrvsim/apo-sort/d-cache-template.par|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 [[https://cw.felk.cvut.cz/forum/thread-4747.html|popsat]], první dostane bod). Maximální počet povolených cyklů je 5000. 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 Pro spuštění příkazu z Windows je potřeba přidat do systémové proměnné PATH cestu k qtrvsim_cli.exe souboru. Automatický systém zjišťuje každé 2 minuty ze kterých repozitářů přišla informace o změně kódu. Pozor, testují se pouze větve **master** a **main**. 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/|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 ([[https://gitlab.fel.cvut.cz/b35apo/stud-support/-/blob/master/seminaries/qtrvsim/fibo-hazards/fibo-hazards-template.S|fibo-hazards]]). Kód se odevzdává zasláním do [[..:..:documentation:githowto:start|osobního GITu]]. Testovací systém předpokládá, že soubor je nahraný v cestě ''work/fibo-hazards/fibo-hazards.S'' vašeho repozitáře ve větvi ''master'' nebo ''main''. Aktuální [[http://pisa-virt.felk.cvut.cz/apo/fibo-hazards-ci/rank.txt|seznam]] (informace o chybách v individuálním logu v [[http://pisa-virt.felk.cvut.cz/apo/fibo-hazards-ci/|adresáři]]). ===== Hexadecimální výpis na sériový port ===== Zadání úlohy naleznete v šabloně [[https://gitlab.fel.cvut.cz/b35apo/stud-support/-/blob/master/seminaries/qtrvsim/print-hex-to-uart/print-hex-to-uart-template.S|print-hex-to-uart]]. Výsledky hodnocení [[http://pisa-virt.felk.cvut.cz/apo/print-hex-to-uart-ci/|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 [[https://gitlab.fel.cvut.cz/b35apo/stud-support/-/blob/master/seminaries/qtrvsim/uart-calc-add/uart-calc-add-template.c|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/|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.