2 Inhoudsopgave Optimalisatie van de mmips pc Sander Stuijk Veel gestelde vragen Hoe moet ik forwarding implementeren? Hoe moet ik clipping implementeren? Waarom is mijn simulatie zo traag? Hoe kan ik mijn mmips testen? Waarom stopt mijn mmips simulatie niet? Wat is de maximale frequentie van mijn mmips? Waarom werkt ImProc.exe niet? Waarom is het plaatje dat uit de mmips komt zo donker? Opdracht Belangrijke data Vragen Department of Electrical Engineering Electronic Systems 3 Design flow 4 implementation sw LCC C Compiler Application (C sources) LCC C Compiler Celoxica create memory add1 1 if_instr if_pc 7 imm2word shiftleft 2 add2 shiftleft_ jmp decoder_nb Forwarding optie 1 5 branch_ memdev signextend byte hw hardware simulator Visual C++ mmips (C++ sources that use SystemC library) CoCentric SystemC Compiler Xilinx XST Celoxica transfer Xilinx ISE hazard decoder hazard_ 4 8 6 3 1
pc 5 add1 1 if_instr if_pc 7 imm2word shiftleft 2 add2 shiftleft_ jmp 5 branch_ memdev decoder_nb Forwarding optie 2 6 Forwarding - aandachtspunten signextend byte Register 0 heeft altijd de waarde 0, ongeacht wat er in dit register wordt geschreven Forward dus nooit register 0 Forward altijd de nieuwste data EX gaat voor MEM, MEM gaat voor WB, WB gaat voor ID decoder 4 8 6 3 De twee register inputs kunnen uit dezelfde of verschillende pipeline stages komen De twee forwarding multiplexers moeten los worden aangestuurd hazard_ hazard De lees operaties (lw, lb) hebben 1 delay slot, de data uit het geheugen is pas beschikbaar is in de WB stage Er kan een data hazard zijn tussen een load instructie in the MEM stage en een instructie in de ID stage, deze kan niet worden opgelost met forwarding 7 Forwarding WB stage 8 Registerfile en de write-back stage Hazard detectie in WB stage else if (memwbregwrite_t == 1 && ((memwbwriteregister_t == ifidreadregister1_t) (memwbwriteregister_t == ifidreadregister2_t))) hazard = 1; Forwading vanuit WB stage if (memwbregwrite_t == 1 && memwbwriteregister_t == ifidreadregister1_t && memwbwriteregister_t!= 0) forwarda.write(3); if (memwbregwrite_t == 1 && memwbwriteregister_t == ifidreadregister2_t && memwbwriteregister_t!= 0) forwardb.write(3); H&P mmips Input Input Write Write Output Output Write REG Read REG De data is beschikbaar op de output van de registerfile in de huidige cycle De data is beschikbaar op de output van de registerfile in de volgende cycle 2
9 Hoe moet ik clipping implementeren? 10 Voeg een custom patroon aan de C code toe void main(void) int a, b, result; char *buf_i = (char*)0x600000, *buf_o = (char*)0x665400; for (a = 1; a < HEIGHT - 1; a++) for (b = 1; b < WIDTH - 1; b++) result=(( 5*(int)buf_i[(a - 1) * WIDTH + b - 1] + -3*(int)buf_i[(a - 1) * WIDTH + b ] + 6*(int)buf_i[(a - 1) * WIDTH + b + 1] + -7*(int)buf_i[ a * WIDTH + b - 1] + 11*(int)buf_i[ a * WIDTH + b ] + -7*(int)buf_i[ a * WIDTH + b + 1] + 6*(int)buf_i[(a + 1) * WIDTH + b - 1] + -3*(int)buf_i[(a + 1) * WIDTH + b ] + 5*(int)buf_i[(a + 1) * WIDTH + b + 1] + 128) / 13); /* Clipping */ if(result<0) buf_o[a * WIDTH + b] = 0; else if (result > 255) buf_o[a * WIDTH + b] = (char)255; else buf_o[a * WIDTH + b] = result; #define clip(a,b) ((a) - ((b) + *(int *) 0x12344321)) void main(void) int a, b, result; char *buf_i = (char*)0x600000, *buf_o = (char*)0x665400; for (a = 1; a < HEIGHT - 1; a++) for (b = 1; b < WIDTH - 1; b++) result=(( 5*(int)buf_i[(a - 1) * WIDTH + b - 1] + -3*(int)buf_i[(a - 1) * WIDTH + b ] + 6*(int)buf_i[(a - 1) * WIDTH + b + 1] + -7*(int)buf_i[ a * WIDTH + b - 1] + 11*(int)buf_i[ a * WIDTH + b ] + -7*(int)buf_i[ a * WIDTH + b + 1] + 6*(int)buf_i[(a + 1) * WIDTH + b - 1] + -3*(int)buf_i[(a + 1) * WIDTH + b ] + 5*(int)buf_i[(a + 1) * WIDTH + b + 1] + 128) / 13); /* Clipping */ result = clip(result,result); buf_o[a * WIDTH + b] = result; 11 Voeg clipping aan de LCC compiler toe 12 Compileer de LCC compiler Open het bestand lcc/src/minimips.md in een text editor Wijzig de custom operatie Open een cygwin shell en voer de volgende commando s uit: 1) cd /cygdrive/d/mmips/lcc 2) make clean 3) make opcode = 0 function code = 0x31 3
pc Voeg de clipping functionaliteit toe aan de mmips add1 1 if_instr if_pc decoder 4 imm2word 7 shiftleft 2 add2 shiftleft_ jmp 5 branch_ hazard_ 13 14 Controleer dat clipping gebruikt wordt decoder_nb 8 6 memdev signextend byte 3 Open een cygwin shell en voer de volgende commando s uit: 1) lcc image.c o mips_mem.bin 2) disas mips_mem.bin less Zoek een assembler instructie met opcode 0 and function code 0x31 hazard 15 Waarom is mijn simulatie zo traag? 16 Hoe kan ik mijn mmips testen? Controleer met disas hoeveel instructies er uitgevoerd moeten worden om 1 pixel te bewerken en vermenigvuldig dit met het aantal pixels in het plaatje Met behulp van deze procedure kun je mogelijke optimalisaties vinden Maak een klein test programma om de nieuwe functionaliteit te testen Maak een VCD bestand met behulp van een similatie Vergelijk de VCD trace met de assembler code Begin aan het begin van het programma Gebeurt er precies dat wat jij verwacht? 4
17 Waarom stopt mijn mmips simulatie niet? 18 Wat is de maximale frequentie van mijn mmips? Gebruik <>+<c> om een simulatie te stoppen Het VCD bestand bevat alle signalen tot het moment dat de simulatie wordt gestopt Bekijk de signalen in het VCD bestand om je probleem te vinden Veel voorkomende problemen Een combinatorische lus in de mmips Een fout in de forwarding Het synthese rapport wordt opgeslagen in het bestand mmips.srp maximale frequentie kritiek pad 19 Waarom werkt ImProc.exe niet? 20 Waarom is het plaatje zo donker? De combinatie van MS Vista en Cygwin geeft soms problemen met de file permissions Voer de volgende stappen uit als je een permission denied foutmelding krijgt op ImProc.exe of imgproc.exe 1)Open een cygwin shell 2)chmod a+rwx /usr/bin/imgproc.exe 3)chmod a+rwx /usr/bin/improc.exe 4)cd /cygdrive/d/imageprocessing/cygwin_post_install 5)./create_commands.sh 6)chmod a+rwx /usr/bin/imgproc.exe 7)chmod a+rwx /usr/bin/improc.exe Dit probleem kan een aantal oorzaken hebben imgproc.exe neemt standaard aan dat het plaatje 128x128 pixels is de filter coëfficiënten zijn niet altijd even logisch (vanuit een image processing perspectief) er zit een fout in je mmips Het plaatje dat jouw mmips oplevert moet uiteindelijk bit exact overeenkomen met het plaatje dat door de originele mmips wordt geproduceerd. Als beide plaatjes precies even donker zijn dan is het goed Je kunt dit echter niet zelf zien, gebruik daarom check-image 5
21 Inhoudsopgave 22 Opdracht Veel gestelde vragen Hoe moet ik forwarding implementeren? Hoe moet ik clipping implementeren? Waarom is mijn simulatie zo traag? Hoe kan ik mijn mmips testen? Waarom stopt mijn mmips simulatie niet? Wat is de maximale frequentie van mijn mmips? Waarom werkt ImProc.exe niet? Waarom is het plaatje dat uit de mmips komt zo donker? Opdracht Belangrijke data Vragen Optimaliseer de run-time van een image processing algoritme dat draait op de mmips. Beperkingen Alle programma s die op de originele mmips draaien moeten ook op jouw mmips werken. Programma s die op jouw mmips draaien moeten precies hetzelfde resultaat (bit-exact) produceren als de originele mmips. Toegestaan Toevoegen van speciale instructies aan de mmips; Aanpassen van het ontwerp van de mmips (b.v. forwarding). Niet toegestaan Aanpassingen aan het image processing algoritme die niet nodig zijn om speciale instructies te gebruiken (b.v. vervangen van vermenigvuldiging door shifts). 23 Testen en implementeren van het ontwerp 24 Insturen van je ontwerp Test de functionele correctheid Draai de originele mmips met het algoritme om een referentie output te maken. Vergelijk deze referentie output met het resultaat van jouw eigen mmips. Hiervoor kun je gebruik maken van het check-image commando Gebruik het submit-design commando om jouw ontwerp in te sturen Je kunt zo vaak als je wilt een nieuw ontwerp opsturen, alleen de laatste versie wordt getest Implementeer jouw ontwerp op de FPGA Door je ontwerp op de FPGA te implementeren kun je de maximale klok frequentie van jouw mmips bepalen. 6
25 Belangrijke data 27 Ondersteuning en informatie Het test programma is beschikbaar op zaterdag 12 juni om 9.00 op www.es.ele.tue.nl/education/computation/mmips/assignment/submit2.php Stuur je resultaat op voor woensdag 16 juni a.s. om 12.00 uur Dit is een harde deadline. Je kunt geen uitstel krijgen! Iedere woensdag tussen 13.00 en 15.00 uur in PT 9.10 Kijk ook op www.es.ele.tue.nl/education/computation/mmips voor meer informatie, tips, etc. Presentaties op vrijdag 18 juni a.s. Maak een afspraak voor een presentatie via de website De presentatie moet gaan over wat jij gedaan hebt om de mmips sneller te maken (leg dus niet het boek, forwarding of clipping uit) 28 Vragen 7