Ütemezés, házi feladat
Ütemezés
A tárgy féléves ütemezése INNEN(TBD) tölthető le. Az előadások sorrendjében előfordulhatnak módosulások, a gyakorlatok témája fix.
Házi feladat
Feladat kiírás
A házi feladat egy 5x5 ablak méretű medián szűrő megvalósítása három technológia segítségével. A bemenet a gyakorlatokon is használt jpg fájl (illetve HDMI), a szűrést az egyszerűség kedvéért itt is színkomponensenként kell elvégezni.
A házi feladat elsődleges célja adott algoritmus minél hatékonyabb implementációja, így két nagyon hasonló elvű algoritmus közül lehet választani:
- Batcher odd-even merge sort
- A Fast Median Filter using AltiVec (Az egyetem IEEE Explore előfizetése megszűnt, így a link nem él. ITT legalább a cikk legfontosabb ábrája elérhető.)
A teljes házi feladat 3 nagyobb részből áll, minden részben ugyanazt a választott algoritmust kell megvalósítani.
1. C nyelvű, optimalizálatlan implementáció.
A további részek verifikálására, illetve a gyorsulás mérésére szolgáló optimalizálatlan C kód. A dokumentáció tartalmazza az olvashatóan tördelt, kommentezett forráskódot.
2. C nyelvű, optimalizált implementáció.
Az 1. feldatban megvalósított algoritmus implementációja több szálon, és vektor utasítások használatával.
A dokumentáció tartalmazza:
- A többszálú végrehajtás és a vektorizáció elvét ábrákkal és szövegesen magyarázva
- Az olvashatóan tördelt, kommentezett forráskódot
- A futási idő eredményeket (~200-1000 futás átlaga)
Az INNEN letölthető megoldás (OpenMP + AVX2, illetve OpenMP + SSE) szolgálhat körülbelüli teljesítmény referenciaként. Megjegyzendő, hogy ez nem egy végletekig optimalizált implementáció, ennél jóval gyorsabb is készíthető. Tehát inkább arra szolgál, hogy lássátok, mi a minimum elérendő teljesítmény. A HF-ek futtatására használt processzoron ~2000 MP/s a teljesítménye.
3. GPU gyorsított implementáció CUDA-ban vagy OpenCL-ben.
A megvalósítás során törekedjen az optimalizációs lehetőségek kihasználására! (Nem elegendő egy triviális, globális memóriát használó verzió!)
CUDA esetén az NVIDIA Visual Profiler használható.
A dokumentáció tartalmazza:
- A megvalósítás elvét szövegesen és ábrákkal magyarázva.
- Az olvashatóan tördelt, kommentezett forráskódot.
- A használt GPU típusát.
- Az NVIDIA Visual Profiler által szolgáltatott kernel futási időt. (OpenCL használata esetén nem kell!)
- Az NVIDIA Visual Profiler Kernel analysis, Memory Bandwidth Analysis, Compute Analysis és Latency Analysis eredményeit (screenshot-ok formájában). (OpenCL használata esetén nem kell!)
Referenciaként az alábbi megvalósítások szolgálnak. Ezekre ugyanaz igaz, mint a CPU-s referenciára: a HF célja gyorsabb megoldást készíteni.
- A CUDA referencia INNEN tölthető le. Futtatásához NVIDIA GPU szükséges.
- Az OpenCL megvalósítás INNEN tölthető le. Az exe fájlnak parameétere, hogy hányszor futtassa a kernel-t (pl "median_ocl 1000" parancs ezerszer futtatja), ennek alapértéke 100. CPU esetén célszerű ~10-re állítani, gyors GPU esetén kb. 1000 már pontos eredményt ad.
Megj.: Gyors GPU-val sem kell az AVX megoldásnál nagyságrendekkel rövidebb futási időt várni, lassabb GPU-val az is könnyen előfordulhat, hogy a GPU verzió a lassabb. A laborban a GTX 1070-t tartalmazó gépen célszerű tesztelni.
A HF-ek futtatására használt Titan Xp-n a CUDA referencia teljesítménye ~5800 MP/s.
4. FPGA implementáció Xilinx Vivado HLS környezetben.
Az FPGA implementáció során a bemenet a Logsys kártyán található HDMI bemeneti interfész, a feldolgozott képet pedig a HDMI kimeneten kell kiadni. A maximális felbontás 1600x900 @ 60 Hz, ehhez kb. 100 Mhz pixel frekvencia tartozik. Követelmény a valós idejű működés.
Megjegyzések:
- Az előző megoldásokkal ellentétben itt nem áll rendelkezésre a memóriában a teljes kép, a bemeneti pixelek soronként, ezen belül oszloponként érkeznek. A megfelelő mennyiségű adat buffereléséről a HLS kódban kell gondoskodni.
- A megvalósítása során NEM feltételezheti, hogy a bejövő videó jel mindig ekkora felbontású, de azt igen, hogy ez a maximuma. Tehát a generált hardvernek minden ennél kisebb felbontású videóval helyesen kell működnie.
-
Paraméterek:
- A használt FPGA típusa: xc7k70tfbg676-1.
-
Portok (mind a ki-, mind pedig a bemeneten):
- Pixel adatok: 3x8 bit (R, G, B)
-
Vezérlő jelek
- Adat érvényes: a pixel az aktív képtartomány része (de).
- Horizontális szinkronjel (hs).
- Vertikális szinkronjel (vs).
-
A lap aljáról belépés után letölthető ZIP fájl az alábbiakat tartalmazza:
- Vivado HLS projekt (hls könyvtár). Található benne egy C++ testbench, amely a projektben található BMP fájlt megfelelő időzítési paraméterekkel beadja a tesztelt függvénynek, a kimenetet pedig fájlba írja.
- Vivado testbench projekt (vivado_tb könyvtár). A HLS-ben generált HDL kód tesztelésére szolgáló projekt. Elsősorban a megfelelő időzítés gyors ellenőrzésére, a funkcionális helyességet a C++ testbench ellenőrzi. A projekt a HLS-ben implementált részt Vivado Block Design IP-ként tartalmazza.
- Vivado implementációs projekt (vivado_top könyvtár). Tartalmazza a HDMI ki- és bemenetet. A projekt a HLS-ben implementált részt Vivado Block Design IP-ként tartalmazza.
-
Dokumentáció
- Magas szintű blokkvázlat az elképzelt megoldásról.
- Kommentezett, normálisan tördelt forráskód, a használt direktívák és azok rövid indoklása, valamint a szintézis eredmények.
- A terv időzítési paramétereit ellenőrizze implementáció után, s ezt is mellékelje a dokumentációban!
- A működő projektet be kell mutatni élőben.
-
Referencia erőforrás igény
- ~4200 FF, ~9200 LUT, 12 BRAM
Ellenőrzés
A megavlósított algoritmusnak természetesen funkcionálisan helyesnek kell lennie. Ennek ellenőrzéséhez az alábbi fájlok használhatók:
- Helyes kimeneti kép JPG formátumban. A gyakorlaton használt kód veszteségesen tömörített JPG formátumú fájlt ment. Ugyanbból a bemeneteből ugyanazt a képet generálja a tömörítés, így a kimeneti fájl mérete meg kell, hogy egyezzen a linkelt fájllal.
- Helyes kimeneti kép BMP formátumban. Amennyiben a kimeneti fájl kiterjesztését bmp-re módosítjuk a C kódban, a DdevIL tömörítetlen BMP fájlt ment. Értelemszerűen a fájl mérete ebben az esetben ugyanakkora a tartalomtól függetelenül, de pixelenkénti ellenőrzésre ez alkalmasabb.
Beadandó
A házi feladat beadási határideje a szorgalmi időszak vége, illetve késedelmes leadás esetén a pótlási hét vége (azaz vasárnap éjfél). A házi feladat eredményét egy ZIP file-ban a MIT házi feladat portálra kell feltölteni. A file-t a HF csoport névsorban előrébb lévő hallgatója töltse fel!
Sablon a dokumentációhoz a lap alján érhető el, belépés után.
Követelmények a feltöltött file-lal:
- A file neve a hallgató vezetékneve: NÉV.zip
-
A tömörített fájlnak az alábbiakat kell tartalmaznia egy NÉV könyvtárban:
- A dokumentációt tartalmazó PDF file NÉV.pdf névvel.
- A bemeneti kép. Kötelezően a gyakorlaton is használt kép.
- A futáshoz szükséges DLL fájlok.
- cpu.exe: A vektorizált, többszálú megoldásból generált futtatható állomány, amely a konzol ablakban kiírja a futási időt.
- gpu.exe: A GPU (OpenCL) megvalósításból generált futtatható állomány, amely a konzol ablakban kírja egy kernel (memória másolás nélkül!) futási idejét.
- A feltöltött futtatható állományoknak kicsomagolás után működniük kell, ezt feltöltés előtt próbáljátok ki!
- Ugyancsak kiemelendő, hogy a kimeneti fájlnak természetesen helyesnek kell lennie, ellenkező esetben az adott részfeladat eredménye 0.
Osztályozás
Az osztályozás alapja a dokumentáció és a futási idő eredmények:
- A dokumentációnak tartalmaznia kell a fent megadott elemeket.
- A SIMD és GPU implementáció esetében a beadott megoldásokat az elért idők alapján sorbarendezzük, az első 33% részeredménye 5, a második 33%-é 4, a harmadik 33%-é 3. A beadott megoldásoknak funkcionálisan helyesnek kell lennie. Az elfogadás további feltétele, hogy a beadott megvalósítás a fenti referencia megoldás sbességének legalább a 70%-t elérje.
- A HLS megoldásnak teljesítenie kell a fent megadott teljesítmény követelményt, a megavlósítás minőségét a terv erőforrás igénye határozza meg.
- A végleges HF jegy a fenti részeredmények alapján adódik.
A mérésekhez használt rendszer specifikációja:
- CPU: Intel Core i5-8600K (6 mag), DDR4-2666 memória
- GPU: NVIDIA TITAN Xp. Pascal architektúra, Compute Capability 6.1.