Как я могу спросить окна о том, работает ли ОЗУ в одном, двух или четырехканальном канале?

Как определить текущую конфигурацию RAM? Мне нужно спросить о том, работает ли ОЗУ в одном, двух или четырехканальном канале.

Я много искал и не нашел похожих вопросов на тех или иных сайтах, что для меня удивительно.

Я работаю с C++, но этот вопрос действительно относится ко всем языкам программирования так же, как и о том, какие функции Windows или команда powershell/cmd предоставят мне необходимую мне информацию.

Ответ 1

InterleavePosition - это то, что вы ищете. Один из них составил 2,2,2 потому что он запускал 3 палочки в двухканальном режиме. Что вам нужно выяснить, так это то, как определить машину, работающую на одном канале, чтобы вы могли использовать вывод этой команды:

wmic memorychip get InterleavePosition

Редактировать: На самом деле не уверен в двойном канале с 3 палочками. Некоторые исследования показывают, что большинство материнских плат в настоящее время сделают странный один из одного канала.

Поэтому из MSDN это то, с чем мы должны работать, с точки зрения копания системной информации о чередующейся памяти.

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 который говорит следующее:

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.

Имейте в виду, что чередование - это причудливое слово для "совместного использования", которое похоже на многоканальное в настоящее время, но это не одно и то же. Из вики на чередующейся памяти:

Он отличается от многоканальных архитектур памяти, в первую очередь, поскольку чередующаяся память не добавляет больше каналов между основной памятью и контроллером памяти. Однако возможно чередование каналов... []

Используя это, я поделюсь тем, что похоже на наличие 4 RAM-палок в двух каналах с помощью cmd.exe:

example of dual channel memory output from wmic

Изменить: несколько человек подтвердили, что эти значения отлично работают на некоторых машинах, но слишком часто возвращают загадочные/бессмысленные значения.

Ответ 2

Посмотрите спецификации SMBIOS: Спецификация системного управления BIOS (SMBIOS). Фактически, последняя версия датирована 14 мая 2018 года.

Шаг 1: вам нужно прочитать Current Interleave из 7.6 Memory Controller Information (Type 5) для более старых версий, а затем следовать указаниям о том, как читать новейшие структуры.

Шаг 2: вам нужно получить устройства памяти:

7.38 Memory Channel (Type 37)
Offset Name                   Length Value  Description
 06h   Memory Device Count(n)  BYTE  Varies Number of Memory Devices (Type 11h) that are 
                                            associated with this channel
                                            This value also defines the  number of 
                                            Load/Handle pairs that follow. 

Вы должны прочитать это устройство памяти Count(n) со связанными с ним каналами.

Шаг 3: все вместе. В итоге вы получите таблицу следующим образом:

Channel 1: DIMM #0
Channel 1: DIMM #1
Channel 2: DIMM #0
Channel 2: DIMM #1

К счастью, в спецификациях SMBIOS есть несколько примеров.

Например, посмотрите раздел 7.7.3 Memory subsystem:

04h ; 2-way interleave currently used

Поскольку спецификации часто меняются, а некоторые устарели, я не буду полагаться на какой-либо готовый Windows WMI/API. Лучший способ, который я могу вам предложить, - прочитать RAW SMBIOS DATA за один выстрел и построить простую таблицу, подобную той, что была выше. Вот как: SMBIOS Demystified

Более того, я считаю, что вы не можете делать никаких дальнейших предположений о реальной эффективной скорости канала. Возможно, вам потребуется собрать некоторую информацию о скорости каждого модуля DIMM.

IMHO, размещение исходного кода для такой задачи выходит далеко за пределы текущего вопроса, поэтому есть некоторые ссылки: лучшая ссылка на эту тему - dmidecode, но, поскольку я чувствую себя хорошо с Delphi, я бы предпочел посмотреть на эту Delphi/Сообщение FPC: чтение таблиц SMBios с использованием Delphi.