This shows you the differences between two versions of the page.
cpl:teme:tema2 [2016/10/04 07:21] bogdan.nitulescu |
cpl:teme:tema2 [2018/01/19 13:23] (current) bogdan.nitulescu [Informații organizatorice] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Tema de casă 2 - Generarea codului obiect ====== | + | ====== Tema 2 - Optimizari ====== |
+ | 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. | ||
- | TO BE ANNOUNCED SOON! | + | ===== 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]] | ||