This shows you the differences between two versions of the page.
cpl:teme:concurs [2017/11/28 05:47] bogdan.nitulescu removed |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Concurs ====== | ||
- | Obiectivul acestui concurs 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 **17 ianuarie 2016, ora 23:59**. Deadline-ul este final - după această oră nu se vor mai accepta soluții. | ||
- | * **Colaborare**: Fiecare soluție este **individuală**. | ||
- | * **Premii** în puncte (100p = 10 puncte din nota finală) | ||
- | * Premiul 1 - **200p** | ||
- | * Premiul 2 - **150p** | ||
- | * Premiul 3 - **125p** | ||
- | * Premiul de participare - **100p** | ||
- | * Top 5 - șansa de a primi nota 10 la CPL! | ||
- | * **Condiții** de calificare | ||
- | * Soluția generează cod corect pentru toate testele din benchmark. | ||
- | * Soluția face o transformare non-trivială a 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]] | ||
- | * Pentru a primi nota 10 la CPL trebuie, în plus față de concurs, ca toate temele să fie trimise și toate testele din teme să se execute cu succes. | ||
- | |||
- | ===== Infrastructură ===== | ||
- | * Codul va folosi **LLVM 3.8.1** | ||
- | * Soluțiile vor fi trimise prin vmchecker, similar cu temele. | ||
- | * Clasamentul curent se regăsește la adresa [[http://elf.cs.pub.ro/cpl/concurs]] | ||
- | |||
- | ===== Enunț ===== | ||
- | Premisa acestul concurs este să scrieți un optimizor care va obține cel mai bun rezultat 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]] | ||