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!