为什么ryzen上的p-state状态MSR没有变化?

时间:2017-12-20 18:10:01

标签: linux cpu hardware amd-processor power-saving

我正在尝试检测我的cpu的当前p状态。我注意到p-state状态MSR(C001_0063)总是在我的ryzen 1700x系统上返回2,即使核心显然不在该状态。我认为它曾用于我的主板附带的初始BIOS(v0403),但是 1 不再可以下载了。

我的cpu超频 2 到3.8GHz。我使用cpufreq-set来修正速度,并使用cpufreq-info来验证:

analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 4294.55 ms.
  hardware limits: 2.20 GHz - 3.80 GHz
  available frequency steps: 3.80 GHz, 2.20 GHz
  available cpufreq governors: ondemand, conservative, performance, schedutil
  current policy: frequency should be within 3.80 GHz and 3.80 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency is 3.80 GHz (asserted by call to hardware).

以下是一个小测试程序,显示核心#0的寄存器值,以及相对于P0状态的有效速度。需要root权限。对我来说,它会在负载下不断打印pstate: 2, speed: 99%

#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char** argv)
{
    uint64_t aperf_old = 0;
    uint64_t mperf_old = 0;
    int fd;

    fd = open("/dev/cpu/0/msr", O_RDONLY);
    uint64_t pstate_limits;
    pread(fd, &pstate_limits, sizeof(pstate_limits), 0xC0010061);
    printf("pstate ranges: %d to %d\n", (int)(pstate_limits & 0x07), (int)((pstate_limits >> 4) & 0x07));

    for(;;)
    {
        uint64_t pstate;
        uint64_t pstate_req;
        uint64_t aperf;
        uint64_t mperf;
        pread(fd, &pstate_req, sizeof(pstate_req), 0xC0010062);
        pread(fd, &pstate, sizeof(pstate), 0xC0010063);
        pread(fd, &aperf, sizeof(aperf), 0x000000E8);
        pread(fd, &mperf, sizeof(mperf), 0x000000E7);
        printf("pstate: %d, requested: %d", (int)(pstate & 0x07), (int)(pstate_req & 0x07));
        if (mperf_old != 0 && mperf_old != mperf)
        {
            printf(", speed: %d%%", (int)(100 * (aperf - aperf_old) / (mperf - mperf_old)));
        }
        putchar('\n');
        mperf_old = mperf;
        aperf_old = aperf;
        sleep(1);
    }
}

用于FX-8350的类似方法。我究竟做错了什么?测试结果也很受欢迎。

系统信息:

  • Cpu:ryzen 1700x,P0&amp; P1为3.8GHz 3 ,P2为2.2GHz
  • 主板:华硕Prime X370-A,bios 3401
  • 操作系统:debian 7.1,内核4.9.0

更新:我已更改代码以打印请求的pstate,并且该寄存器正在按预期更改。实际的CPU速度也在发生变化,各种基准测试证实了这一点。

1 由于某些不明原因,bios备份功能被禁用,因此在更新之前我无法复制。

2 当我有机会时,我会在默认情况下进行测试。

3 不知道为什么会重复。

1 个答案:

答案 0 :(得分:0)

这可能没有关系,但是我听说有人成功将Ryzen 7s替换为AMD,原因是p状态导致Unix或类似Unix的系统出现系统稳定性问题。尽管从有关此问题的评论中,尤其是从ASrock forum指向驱动程序/固件问题,我在其他地方已经读到AMD可能会对早期一批芯片承担一些责任。也就是说,根据我对P和C状态的了解,某些状态是由操作系统或主机转换环境请求的。那么可以从内部完成补丁吗?