Comment détecter la configuration actuelle de RAM? Je dois demander à Windows si le RAM fonctionne actuellement sur un, deux ou quatre canaux.
J'ai fait beaucoup de recherches et je n'ai trouvé aucune question similaire sur ce site ou sur d'autres sites, ce qui est assez surprenant pour moi.
Je travaille avec C++
, mais cette question s’applique réellement à tous les langages de programmation de la même manière, car elle concerne la fonction Windows ou la commande powershell
/cmd
qui me donnera les informations dont j’ai besoin.
InterleavePosition
est ce que vous cherchez cependant. L'un d'entre eux s'appelle 2,2,2
car il utilise 3 sticks en double canal. Ce que vous devez savoir, c'est comment identifier une machine exécutant un canal unique afin de pouvoir utiliser le résultat de cette commande:
wmic memorychip get InterleavePosition
Edit : En fait, vous n'êtes pas sûr du double canal avec 3 sticks. Certaines recherches suggèrent que la plupart des cartes mères vont rendre l'intrus un canal unique.
Donc, à partir du MSDN, voici ce que nous devons faire pour extraire des informations système sur la mémoire entrelacée.
Position of the physical memory in an interleave. For example, in a 2:1 interleave, a value of "1" indicates that the memory is in the "even" position.
This property is inherited from CIM_PhysicalMemory.
0 - Noninterleaved
1 - First position
2 - Second position
Plus InterleaveDataDepth
qui dit ceci:
InterleaveDataDepth
Unsigned 16-bit integer maximum number of consecutive rows of data that are accessed in a single interleaved transfer from the memory device. If the value is 0 (zero), the memory is not interleaved.
Remarquez, l'entrelacement est un mot de fantaisie pour "partager mutuellement" qui ressemble au multicanal de nos jours, mais ce n'est pas la même chose. De wiki sur la mémoire entrelacée:
Elle est différente des architectures de mémoire multicanaux, principalement parce que la mémoire entrelacée N’ajoute pas de canaux supplémentaires entre la mémoire principale Et le contrôleur de mémoire. Toutefois, l’entrelacement des canaux est également Possible ... []
En utilisant ceci, je vais partager ce à quoi cela ressemble d'avoir 4 RAM sticks dans un canal double en utilisant cmd.exe:
Edit : Plusieurs personnes ont confirmé que ces valeurs fonctionnaient parfaitement sur certaines machines, mais renvoyaient trop souvent des valeurs déroutantes ou absurdes.
Examinez les spécifications SMBIOS: Spécification de référence SMBIOS (System Management BIOS) . En fait, la dernière version date du 14 mai 2018.
Étape 1: Vous devez lire le Current Interleave
de 7.6 Memory Controller Information (Type 5)
Nom du décalage Longueur Valeur Description 06h Nombre de périphériques de mémoire (n) BYTE Varie le nombre de périphériques de mémoire (type 11h) associés à ce canal Cette valeur définit également le nombre de périphériques de mémoire. Les paires charge/poignée qui suivent.
Vous devriez lire que les périphériques de mémoire Count(n)
avec leurs canaux associés.
Étape 3: tous ensemble, vous obtiendrez un tableau comme suit:
Channel 1: DIMM #0
Channel 1: DIMM #1
Channel 2: DIMM #0
Channel 2: DIMM #1
Heureusement, les spécifications SMBIOS contiennent quelques exemples.
Par exemple, regardez la section 7.7.3 Memory subsystem
Étant donné que les spécifications sont fréquemment sujettes à modification et que certaines sont obsolètes, je ne compterais pas sur une API WMI/Windows prête à l'emploi. Le meilleur moyen que je puisse vous suggérer est de lire les données RAW SMBIOS en une seule fois et de créer un tableau simple comme celui ci-dessus. Voici comment: SMBIOS Demystified
De plus, je crois que vous ne pouvez plus faire d’hypothèse sur la vitesse réelle du canal. Vous devrez peut-être rassembler certaines informations sur la vitesse de chaque module DIMM.
IMHO, poster le code source pour une telle tâche va bien au-delà de la question actuelle, il y a donc quelques liens: la meilleure référence à ce sujet est dmidecode mais, comme je me sens bien avec Delphi, je préférerais regarder à cet article Delphi/FPC: Lecture des tables SMBios à l’aide de Delphi .