Share via


Automatique Parallélisation et Auto - Vectorization

Auto - Parallelizer et auto - Vectorizer sont conçues pour fournir des gains de performance automatique pour les boucles dans votre code.

Auto - Parallelizer

Le commutateur de compilation d' /Qpar active la parallélisation automatique des boucles dans votre code.Lorsque vous spécifiez cet indicateur sans modifier votre code existant, le compilateur évalue le code pour rechercher les boucles peuvent bénéficier de la parallélisation.Étant donné qu'il peut rechercher les boucles qui n'exécutent pas beaucoup de travail et ne pas tireront parti de la parallélisation, et que chaque parallélisation inutile peut engendrer le frai d'un pool de threads, d'une synchronisation supplémentaire, ou d'une autre traitement qui tendraient à la lenteur d'exécution au lieu de l'améliorer, le compilateur registre est en sélectionnant les boucles qu'il parallélise.Par exemple, considérez l'exemple suivant dans lequel la limite supérieure de la boucle n'est pas connue au moment de la compilation :

void loop_test(int u) {
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

Étant donné qu' u peut être une petite valeur, le compilateur ne parallélisera pas automatiquement cette boucle.Toutefois, vous pouvez encore le souhaiter avez parallélisé car vous savez qu' u sera toujours grand.Pour activer l'automatique parallélisation, spécifiez boucle #pragma (hint_parallel (n)), où n est le nombre de threads à paralléliser incliné à.Dans l'exemple suivant, le compilateur tente de paralléliser la boucle entre 8 threads.

void loop_test(int u) {
#pragma loop(hint_parallel(8))
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

Comme avec tous les directives pragma, une autre syntaxe pragma __pragma(loop(hint_parallel(n))) est également prise en charge.

Il existe des boucles que le compilateur ne peut pas paralléliser même si vous le souhaitez.Voici un exemple :

#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
    A[i] = B[i] * C[i];

La fonction upper_bound() peut changer à chaque fois qu'il a appelé.Étant donné que la limite supérieure ne peut pas être connue, le compilateur peut émettre un message de diagnostic qui explique pourquoi il ne peut pas paralléliser la boucle.L'exemple suivant montre une boucle qui peut être parallélisée, une boucle qui ne peut pas être parallélisée, la syntaxe de compilateur à utiliser à l'invite de commandes, et le compilateur sortie pour chaque option de ligne de commande :

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;
    }
}

Compiler à l'aide de cette commande :

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1

référence cette sortie :

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized

Compiler à l'aide de cette commande :

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2

référence cette sortie :

--- 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'

Notez la différence dans la sortie entre les deux options différentes de /Qpar-report (Auto-Parallelizer Reporting Level) ./Qpar-report:1 affiche des messages de parallelizer uniquement pour les boucles qui sont correctement parallélisées./Qpar-report:2 affiche des messages de parallelizer pour les parallélisations réussies et infructueuses de boucle.

Pour plus d'informations sur les codes supplémentaires et des messages, consultez Vectorizer and Parallelizer Messages.

Auto - Vectorizer

Auto - Vectorizer analyse des boucles dans votre code, et utilise les registres vectoriels et les instructions dans votre ordinateur de les exécuter, si elle peut.Cela peut améliorer les performances de votre code.Le compilateur cible les instructions SSE2 dans Intel ou les processeurs AMD d', ou les instructions AU NÉON sur des processeurs de ARM.Auto - Vectorizer utilise également le plus récent, le jeu d'instructions SSE4.2 si vos aide informatiques -le.

Par défaut, auto - Vectorizer est activée.Si vous souhaitez comparer les performances de votre code sous le vectorization, vous pouvez utiliser boucle #pragma (no_vector) pour désactiver le vectorization d'une boucle donnée.

#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
   A[i] = B[i] + C[i];

Comme avec tous les directives pragma, une autre syntaxe pragma __pragma(loop(no_vector)) est également prise en charge.

Comme avec auto - Parallelizer, vous pouvez spécifier l'option de ligne de commande /Qvec-report (Auto-Vectorizer Reporting Level) d'enregistrer ou avec succès les boucles vectorisées uniquement**/Qvec-report:1ou avec succès et sans succès les boucles vectorisées/Qvec-report:2**).

Pour plus d'informations sur les codes supplémentaires et des messages, consultez Vectorizer and Parallelizer Messages.

Pour obtenir un exemple montrant comment le vectorizer fonctionne dans la pratique, consultez Partie d'Austin de projet de 6 : Bordage de page

Voir aussi

Référence

loop

/Qpar (paralléliseur automatique)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

Autres ressources

Programmation parallèle en code natif

Vectorizer and Parallelizer Messages