This shows you the differences between two versions of the page.
cpl:unpub [2015/12/21 23:21] razvan.crainea [Hints/FAQ:] |
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și 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 55: | Line 55: | ||
Analiza trebuie să nu țină cont de instrucțiunile de control-flow întâlnite, de evaluarea unor condiții, de bucle etc. Cu alte cuvinte, tot ce trebuie să faceți este să iterați pe fiecare instrucțiune din fiecare funcție a programului, să îi contorizați scorul asociat iar la final să afișați scorul/costul total. | Analiza trebuie să nu țină cont de instrucțiunile de control-flow întâlnite, de evaluarea unor condiții, de bucle etc. Cu alte cuvinte, tot ce trebuie să faceți este să iterați pe fiecare instrucțiune din fiecare funcție a programului, să îi contorizați scorul asociat iar la final să afișați scorul/costul total. | ||
- | Pasul **NU** trebuie să analizeze conținutul funcțiilor [[http://llvm.org/releases/3.6.2/docs/LangRef.html#intrinsic-functions|implicite]]. **TODO: exemple de funcții implicite, constructori, destructori** | + | Pasul **NU** trebuie să analizeze conținutul funcțiilor [[http://llvm.org/releases/3.6.2/docs/LangRef.html#intrinsic-functions|implicite]], al [[http://llvm.org/docs/LangRef.html#the-llvm-global-ctors-global-variable|constructorilor]] sau al [[http://llvm.org/docs/LangRef.html#the-llvm-global-ctors-global-variable|destructorilor]]. |
+ | |||
+ | Funcțiile implicite (intrinsics) sunt folosite intern de către LLVM. | ||
+ | Aceste funcții pot fi identificate prin faptul că numele lor începe cu prefixul "llvm.*". Se poate verifica ușor dacă o funcție este sau nu implicită folosind [[ http://llvm.org/docs/doxygen/html/classllvm_1_1Function.html#a4b37898a6d26b0d5fcee66548f2621d3|API-ul]] | ||
+ | |||
+ | Constructorii și destructorii sunt menținuți în câte un array global. Funcțiile din ''llvm.global_ctors'' vor fi apelate atunci când modulul LLVM este încărcat (înainte de începerea efectivă a execuției programului), în ordinea //ascendentă// a priorității asociate. Funcțiile din ''llvm.global_dtors'' sunt apelate atunci când modulul LLVM este descărcat (după terminarea efectivă a execuției programului), în ordinea //descendentă// a priorității. | ||
+ | Pentru lucrul cu contructori, puteți folosi clasa [[http://llvm.org/docs/doxygen/html/CtorUtils_8cpp_source.html|CtorUtils]] | ||
==== Hints/FAQ: ==== | ==== Hints/FAQ: ==== | ||
<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 70: | Line 76: | ||
* Exemplu de rulare: | * Exemplu de rulare: | ||
<code bash> | <code bash> | ||
- | opt -load=/path/to/libLLVMCpl.so -cpl-static -stats -cpl-score-file=cpl-score-file.txt test.bc > out.bc | + | $ opt -load=/path/to/libLLVMCpl.so -cpl-static -stats -cpl-score-file=cpl-score-file.txt test.bc > out.bc |
===-------------------------------------------------------------------------=== | ===-------------------------------------------------------------------------=== | ||
... Statistics Collected ... | ... Statistics Collected ... | ||
Line 111: | 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 118: | 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** |