Plusieurs processeurs / cœurs peuvent-ils accéder simultanément à la même RAM?

15

C'est ce que je suppose qui arriverait:

  1. Si deux cœurs tentaient d'accéder à la même adresse dans la RAM, l'un devrait attendre que l'autre accède à la RAM. La deuxième fois que chaque cœur essaiera d'accéder à la même adresse, il se peut qu'il ait toujours cette mémoire cache en cache, afin qu'il puisse accéder simultanément à leurs caches respectifs .

  2. Si deux cœurs tentaient d'accéder à des adresses différentes dans la même RAM, l'un devrait attendre que l'autre accède à la RAM.

En d'autres termes, j'imagine que pour les tâches de programmation gourmandes en RAM, le multitraitement n'aidera pas beaucoup à moins qu'il implique la lecture de la même adresse dans la RAM plusieurs fois par cœur.

Ainsi, plusieurs processeurs / cœurs peuvent-ils accéder simultanément à la même RAM, ou ce que je dis est-il correct?

Hobbit perdu
la source
Je ne peux pas parler du niveau matériel auquel vous faites référence, mais je peux dire que les tâches gourmandes en RAM peuvent être facilitées par le multitraitement en divisant simplement l'utilisation; c'est-à-dire que si vous avez 500 Mo de données dans le RAM que vous devez traiter, donnez 250 Mo de ces données / RAM à un proc et 250 Mo à un autre et vous avez effectivement doublé votre débit possible (les restrictions de bande passante du RAM nonobstant ). En plus de savoir si le matériel peut le faire ou non, avoir plusieurs processeurs accédant à la même adresse RAM est vraiment une mauvaise idée, et la plupart des codes multi-proc essaient minutieusement de l'éviter.
Jimmy Hoffa
1
@JimmyHoffa Mais les restrictions de bande passante RAM sont précisément ce dont il parle (car l'hypothèse est que la tâche est liée à la mémoire).
@Jimmy Je ne vois aucun problème avec deux processeurs essayant de lire à partir de la même adresse RAM. Je ne verrais un problème que s'ils essayaient d'y écrire en même temps.
Lost Hobbit
1
dans un processeur multicœur particulier avec lequel je travaillais, les cœurs ne «savaient» rien au-delà de leurs caches locaux; tout ce qui devait se synchroniser avec le cache partagé se faisait de manière transparente pour ceux-ci dans un nombre spécifié de cycles de processeur; programmeur prêt à prendre cela en compte vient d'ajouter manuellement la quantité nécessaire de nops dans leur code d'assemblage
gnat
2
Réponse courte: dépend de l'architecture de votre bus système, du protocole de cohérence du cache, du nombre de ports de votre contrôleur DDR et du nombre de contrôleurs DDR. La réponse longue se trouve dans la fiche technique de votre système.
SK-logic

Réponses:

11

Résumé: il est généralement possible qu'un seul cœur sature le bus mémoire si l'accès à la mémoire est tout ce qu'il fait.

Si vous établissez la bande passante mémoire de votre machine, vous devriez être en mesure de voir si un processus monothread peut vraiment y parvenir et, sinon, comment l'utilisation efficace de la bande passante dépend du nombre de processeurs.


Les détails dépendront de l'architecture que vous utilisez. En supposant quelque chose comme SMP et SDRAM modernes:

  1. Si deux cœurs tentaient d'accéder à la même adresse en RAM ...

    pourrait aller de plusieurs façons:

    • ils veulent tous deux lire simultanément:

      • deux cœurs sur la même puce partageront probablement un cache intermédiaire à un certain niveau (2 ou 3), donc la lecture ne sera effectuée qu'une seule fois. Dans une architecture moderne, chaque cœur peut être en mesure d'exécuter des µ-op à partir d'un ou plusieurs pipelines jusqu'à ce que la ligne de cache soit prête
      • deux cœurs sur des puces différentes peuvent ne pas partager un cache, mais doivent tout de même coordonner l'accès au bus: idéalement, quelle que soit la puce qui n'a pas émis la lecture, elle espionne simplement la réponse
    • s'ils veulent tous les deux écrire:

      • deux cœurs sur la même puce écriront simplement dans le même cache, et cela ne doit être vidé qu'une seule fois dans la RAM. En fait, puisque la mémoire sera lue et écrite dans la RAM par ligne de cache, les écritures à des adresses distinctes mais suffisamment proches peuvent être fusionnées en une seule écriture sur la RAM

      • deux cœurs sur des puces différentes ont un conflit, et la ligne de cache devra être réécrite dans la RAM par chip1, récupérée dans le cache de chip2, modifiée puis réécrite (aucune idée si l'écriture / récupération peut être fusionnée par espionnage)

  2. Si deux cœurs tentaient d'accéder à des adresses différentes ...

    Pour un seul accès, la latence CAS signifie que deux opérations peuvent potentiellement être entrelacées pour ne pas prendre plus de temps (ou peut-être seulement un peu plus longtemps) que si le bus était inactif.

Inutile
la source
Un autre élément de la liste est lorsqu'un cœur lance un transfert DMA tandis qu'un autre cœur pique sur la zone cible.
ott--
7

Ainsi, plusieurs processeurs / cœurs peuvent-ils accéder simultanément à la même RAM, ou ce que je dis est-il correct?

Il existe de nombreuses architectures de machines différentes, chacune avec son propre ensemble de fonctionnalités. Une catégorie de machines multitraitement est appelée MISD , pour les données uniques à instructions multiples, et ces machines sont conçues pour fournir les mêmes données à plusieurs processeurs en même temps. Une classe connexe de machines connues sous le nom d' architectures SIMD (Single Instruction Multiple Data) sont beaucoup plus courantes et permettent également d'accéder à la même mémoire en même temps, mais la mémoire contient des instructions au lieu de données. Dans MIMD et SIMD, «accès» signifie accès en lecture - vous pouvez imaginer le problème que vous auriez si deux unités tentaient d'écrire au même endroit en même temps!

Caleb
la source
3

Bien que la plupart des réponses approchent du côté du modèle logiciel et / ou matériel, la façon la plus propre est de considérer le fonctionnement des puces de RAM physiques. (Le cache est situé entre le processeur et la mémoire, et utilise simplement le même bus d'adresse, et son fonctionnement est complètement transparent pour le processeur.) Les puces RAM ont un décodeur d'adresse unique, qui reçoit l'adresse de la cellule de mémoire, arrivant sur le bus d'adresse (et de même un bus de données, soit en entrée, soit en sortie). Les mémoires actuelles sont construites selon "l'approche à processeur unique", c'est-à-dire qu'un processeur est connecté via un bus à une puce de mémoire. En d'autres termes, il s'agit du "goulot d'étranglement de von Neumann", car chaque instruction doit faire référence à la mémoire au moins une fois. Pour cette raison, sur un fil (ou des fils, alias bus), un seul signal peut exister à la fois, de sorte que la puce RAM peut recevoir une adresse de cellule à la fois. Tant que vous ne pouvez pas vous assurer que les deux cœurs mettent la même adresse sur le bus d'adresses, l'accès simultané au bus par deux pilotes de bus différents (comme les cœurs) n'est physiquement pas possible. (Et, si c'est la même chose, c'est redondant).

Le reste est la soi-disant accélération matérielle. Le bus de cohérence, le cache, l'accès SIMD, etc. ne sont que quelques belles façades devant la RAM physique, votre question portait sur. Les accélérateurs mentionnés peuvent couvrir la lutte pour l'utilisation exclusive du bus d'adresse, et les modèles de programmation n'ont pas grand-chose à voir avec votre question. A noter également que l'accès simultané serait également contre l'abstraction "espace d'adressage privé".

Donc, à vos questions: l'accès direct direct à la RAM n'est pas possible, ni avec la même, ni avec des adresses différentes. L'utilisation du cache peut couvrir ce fait et peut permettre un accès apparemment simultané dans certains cas. Cela dépend du niveau et de la construction du cache, ainsi que de la localisation spatiale et temporelle de vos données. Et oui, vous avez raison: le traitement multi (cœur) sans accès amélioré à la RAM, n'aidera pas beaucoup les applications gourmandes en RAM.

Pour une meilleure compréhension: rappelez simplement le fonctionnement de Direct Memory Access. Le CPU et le périphérique DMA peuvent tous deux mettre une adresse sur le bus, de sorte qu'ils doivent s'exclure mutuellement de l'utilisation simultanée du bus.

katang
la source
1

Vous ne vous souciez pas de la RAM physique, vous vous souciez plus de la mémoire virtuelle et de l' espace d'adressage des processus ou des threads (tous les threads du même processus partagent un espace d'adressage commun) dans la pratique.

Bien sûr, si vous codez un noyau de système d'exploitation multicœur, vous vous souciez beaucoup de la RAM et de la cohérence du cache.

La plupart des processeurs multicœurs ont une certaine forme de mécanisme de cohérence de cache . Les détails sont spécifiques au processeur. Étant donné que le processeur utilise des caches CPU , ils se comportent parfois comme si plusieurs cœurs du processeur accèdent simultanément au même emplacement mémoire.

Les normes récentes des langages industriels comme C11 ou C ++ 11 en ont (compatible multi-thread) modèle de mémoire ( .

Basile Starynkevitch
la source
0

Les processeurs modernes sont physiquement liés à leurs périphériques de mémoire externe afin d'obtenir une bande passante de transfert de données maximale. Cela est dû aux exigences d'intégrité du signal (longueur de trace, terminaison, décalage d'horloge, etc.) nécessaires pour maintenir les taux de transfert élevés. Par exemple, sur une carte mère multi-CPU, chaque CPU dispose d'un ensemble dédié d'emplacements DIMM. Indépendamment de ce que les programmeurs de logiciels pourraient penser, un processeur ne peut pas simplement accéder aux données de mémoire externe d'un autre processeur. Le logiciel de gestion de la mémoire d'un système, que ce soit au niveau du noyau du système d'exploitation, de l'hyperviseur, des cœurs de plan de données ou autrement, gère le transfert de données de mémoire entre les processeurs.

Jeff Brower
la source
1
ce post est assez difficile à lire (mur de texte). Cela vous dérangerait de le modifier sous une meilleure forme?
moucher