IBM - CVUT Student Research Projects Implementace filtrů FIR a IIR Jaroslav Sýkora
page 2 Filtr FIR na SPU výpočet 4 výstupního hodnot najednou: SIMD výstupy jsou nezávislé -> MIMD paralelizace
page 3 FIR – SIMD implementace for (i = 0; i < nvb; i++) { vector float bi = b[i]; vector float xin2 = x[nvb+n-i-1]; vector float yr01 = spu_add(yr0, yr1); vector float x3 = spu_shuffle(xin, xin, x3_pat); vector float x0 = spu_shuffle(xin2, xin, x0_pat); vector float x1 = spu_shuffle(xin2, xin, x1_pat); vector float x2 = spu_shuffle(xin2, xin, x2_pat); vector float yr23 = spu_add(yr2, yr3); yn = spu_add(yn, yr01); xin = xin2; vector float y0 = spu_mul(bi, x0); vector float y1 = spu_mul(bi, x1); vector float y2 = spu_mul(bi, x2); vector float y3 = spu_mul(bi, x3); yn = spu_add(yn, yr23); vector float yr0a = spu_shuffle(y0, y1, yr0a_pat); vector float yr1a = spu_shuffle(y0, y1, yr1a_pat); /*vector float*/ yr0 = spu_or(yr0a, yr0b); /*vector float*/ yr1 = spu_or(yr1a, yr1b); /*vector float*/ yr2 = spu_or(yr2a, yr2b); /*vector float*/ yr3 = spu_or(yr3a, yr3b); } vector float yr01 = spu_add(yr0, yr1); vector float yr23 = spu_add(yr2, yr3); yn = spu_add(yn, yr01); yn = spu_add(yn, yr23); y[n] = yn; } čtení x a b posuny násobení transpozice sumy 4 výsledky
page 4 Měření FIR AthlonXP vs PPU vs SPU; (gcc -O3) data: a) 3.5MB / 128p; b) 18MB / 128p zpomalení při více SPU – problém s paměťovou sběrnicí? zrychlení až 138x oproti PPU v případě b)!
page 5 Stonásobné zrychlení? SPU: f=3.2GHz, vstupní soubor: d=18MB (1 vzorek = 16bit) #vektorů: v=d/2/4= (vektor = 4 float) naměřený čas na 18MB: t=30ms čas na jeden vektor: t 1v =t/v=13ns #taktů na jeden vektor: t 1v /(1/f) = 42 (+- chyba měření času) závěry: víme, že SPU to může stihnout nevíme, proč je PPU pomalé – srovnání s AthlonXP, které má nižší frekvenci, ale pokročilejší architekturu
page 6 Filtr IIR na SPU pomocná paměť z[] o délce length(a) nelze počítat paralelně -> pouze SIMD FIR IIR rekurze!
page 7 Měření IIR filtr je rekurzivní, takže nelze počítat paralelně na více SPU data: a) 3.5MB / 8p; b) 18MB / 8p zrychlení až 26x oproti PPU v případě b)
page 8 Filtr Savitzky-Golay centrovaný (tedy nekauzální) FIR filtr okrajové podmínky – ošetřen náběh a doběh filtru – počítáno na PPU, rovnovážný stav na SPU jedna obecná funkce implementuje SavGol a klouzavý průměr sama používá SPU-FIR popsaný na začátku prezentace
page 9 Závěr FIR: implementace na SPU je dobře SIMDizovatelná i paralelizovatelná IIR: dá se těžko paralelizovat (inherentně sekvenční) implementovány další varianty FIRu: klouzavý průměr, Savitzky-Golay: jen jiný “frontend” pro základní FIR Otázky?