如何检测当前的RAM配置?我需要向windows询问RAM当前是在单通道,双通道还是四通道运行。
我搜索了很多,在这个或其他网站上没有找到任何类似的问题,这对我来说非常令人惊讶。
我正在使用C++
,但这个问题确实适用于所有编程语言,因为它涉及到什么是Windows函数或powershell
/ cmd
命令会给我我需要的信息。
答案 0 :(得分:5)
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
加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.
请注意,interleave是“共享共享”这个类似于现在的多频道的奇特词汇,但它不是一回事。来自wiki上的交错记忆:
它与多通道存储器架构不同,主要是 交错存储器不会在主存储器之间添加更多通道 和内存控制器。但是,信道交织也是如此 可能... []
使用这个,我将分享使用cmd.exe在双通道中有4个RAM棒的样子:
编辑:有些人确认这些值在某些计算机上运行正常,但往往会返回令人费解的/无意义的值。
答案 1 :(得分:0)
查看SMBIOS规范:System Management BIOS (SMBIOS) Reference Specification。实际上,最新版本的日期是2018年5月14日。
第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数据并构建一个如上所示的简单表格。方法如下:SMBIOS Demystified
此外,我相信你无法对真正有效的频道速度做进一步的假设。您可能需要收集有关每个DIMM模块速度的其他信息。
恕我直言,发布此类任务的源代码远远超出了当前的问题范围,因此有一些链接:关于该主题的最佳参考是dmidecode但是,因为我对Delphi感觉很好,我会我更喜欢看这篇Delphi / FPC帖子:Reading the SMBios Tables using Delphi。