• Nem Talált Eredményt

Az illesztett szűrés auto-vektorizálása

Az előző fejezetekben leírtaknak megfelelően konfiguráljuk, majd fordítsuk le az illesztett szűrés szekvenciális kódját az alábbi utasításokkal:

user@home> cmake -DCMAKE_C_FLAGS="-O3 -ftree-vectorizer-verbose=6 -march=native --fast-math" .

user@home> make clean; make ...

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:32

32: not vectorized: control flow in loop.

32: not vectorized: Bad inner loop.

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:33

33: not vectorized: control flow in loop.

/home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:12: note: vectorized 0 loops in function.

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:57

57: not vectorized: control flow in loop.

/home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:52: note: vectorized 0 loops in function.

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:72

72: Alignment of access forced using peeling.

72: vect_model_induction_cost: inside_cost = 1, outside_cost = 2 .

72: not vectorized: relevant stmt not supported: D.4221_14 = applyFn (f_13(D), input_2(D), i_21);

/home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:68: note: vectorized 0 loops in function.

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:89

89: not vectorized: unexpected loop form.

/home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:81: note: vectorized 0 loops in function.

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:100

100: Alignment of access forced using peeling.

100: vect_model_load_cost: aligned.

100: vect_model_load_cost: inside_cost = 2, outside_cost = 0 .

100: not vectorized: relevant stmt not supported: value_15 = applyFn (D.4191_12, input_13(D), n_14(D));

/home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:95: note: vectorized 0 loops in function.

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:114

114: not vectorized: control flow in loop.

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:100

100: Alignment of access forced using peeling.

100: vect_model_load_cost: aligned.

100: vect_model_load_cost: inside_cost = 2, outside_cost = 0 .

100: not vectorized: relevant stmt not supported: maxValue_25 = applyFn (D.4584_24, input_2(D), i_31);

/home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:109: note: vectorized 0 loops in function.

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/filter.c:121

121: not vectorized: number of iterations cannot be computed.

...

Az üzenetekből láthatjuk, hogy a filter.c állományban egyetlen olyan ciklus sincs, amely vektorizálható lenne. Az okok változatosak, a legtöbb ciklus esetén az a probléma, hogy a ciklusmag vezérlési szerkezetet, függvényhívást tartalmaz, vagy éppen nem lehet meghatározni a ciklus lépéseinek számát. Az illesztett szűrés kódjában az egyetlen vektorizálható ciklus a writePGMImage függvényben a kiírandó kép minimum és maximum intenzitását határozza meg:

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/pgm.c:57

57: not vectorized: number of iterations cannot be computed.

/home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/pgm.c:19: note: vectorized 0 loops in function.

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/pgm.c:96

96: not vectorized: loop contains function calls or data references that cannot be analyzed

Analyzing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/pgm.c:74

74: Alignment of access forced using peeling.

74: vect_model_simple_cost: inside_cost = 1, outside_cost = 0 . 74: vect_model_load_cost: aligned.

74: vect_model_load_cost: inside_cost = 1, outside_cost = 0 . 74: vect_model_reduction_cost: inside_cost = 1, outside_cost = 3 . 74: vect_model_reduction_cost: inside_cost = 1, outside_cost = 3 . 74: cost model: prologue peel iters set to vf/2.

74: cost model: epilogue peel iters set to vf/2 because peeling for alignment is unknown .

74: Cost model analysis:

Vector inside of loop cost: 3 Vector outside of loop cost: 26 Scalar iteration cost: 3

Scalar outside cost: 7 prologue iterations: 2 epilogue iterations: 2

Calculated minimum iters for profitability: 8 74: Profitability threshold = 7

Vectorizing loop at /home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/pgm.c:74

74: Profitability threshold is 7 loop iterations.

74: LOOP VECTORIZED.

/home/gykovacs/docs/2012-10-12-kombinalt-parhuzamos-jegyzet/mfilter/autovect/src/lib/pgm.c:65: note: vectorized 1 loops in function.

Az egyetlen vektorizálható művelet tehát nem a forró ponthoz tartozik. Az, hogy a nagyon egyszerűnek tekinthető illesztett szűrés kódjában csak egyetlen vektorizálható ciklus van, jól jellemzi, hogy mennyire kevés és egyszerű szerkezetek vektorizálhatók jelenleg automatikusan.

Az auto-vektorizálással elérhető sebességnövekedés az illesztett szűrést megvalósító program esetén szinte nem is mérhető, mivel a gprof kimenetében láthattuk, hogy a writePGMImage függvény a futási időhöz alig egy századmásodperccel járul hozzá, aminek zöme természetesen nem a legkisebb és legnagyobb intenzitás meghatározása, hanem a kép lemezre írása.

4. Feladatok

1. (★★) Készítsen programot, amely rögzített, 1024×1024 méretű, egészeket tartalmazó mátrixok szorzását hajtja végre! Hasonlítsa össze a program futási idejét -O3 optimalizálással, auto-vektorizálással és annak kikapcsolása esetén. A -O3 optimalizálás alapértelmezett módon tartalmazza az auto-vektorizálást, amely azonban kikapcsolható a -fno-tree-vectorize kapcsolóval.

2. (★) Vizsgálja meg megfelelő fordítási kapcsolók alkalmazásával, hogy a kNN-osztályozás implementációjának fordításakor történik-e auto-vektorizálás! Vizsgálja meg, hogy átalakítható-e a kód úgy, hogy az auto-vektorizálható konstrukciókat tartalmazzon!

3. (★) Vizsgálja meg megfelelő fordítási kapcsolók alkalmazásával, hogy a részecskeszimuláció implementációjának fordításakor történik-e auto-vektorizálás! Vizsgálja meg, hogy átalakítható-e a kód úgy, hogy az auto-vektorizálható konstrukciókat tartalmazzon!