Differences

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

Link to this comparison view

cpl:teme:tema2 [2015/11/11 10:37]
bogdan.nitulescu
cpl:teme:tema2 [2018/01/19 13:23] (current)
bogdan.nitulescu [Informații organizatorice]
Line 1: Line 1:
-====== Tema de casă 2 - Analiza semantică și generarea ​de cod ====== +====== Tema 2 - Optimizari ====== 
-[[cpl:teme-draft:t2-draft-2015|Draft]]+Obiectivul acestei teme este să scrieți unul sau mai mulți pași de optimizare, folosind framework-ul LLVM, astfel încât să reduceți cât mai mult dimensiunea codului rezultat. 
 + 
 +===== Informații organizatorice ===== 
 +  * **Deadline**:​ Termenul limită până când se poate participa la concurs este **27 ianuarie 2018, ora 23:59**. Deadline-ul este final - după această oră nu se vor mai accepta soluții. 
 +  * **Colaborare**:​ Fiecare soluție este **individuală**. 
 +  * **Condiții** de punctare 
 +    * Soluția generează ​cod corect pentru toate testele din benchmark. (Nu se modifica semantica codului, rezultatul executiei este acelasi) 
 +    * Soluția face cel putin doua transformari non-triviale ale codului. 
 +    * Codul soluției nu este copiat dintr-un [[http://​releases.llvm.org/​3.8.1/​docs/​Passes.html#​transform-passes|pass de transformare existent din LLVM]] 
 +    * Arhiva trebuie sa contina un fisier README in care sa fie descrise optimizarile propuse si modul de implementare. 
 + 
 +===== Infrastructură ​===== 
 +  * Codul va folosi **LLVM 3.8** 
 +  * Soluțiile vor fi trimise prin vmchecker 
 +===== Enunț ===== 
 +Premisa acestei teme este să scrieți un optimizor care va obține un rezultat bun in benchmarkul "​CPLMark"​ . Veți extinde utilitarul **opt** din LLVM, adăugând o bibliotecă ce conține pașii voștri de optimizare. 
 + 
 +Scorul CPLMark este dimensiunea totală a secțiunilor .text din fișierele din benchmark, după ce au trecut prin optimizorul vostru si apoi au fost compilate cu **llc** pentru arhitectura ARM. 
 + 
 +Fișierele din benchmark sunt în format .ll , dar pentru referință am adăugat și fișierele C originale. 
 + 
 +<​note>​**opt** nu va rula decât pașii voștri de optimizare, nu și cei "​built-in"​. Toate transformările codului vor fi scrise de voi. O strategie posibilă ar fi să examinați fișierele din benchmark, să estimați care sunt optimizările care ar putea aduce reduce dimensiunea codului - de exemplu eliminarea codului mort, optimizarea salturilor, eliminarea subexpresiilor comune - și să le implementați pe cele mai promițătoare.</​note>​ 
 + 
 +Pentru a calcula scorul unui test se folosește următoarea secvență de comenzi: 
 + 
 +<code bash> 
 +# Transform the test .ll file in binary format 
 +llvm-as test.ll -o test.bc 
 +# Run your optimization passes 
 +opt -load=./​libLLVMCpl-Contest.so -cpl-my-1st-pass -cpl-my-2nd-pass test.bc > test-optimized.bc 
 +# Generate an optimized object file for the ARM architecture 
 +llc test-optimized.bc -march=arm -filetype=obj -o test.o 
 +# Compute the size of the text section in the object file 
 +llvm-size -A test.o 
 +</​code>​ 
 + 
 +Scorul final este suma scorului individual pentru fiecare test. 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 +===== Implementare ===== 
 + 
 +Pentru a începe implementarea pașilor LLVM, puteți urmării pașii de mai jos: 
 + 
 +  - Descărcați {{:​cpl:​concurs-arhiva.zip|arhiva de start}} și dezarhivați-o 
 +  - 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-Contest.so''​ în directorul de build. 
 + 
 +Arhiva de start conține trei fișiere sursă, fiecare dintre acestea conținând scheletul de cod pentru un tip de pas de optimizare. Puteți să ii modificați,​ să îi ștergeți sau să adăugați alți pași. Dacă adăugați sau scoateți fișiere din proiect, trebuie să modifcați fișierul **CMakeLists.txt** 
 + 
 +Numele fiecărui pas trebuie să inceapă cu **cpl-** . Linia de comandă cu care va fi apelat **opt** va conține acești pași în ordine alfabetică. 
 + 
 +Din infrastructura existentă LLVM puteți folosi ​[[http://​releases.llvm.org/​3.8.1/​docs/​Passes.html#​analysis-passes|pașii de analiză]], dar nu și pe cei de transformare;​ nici direct (nu aveți voie să îi apelați), nici indirect (nu aveți voie să preluați cod). 
 + 
 +Pentru a rula testele, dezarhivați arhiva ce conține {{:cpl:concurs-teste.zip|benchmarkul CPLMark}} în directorul de build, si apoi rulați **./​cplmark.sh** 
 + 
 + 
 +===== Resurse ===== 
 + 
 +  * {{:cpl:concurs-arhiva.zip|Arhiva de start}} 
 +  * {{:​cpl:​concurs-teste.zip|CPLMark}} 
 +  * [[http://​llvm.org/​docs/​WritingAnLLVMPass.html|Writing an LLVM Pass]] 
  
cpl/teme/tema2.1447231065.txt.gz · Last modified: 2015/11/11 10:37 by bogdan.nitulescu
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