Question

J'ai lu dans la documentation Visual C ++ qu'il est sûr pour plusieurs threads de lire le même objet.

Ma question est: comment une CPU x86-64 avec plusieurs noyaux gérer cette

Disons que vous avez un bloc de 1 Mo de mémoire. Sont différents fils littéralement capable de lire exactement les mêmes données en même temps ou carottages lire un mot à la fois avec un seul noyau autorisé à lire un mot à la fois?

Était-ce utile?

La solution

Non seulement les différents noyaux autorisés à lire à partir du même bloc de mémoire, ils sont autorisés à écrire en même temps aussi. S'il est « sûr » ou non, c'est une toute autre histoire. Vous devez mettre en œuvre une sorte de garde dans votre code (généralement fait avec sémaphores ou de les dérivés) pour se prémunir contre plusieurs noyaux de combat sur le même bloc de mémoire d'une manière que vous n'autorisent expressément.

A propos de la taille de la mémoire d'un noyau se lit à la fois, qui est généralement la valeur d'un registre de 32 bits sur un processeur 32 bits, 64 bits pour un processeur 64 bits et ainsi de suite. Même le streaming se fait par dword dword (regardez memcpy par exemple).

A propos de la façon dont les noyaux multiples simultanées sont en réalité, chaque noyau utilise un seul bus à lire et à écrire dans la mémoire, de sorte que l'accès à toutes les ressources (RAM, des dispositifs externes, l'unité de traitement à virgule flottante) est une requête à la fois, un noyau à la fois. Le traitement réel à l'intérieur du noyau est cependant tout à fait en même temps. les transferts DMA également ne pas bloquer le bus, les transferts simultanés se mis en attente et traitées une à la fois (je crois, pas 100% sûr à ce sujet).

edit: juste pour préciser, contrairement à l'autre réponse ici, je ne parle que d'un scénario sans cache. Bien sûr, si la mémoire est mise en mémoire cache l'accès en lecture seule est tout à fait en même temps.

Autres conseils

S'il y a vraiment écrit pas dans votre bloc de 1Mo alors oui, chaque noyau peut lire à partir de sa propre ligne de cache sans aucun problème, car aucune écriture sont commises et donc aucun problème de cohérence de cache se posent.

Dans une architecture multi-cœurs, au fond il y a un cache pour chaque noyau et un « cache protocole cohérence » qui annule le cache sur certains noyaux qui n'ont pas la plupart des informations à jour. Je pense que la plupart des processeurs mettent en œuvre le protocole MOESI pour la cohérence du cache.

Cache est la cohérence d'un sujet complexe qui a été largement discuté (je aime spécialement certains articles de Joe Duffy ici et ). La discussion tourne néanmoins autour des pénalités de performance possibles du code qui, tout en étant verrouiller apparemment libre, peut ralentir en raison du protocole de cohérence de cache coups de pied pour maintenir la cohérence dans les caches des processeurs, mais, tant qu'il n'y écrit pas il n'y a tout simplement pas pour maintenir et cohérence donc pas perdu sur la performance.

Juste pour clarifier, comme dit dans le commentaire, la RAM ne peut pas être accessible simultanément depuis les architectures x86 et x64 mettre en œuvre un seul bus qui est partagé entre les cœurs avec SMP garantissant l'équité l'accès à la mémoire principale. Néanmoins cette situation est cachée par chaque cache de base qui permet à chaque noyau d'avoir sa propre copie des données. Pour 1Mo de données, il serait possible d'engager sur une affirmation alors que le noyau de mettre à jour son cache, mais ce serait négligeable.

Quelques liens utiles:

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