C'est ce que je suppose qui arriverait:
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 .
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?
la source
nop
s dans leur code d'assemblageRéponses:
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:
pourrait aller de plusieurs façons:
ils veulent tous deux lire simultanément:
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)
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.
la source
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!
la source
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.
la source
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 ( .
la source
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.
la source