Question

Avec un processeur single-core, où tous vos fils sont exécutés à partir d'un seul PROCESSEUR, l'idée de la mise en œuvre d'une section critique à l'aide d'un test atomique-et-opération définie sur certains mutex (ou sémaphore ou etc) dans la mémoire semble assez simple;parce que votre processeur est en cours d'exécution d'un test-and-set à partir d'un seul endroit, dans votre programme, on nécessairement pouvez pas être en train de faire un à partir d'un autre endroit dans votre programme déguisé comme un autre thread.

Mais ce qui arrive quand vous n'avez en fait avoir plus d'un processeur physique?Il semble que le simple niveau de l'instruction atomicité ne serait pas suffisant, b/c avec deux processeurs potentiellement en cours d'exécution de leur test-and-set opérations en même temps, ce que vous avez vraiment besoin de maintenir l'atomicité est l'accès à la mémoire partagée pour l'emplacement du mutex.(Et si la mémoire partagée emplacement est chargé dans le cache, il y a l'ensemble de la cache de la cohérence de chose à gérer, trop..)

Cela semble comme il l'aurait fait subir beaucoup plus de ressources que le single core cas, voici donc la viande de la question:Combien pire est-il?Est-ce pire?- Nous venons de vivre avec elle?Ou de pas de côté par l'application d'une politique que tous les threads au sein d'un groupe de processus ont à vivre sur le même noyau physique?

Était-ce utile?

La solution

Multi-core/les systèmes SMP ne sont pas seulement de plusieurs Cpu collées ensemble.Il y a un soutien explicite de faire les choses en parallèle.Toutes les primitives de synchronisation sont mis en œuvre avec l'aide de matériel le long des lignes de atomique CAS.L'instruction soit verrouille le bus partagé par des Processeurs et de la mémoire du contrôleur (et les dispositifs qui ne DMA) et les mises à jour de la mémoire, ou tout simplement les mises à jour de la mémoire en s'appuyant sur cache snooping.Ceci provoque à son tour de cohérence de cache algorithme pour le coup en forçant toutes les parties concernées pour vider leurs caches.

Avertissement - ce qui est très description de base, il y a plus de choses intéressantes ici comme virtual vsphysique du cache, cache write-back des politiques, des modèles de mémoire, des clôtures, etc.etc.

Si vous voulez en savoir plus sur comment se peut l'utilisation de ces matériels et installations - voici un excellent livre sur le sujet.

Autres conseils

Le fournisseur de CPUs multi-core doit veiller à ce que les différents noyaux se coordonnent lors de l'exécution des instructions qui garantissent l'accès à la mémoire atomique.

sur les puces Intel par exemple, vous avez l'instruction de « cmpxchg ». Il compare la valeur stockée à un emplacement de mémoire à une valeur attendue et échange pour la nouvelle valeur si les deux correspondent. Si vous le faites précéder l'instruction « de verrouillage », il est garanti atomique par rapport à tous les cœurs.

Vous auriez besoin d'un test et ensemble qui force le processeur pour informer tous les autres noyaux de l'opération afin qu'ils soient au courant. Oui, qui introduit une surcharge et vous devez vivre avec. Il est une raison de concevoir des applications multithread de telle sorte qu'ils ne sont pas attendre pour les primitives de synchronisation trop souvent.

  

Ou la contourner en appliquant une politique que tous les threads au sein d'un groupe de processus doivent vivre sur le même noyau physique?

qui annulerait le tout point de multithreading. Lorsque vous utilisez un verrou, sémaphores, ou d'autres techniques de synchronisation, vous comptez sur OS pour vous assurer que ces opérations sont enclenchés, peu importe combien de cœurs que vous utilisez.

Le temps de passer à un autre thread après un verrou a été libéré est principalement déterminé par le coût d'un changement de contexte. Cette SO offres de fil avec le contexte de commutation au-dessus, de sorte que vous pourrait vouloir vérifier.

Il y a quelques autres sujets intéressants aussi:

Vous devriez lire cet article MSDN aussi: Comprendre l'impact du bas-Lock techniques dans multithread Apps .

accès à la mémoire sont traitées par le contrôleur de mémoire qui doit prendre soin de problèmes multi-coeur, à savoir il ne doit pas permettre un accès simultané aux mêmes adresses (probablement traités soit par la page de mémoire ou la ligne de base de la mémoire). Vous pouvez donc utiliser un drapeau pour indiquer si un autre processeur est mise à jour le contenu de la mémoire de certains blocs (ceci pour éviter un type de lecture sale où une partie du dossier est mis à jour, mais pas tous).

Une solution plus élégante consiste à utiliser un bloc sémaphore HW si le processeur a une telle caractéristique. Un sémaphore HW est un simple file d'attente, qui pourrait être d'une taille no_of_cores -1. Voici comment il est dans le processeur 6487/8 de TI. Vous pouvez interroger directement la sémaphores (et la boucle jusqu'à ce qu'il soit libéré) ou faire une requête indirecte qui entraînera une interruption une fois que votre cœur obtient la ressource. Les demandes sont mises en attente et servis dans l'ordre où ils ont été faits. Une requête est une opération de sémaphore atomique.

cohérence du cache est une autre question et vous pourriez avoir besoin de faire de cache et réécritures rafraîchit dans certains cas. Mais ceci est une implémentation très cache chose spécifique. Avec 6487/8 nous avions besoin de le faire sur quelques opérations.

Eh bien, selon le type d'ordinateurs que vous avez autour de la pose de la maison, procédez comme suit: Ecrire une application multithread simple. Exécutez cette application sur un noyau unique (Pentium 4 ou Core Solo), puis l'exécuter sur un processeur multi-cœurs (Core 2 Duo ou similaire) et de voir la taille de la Accélérez est.

Certes ce sont des comparaisons injustes depuis les Pentium 4 et Core Solo sont beaucoup plus lents indépendamment de noyaux qu'un Core 2 Duo. Peut-être comparer entre un Core 2 Duo et Core 2 Quad avec une application qui peut utiliser 4 ou plusieurs threads.

Vous soulevez un certain nombre de points valides. processeurs Muliple introduisent beaucoup de maux de tête et les frais généraux. Cependant, nous avons juste à vivre avec eux, parce que l'augmentation de la vitesse du parallélisme peut bien les emporter, si les sections critiques sont faites assez longtemps.

Quant à votre dernière suggestion d'avoir toutes les discussions sur le même noyau physique, que les défaites complètement le point d'un ordinateur multi-core!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top