C'est ce que je devinez se produirait:
Si deux cœurs essayaient d'accéder à l'adresse même dans la RAM, l'un devrait attendre pour que l'autre accède à la RAM. La seconde fois où chaque noyau essaierait d'accéder à la même adresse, ils peuvent toujours avoir cette RAM mise en cache, afin qu'ils puissent accéder à leurs caches simultanément).
Si deux cœurs tentaient d'accéder à des adresses différentes dans la même RAM, l'un devrait attendre pour que l'autre accède à la RAM.
En d'autres termes, j'imagine que pour RAM tâches de programmation intensives, le multitraitement n'aidera pas beaucoup à moins qu'il implique la lecture à partir de la même adresse dans RAM plusieurs fois par noyau.
Ainsi, plusieurs processeurs/cœurs peuvent-ils accéder au même RAM simultanément, ou ce que je dis est-il correct?
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, dans la négative, 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:
Si deux cœurs tentaient d'accéder à la même adresse dans RAM ...
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é que RAM une fois. En fait, puisque la mémoire sera lue et écrite dans 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 RAM par chip1, récupérée dans le cache de chip2, modifiée puis réécrite (aucune idée si la l'écriture/récupération peut être fusionnée en espionnant)
Si deux cœurs tentaient d'accéder à des adresses différentes ...
Pour un accès nique, 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.
Ainsi, plusieurs processeurs/cœurs peuvent-ils accéder au même RAM simultanément, 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 multiprocesseurs 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 de SIMD architectures (Single Instruction Multiple Data) sont beaucoup plus courantes et donnent également accès à 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 essayaient d'écrire au même endroit en même temps!
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 physiques RAM. (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.) RAM ont un seul décodeur d'adresse, qui reçoit l'adresse de la cellule de mémoire, arrivant sur le bus d'adresse ( et de la même manière un bus de données, entrant ou sortant). 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, ou bus), un seul signal peut exister à la fois, donc la puce RAM peut recevoir une seule adresse de cellule à la fois. Jusqu'à ce que vous puissiez vous assurer que les deux cœurs mettent la même adresse sur le bus d'adresse, le bus simultané ac physiquement impossible pour deux conducteurs de bus différents (comme les noyaux). (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 simultané RAM impossible, ni avec la même adresse 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 au niveau du cache et de la construction, ainsi que de la localisation spatiale et temporelle de vos données. Et oui, vous avez raison: traitement multi (core) sans accès amélioré RAM, n'aidera pas beaucoup la RAM) -applications intensives.
Pour une meilleure compréhension: rappelez simplement le fonctionnement de Direct Memory Access. Le CPU et le DMA périphérique peuvent mettre l'adresse sur le bus, donc ils doivent s'exclure mutuellement de l'utilisation simultanée du bus.
Vous ne vous souciez pas de la RAM physique, vous vous souciez plus de mémoire virtuelle et espace d'adressage de processus ou threads (tous les threads du même processus partagent un espace d'adressage commun) en pratique.
Bien sûr, si vous codez un noyau de système d'exploitation multicœur, vous vous souciez de RAM et de la cohérence du cache).
La plupart des processeurs multicœurs ont une certaine forme de mécanisme cohérence du cache . Les détails sont spécifiques au processeur. Étant donné que le processeur utilise CPU caches , ils se comportent parfois comme si plusieurs cœurs du processeur accèdent simultanément au même emplacement de mémoire.
Les normes récentes des langages industriels comme C11 ou C++ 11 en ont (compatible multi-thread) modèle de mémoire .
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 a 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 du plan de données ou autrement, gère le transfert de données de mémoire entre les processeurs.