Automatické Parallelization chyby a upozornění
Automaticky Parallelizer a automaticky Vectorizer jsou navrženy pro zajištění automatické výkonu zisky smyčky ve vašem kódu.
Automatické Parallelizer
/Qpar přepínače umožňuje automatické paralelního zpracování smyček ve vašem kódu.Pokud zadáte tento příznak beze změny existující kód, kompilátor vyhodnotí kód, který chcete vyhledat smyčky, které mohou využívat paralelního zpracování.Protože může najít smyčky, kteří nejsou množství práce a proto nebude těžit z výhod paralelního zpracování a vzhledem k tomu, že všechny nepotřebné paralelního zpracování může způsobit vytváření fondu podprocesů, doplňující synchronizace nebo jiné zpracování, které by mohlo zpomalit namísto jak ji lze vylepšit výkon, je kompilátor konzervativní při výběru smyčky, které jej parallelizes.Zvažte například následující příklad, ve kterém není znám horní hranice smyčky při kompilaci:
void loop_test(int u) {
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
Protože u může být hodnotu malou, kompilátor nebude automaticky paralelní této smyčky.Nicméně stále měli byste jej paralelizován vzhledem k tomu, že víte, že u budete mít vždy vysoké.Chcete-li povolit paralelního zpracování automaticky, zadejte #pragma loop(hint_parallel(n)), kde n je počet vláken paralelní napříč.V následujícím příkladu se pokusí kompilátor paralelní smyčky napříč 8 vláken.
void loop_test(int u) {
#pragma loop(hint_parallel(8))
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
Stejně jako ve všech direktiv pragma, syntaxi alternativní pragma __pragma(loop(hint_parallel(n))) je také podporován.
K dispozici jsou některé smyčky, které kompilátor nemůže paralelní i v případě, že se má.Tady je příklad:
#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
A[i] = B[i] * C[i];
Funkce upper_bound() může dojít ke změně pokaždé, když je volána.Vzhledem k tomu, že horní hranice nemůže být známé, může kompilátor generuje diagnostické zprávy, která vysvětluje, proč se nelze paralelní této smyčky.Následující příklad ukazuje smyčku, který může být paralelizován, smyčku, která nemůže být paralelizován, kompilátor Syntaxe použití na příkazovém řádku a výstup kompilátoru pro každou možnost příkazového řádku:
int A[1000];
void test() {
#pragma loop(hint_parallel(0))
for (int i=0; i<1000; ++i) {
A[i] = A[i] + 1;
}
for (int i=1000; i<2000; ++i) {
A[i] = A[i] + 1;
}
}
Kompilaci pomocí tohoto příkazu:
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1
poskytuje tento výstup:
--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
Kompilaci pomocí tohoto příkazu:
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2
poskytuje tento výstup:
--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
d:\myproject\mytest.cpp(4) : loop not parallelized due to reason '1008'
Všimněte si rozdílu mezi těmito dvěma různé ve výstupu /Qpar-report (úroveň sestav s automatickou vektorizací) možnosti./Qpar-report:1odešle zprávy parallelizer pouze pro cykly, které jsou úspěšně paralelizován výstupu./Qpar-report:2výstupem parallelizer zprávy pro obě parallelizations úspěšné a neúspěšné cyklu.
Další informace o kódech důvod a zpráv naleznete v tématu Zprávy nástrojů pro vektorizaci a paralelní zpracování.
Automatické Vectorizer
Automaticky-Vectorizer analyzuje smyčky ve vašem kódu a používá vector registrů a pokyny na cílovém počítači spustit, pokud je to možné.Tím lze vylepšit výkon vašeho kódu.Kompilátor zaměřuje SSE2 AVX a AVX2 pokynů Intel nebo AMD procesorů nebo NEÓNOVÁ návod ARM procesory podle /oblouk přepnout.
Automaticky-Vectorizer může generovat různé pokyny, než určuje /arch přepnout.Tyto pokyny jsou chráněn kontrolou runtime a ujistěte se, že kód stále běží správně.Například při sestavování /arch:SSE2, může být emitovány SSE4.2 pokyny.Modul runtime kontroly ověří, zda SSE4.2 je k dispozici na cílový procesor a přejde na jiný SSE4.2 verzi smyčky, pokud procesor nepodporuje tyto pokyny.
Ve výchozím nastavení je automaticky-Vectorizer povolena.Pokud chcete porovnat výkon váš kód podle vectorization, můžete použít #pragma loop(no_vector) zakázání vectorization jakékoli daného cyklu.
#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
A[i] = B[i] + C[i];
Stejně jako ve všech direktiv pragma, syntaxi alternativní pragma __pragma(loop(no_vector)) je také podporován.
Jak se automaticky Parallelizer, můžete zadat /Qvec-report (Úroveň sestavy s automatickou vektorizací) příkazového řádku možností oznámit buď úspěšně vectorized smyčky pouze –/Qvec-report:1– nebo oba úspěšně a neúspěšně vectorized smyčky –/Qvec-report:2).
Další informace o kódech důvod a zpráv naleznete v tématu Zprávy nástrojů pro vektorizaci a paralelní zpracování.
Příklad ukazující, jak funguje vectorizer ve skutečnosti, naleznete v tématu projektu Austin část 2 ze 6: stránky kulmy
Viz také
Referenční dokumentace
/Qpar (automatický modul pro paralelní zpracování)
/Qpar-report (úroveň sestav s automatickou vektorizací)
/Qvec-report (Úroveň sestavy s automatickou vektorizací)