Quelle est la différence entre atome et de la critique en OpenMP?
Quelle est la différence entre atome et de la critique en OpenMP?
Je peux faire ce
#pragma omp atomic
g_qCount++;
mais n'est-ce pas le même que
#pragma omp critical
g_qCount++;
?
Vous devez vous connecter pour publier un commentaire.
L'effet sur g_qCount est le même, mais ce qui est fait est différent.
Un OpenMP section critique est complètement général il peut surround n'importe quel bloc de code. Vous payez le prix de la généralité, cependant, en engageant des frais généraux à chaque fois qu'un thread entre et sort de la section critique (sur le dessus du coût intrinsèque de la sérialisation).
(En plus, en OpenMP tous sans nom sections critiques sont considérées comme identiques (si vous préférez, il n'y a qu'un verrou pour tous sans nom sections critiques), de sorte que si un thread est dans un [sans nom] de la section critique comme ci-dessus, aucun fil ne peut entrer n'importe quel [sans nom] de la section critique. Comme vous pouvez le deviner, vous pouvez contourner ce problème en utilisant nommé sections critiques).
Une opération atomique a beaucoup moins de frais généraux. Lorsqu'ils sont disponibles, il prend l'avantage sur le matériel à fournir (dire) atomique opération d'incrémentation; dans ce cas, il n'y a pas de verrouillage/déverrouillage nécessaires sur l'entrée/la sortie de la ligne de code, il ne l'atomic incrément de laquelle le matériel dit que vous ne pouvez pas être entravé.
Les avantages sont que la surcharge est beaucoup plus faible, et un thread dans une opération atomique ne pas obstruer les (différents) opérations atomiques sur le point d'arriver. L'inconvénient, c'est le jeu restreint d'exploitation qui prend en charge atomique.
Bien sûr, dans les deux cas, les frais de sérialisation.
++
et*=
) et que si ils ne sont pas pris en charge dans le matériel, ils pourraient être remplacés par descritical
sections.En OpenMP, tous les sans nom sections critiques sont mutuellement exclusifs.
La différence la plus importante entre critique et atomic atomic peut protéger qu'une seule assignation et vous pouvez l'utiliser avec des opérateurs spécifiques.
Section critique:
Peut être étendue à serialise groupes de blocs avec une bonne utilisation de la balise "name".
Plus lent!
Opération atomique:
Est beaucoup plus rapide!
Assure la sérialisation d'une opération particulière.
Le moyen le plus rapide est ni critique ni atomique. Environ, plus avec de la section critique est 200 fois plus cher que le simple ajout, atomique plus est 25 fois plus cher qu'une simple addition.
L'option la plus rapide (pas toujours le cas) est de donner à chaque fil de son propre compteur et faire réduire opération lorsque vous avez besoin de la somme totale.
Les limites de
atomic
sont importantes. Ils doivent être précisés sur le OpenMP specs. MSDN donne une feuille de triche que je ne serais pas surpris si cela ne changera pas. (Visual Studio 2012 a une OpenMP mise en œuvre à partir de Mars 2002.) Pour citer MSDN:Je recommande d'utiliser
atomic
quand vous pouvez et nommé sections critiques autrement. Nommer, c'est important; vous éviterez le débogage des maux de tête de cette façon.Déjà de grandes explications ici. Cependant, on peut plonger un peu plus profond. Pour comprendre la différence essentielle entre la atomique et section critique concepts en OpenMP, nous devons comprendre le concept de de verrouillage premier. Nous allons examiner pourquoi nous avons besoin d'utiliser serrures.
Pour synchroniser les threads d'un programme multi-threadé, nous allons utiliser de verrouillage. Lorsque l'accès est nécessaire pour être restreinte que par un seul thread à la fois, de verrouillages entrent en jeu. Le de verrouillage concept de mise en œuvre peuvent varier d'un processeur processeur. Découvrez comment un simple verrou peut travailler à partir d'un algorithme de point de vue.
L'algorithme peut être mis en œuvre dans le matériel et la langue comme suit. Nous allons être en supposant un seul processeur et d'analyser le comportement des verrous dans la que les. Pour cette pratique, supposons un des processeurs suivants: MIPS, Alpha, BRAS ou Puissance.
Ce programme semble être OK, mais Il ne l'est pas. Le code ci-dessus souffre du problème précédent; synchronisation. A nous de trouver le problème. Supposons que la valeur initiale de la serrure à zéro. Si deux threads d'exécuter ce code, on peut atteindre le SW R1, verrouillage avant l'autre, on lit le de verrouillage variable. Par conséquent, les deux d'entre eux pense que le de verrouillage est gratuit.
Pour résoudre ce problème, il y a un autre enseignement, plutôt que de simples LW et SW. Il est appelé Lecture-modification-Écriture instruction. C'est un complexe d'instruction (composé de subinstructions) qui en assure le acquisition de verrou procédure est effectué uniquement par un unique thread à la fois. La différence de Lecture-modification-Écriture par rapport à la simple Lire et Écrire instructions, c'est qu'il utilise un autre moyen de Chargement et Stockage. Il utilise LL(Charge Liée) à la charge de la serrure variable et SC(Magasin Conditionnelle) pour écrire dans la serrure de la variable. Un supplément de Lien s'Inscrire est utilisée pour assurer la procédure de verrouillage de l'acquisition est faite par un seul thread. L'algorithme est donné ci-dessous.
Lorsque le lien de registre est remis à zéro, si un autre thread a assumé la serrure pour être libre, il ne sera pas en mesure d'écrire la valeur incrémentée à nouveau le verrou. Ainsi, la simultanéité de l'accès à la de verrouillage variable est acquis.
La principale différence entre critique et atomique vient de l'idée que:
À l'aide d'un nouveau variable pour serrures conduira à section critique, tout en utilisant la réelle variable comme un verrou conduire à atomique concept. La section critique est utile lorsque nous sommes effectuer un grand nombre de calculs (plus d'une ligne) sur la variable réelle. C'est parce que, si le résultat de ces calculs ne parvient pas à être écrite sur la variable réelle, l'ensemble de la procédure doit être répétée pour calculer les résultats. Cela peut conduire à une baisse de performance par rapport à l'attente de la libération du verrou avant d'entrer dans une très-calcul de la région. Ainsi, il est recommandé d'utiliser le atomique directive, chaque fois que vous souhaitez effectuer un calcul unique (x++, x--, + x, - x, etc.) et l'utilisation critique directive lorsque plus de calculs complexes de la région qui est fait par l'intensif section.
atomique est relativement performance efficace lorsque vous avez besoin pour permettre d'exclusion mutuelle pour une seule instruction similaire n'est pas vrai sur omp critique.
atomique est une simple déclaration de la section Critique, c'est à dire vous de verrouillage pour une exécution de l'instruction
section critique est un verrou sur un bloc de code
Un bon compilateur va traduire votre deuxième code de la même manière que la première