Differences

This shows you the differences between two versions of the page.

Link to this comparison view

cpl:unpub [2015/12/21 23:47]
octavian.moraru [Analiză statică (30 puncte)]
cpl:unpub [2015/12/23 23:17] (current)
octavian.moraru [Hints/FAQ:]
Line 25: Line 25:
 Premisa acestul concurs este că avem la dispoziție o arhitectură fictivă care execută instrucțiuni LLVM IR. Pentru a executa o instrucțiune LLVM IR pe procesorul fictiv este necesar un anumit număr de cicluri de ceas. Astfel, putem estima cât de costisitoare este execuția unei instrucțiuni. Premisa acestul concurs este că avem la dispoziție o arhitectură fictivă care execută instrucțiuni LLVM IR. Pentru a executa o instrucțiune LLVM IR pe procesorul fictiv este necesar un anumit număr de cicluri de ceas. Astfel, putem estima cât de costisitoare este execuția unei instrucțiuni.
  
-Pentru aceasta fiecare ​pass va folosi un fișier de intrare care conține pe fiecare linie numele unei instrucțiuni LLVM IR și un cost/scor asociat.+Pentru aceasta fiecare ​pas va folosi un fișier de intrare care conține pe fiecare linie numele unei instrucțiuni LLVM IR și un cost/scor asociat.
 Exemplu: Exemplu:
 <​code>​ <​code>​
Line 37: Line 37:
 Token-ul special ''​default''​ este folosit pentru a asocia un cost implicit pentru instrucțiunile care nu sunt menționate explicit în fișier. Dacă linia cu token-ul ''​default''​ lipsește, costul implicit este ''​0''​. Token-ul special ''​default''​ este folosit pentru a asocia un cost implicit pentru instrucțiunile care nu sunt menționate explicit în fișier. Dacă linia cu token-ul ''​default''​ lipsește, costul implicit este ''​0''​.
  
-Fiecare pas LLVM implementat trebuie să citească costurile asociate instrucțiunilor din fișierul ''​cpl-score-file.txt''​. Paștrebuie să poată permită folosirea unui alt fișier cu scoruri folosind argumentul ''​-cpl-score-file''​. Exemplu:+Fiecare pas LLVM implementat trebuie să citească costurile asociate instrucțiunilor din fișierul ''​cpl-score-file.txt''​. Pașii trebuie să poată permită folosirea unui alt fișier cu scoruri folosind argumentul ''​-cpl-score-file''​. Exemplu:
  
 <code bash> <code bash>
Line 66: Line 66:
  
 <note tip> <note tip>
-  * **Q:** Cum pot prelua o opțiune din linia de comandă în cadrul ​pass-ului ​LLVM?+  * **Q:** Cum pot prelua o opțiune din linia de comandă în cadrul ​pasului ​LLVM?
   * **A:** Folosind API-ul [[http://​llvm.org/​releases/​3.6.2/​docs/​CommandLine.html|CommandLine]]   * **A:** Folosind API-ul [[http://​llvm.org/​releases/​3.6.2/​docs/​CommandLine.html|CommandLine]]
  
Line 117: Line 117:
 ===== Optimizare (30 puncte) ===== ===== Optimizare (30 puncte) =====
 Arhitectura pe care lucrăm are o particularitate:​ costul execuției instrucțiunilor ''​br''​ și ''​switch''​ (atât condiționale cât și necondiționale) este foarte ridicat. Arhitectura pe care lucrăm are o particularitate:​ costul execuției instrucțiunilor ''​br''​ și ''​switch''​ (atât condiționale cât și necondiționale) este foarte ridicat.
-Pentru a rezolva a treia parte a temei, trebuie să creați un pas de optimizare care să micșoreze costul de execuție reducând numărul de instrucțiuni ''​br''​ __executate__.+Pentru a rezolva a treia parte a temei, trebuie să creați un pas de optimizare care să micșoreze costul de execuție reducând numărul de instrucțiuni ''​br''​ __executate__ ​(ex: mai puține bucle).
  
 Evaluarea se va face folosind un set de benchmark-uri:​ costul de execuție pentru arhivarea/​dezarhivarea unui anumit set de date, folosind utilitarele zip/unzip. Costul de execuție se calculează instrumentând varianta optimizată a programului de test folosind pass-ul implementat în partea a doua. Evaluarea se va face folosind un set de benchmark-uri:​ costul de execuție pentru arhivarea/​dezarhivarea unui anumit set de date, folosind utilitarele zip/unzip. Costul de execuție se calculează instrumentând varianta optimizată a programului de test folosind pass-ul implementat în partea a doua.
Line 124: Line 124:
  
 <note tip> <note tip>
-  * **Cum minimizez numărul de branch-uri?​** +  * **Q:** Cum minimizez numărul de branch-uri? 
-Un număr mare de instrucțiuni de control-flow sunt exeutate ​în cadrul buclelor. Va trebui ​să vă gândiți și să implementați o optimizare țintită pe bucle care va reduce numărul de instrucțiuni ''​br''​ executate, crescând însă dimensiunea codului. +  * **A:** Un număr mare de instrucțiuni de control-flow sunt executate ​în cadrul buclelor. Va trebui să implementați o variantă de "loop unrolling"​. Această ​optimizare țintită pe bucle reduce numărul de instrucțiuni ''​br''​ executate, crescând însă dimensiunea codului. 
-  * **Ce pași de analiză LLVM am voie să folosesc?​** + 
-  TODO +  * **Q:** Cum primesc punctajul pentru această parte? 
-  * **Ce pași de analiză LLVM NU am voie să folosesc?** +  * **A:** Veți primi punctajul complet dacă pasul vostru de optimizare a) realizează desfacerea //unor// bucle, b) respectă [[http://​ocw.cs.pub.ro/​courses/​cpl/​meta/​notare#​penalizare_pentru_teme_copiate|regulamentul]] de realizare a temelor și c) scade costul de rulare a benchmark-ului sub un anumit prag. 
-  ​TODO+ 
 +  * **Q:** Ce pași de analiză LLVM am voie să folosesc? 
 +  ​* **A:** Puteți folosi optimizările de promovare în regiștrii (''​mem2reg''​) și de propagarea constantelor (''​constprop''​),​ împreună cu pașii impliciți. 
 + 
 +  * **Q:** Ce pași de analiză LLVM NU am voie să folosesc? 
 +  ​* **A:** NU puteți folosi niciun alt pas care nu a fost menționat explicit.
 </​note>​ </​note>​
  
 ===== Concurs ===== ===== Concurs =====
  
-Regula este simplă: cine obține cel mai mic scor pentru benchmark-ul dat, câștigă. Pentru a micșora costul de execuție puteți implementa orice pași de optimizare doriți, pe care îi puteți apela în orice ordine. **Atenție** însă: nu aveți voie să folosiți pașii LLVM, nici direct (nu aveți voie să îi apelați), nici indirect (nu aveți voie să preluați cod). Aceeași regulă se aplică și pentru pașii de analiză. Pentru mai multe detalii, consultați [[:​cpl:​teme:​general|regulamentul]],​ secțiunea //Reguli de realizare a temelor//+Regula este simplă: cine obține cel mai mic scor pentru benchmark-ul dat, câștigă. Pentru a micșora costul de execuție puteți implementa orice pași de optimizare doriți, pe care îi puteți apela în orice ordine. **Atenție** însă: nu aveți voie să folosiți pașii LLVM, nici direct (nu aveți voie să îi apelați), nici indirect (nu aveți voie să preluați cod - verificați ce înseamnă [[cpl:​meta:​notare##​penalizare_pentru_teme_copiate|temă copiată]]).  Aceeași regulă se aplică și pentru pașii de analiză. 
 +===== Implementare =====
  
 +Pentru implementarea pașilor LLVM, puteți urmării pașii de mai jos:
  
 +  - Descărcați {{:​cpl:​concurs-arhiva.zip|arhiva de start}} **în afara** surselor LLVM și dezarhivați-o (Exemplu: ''​zip concurs-arhiva.zip''​)
 +  - Creați un director de build și intrați în el (Exemplu: ''​mkdir build; cd build''​)
 +  - Rulați ''​cmake''​ cu calea directorului unde ați dezarhivat arhiva (Exemplu: ''​cmake ..''​)
 +  - Compilați pasul (Exemplu: ''​make''​)
 +  - Dacă totul s-a compilat cu succes, ar trebui să se genereze biblioteca ''​libLLVMCpl.so''​ în directorul ''​Cpl''​
  
 +===== Resurse =====
  
 +  * {{:​cpl:​concurs-arhiva.zip|Arhiva de start}}
 +  * [[http://​llvm.org/​releases/​3.6.2/​docs/​index.html|Documentația]] LLVM
 +  * Loop Unrolling:
 +    * Dragon Book: Capitolele 10.4.5, 9.6
 +    * Muchnik: Capitolul 18 (Secțiunea 18.4), Capitolul 14
 +  * Testare: **TODO**
cpl/unpub.1450734451.txt.gz · Last modified: 2015/12/21 23:47 by octavian.moraru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0