1. 如何取得AMD CPU当前核心频率?
2. 如何读取AMD CPU内核温度?

解决方案 »

  1.   

    人民币奖励200元,每个问题100元。
    仅使用CPUID或RDMSR等CPU内置功能实现。一些旧的CPU不支持没关系。
    我有驱动文件,可以支持Ring0的代码。
    但两个问题都解决了才兑现奖励,不要求两个问题是同一个人回答,即两个人各解决一个问题就各获得100元。
      

  2.   

    第2个问题解决了。
    http://www.codefans.net/soft/3731.shtml
      

  3.   

    直接注册表中读cpu频率吧:
    读取 ~MHz 这个键值 ,记住那键前有个~别忘了,在注册表的HKEY_LOCAL_MACHINE\Hardware\Description\System\CentralProcessor\0\~MHz  //第一个cpu,
    HKEY_LOCAL_MACHINE\Hardware\Description\System\CentralProcessor\1\~MHz1 //第二个cpu
      

  4.   

    CUPID好像解决了,他要钱的,给你个网址
    http://www.cpuid-pro.com/sysinfo.php
      

  5.   

    你给的那个demo里不就有个 GetCPUSpeed 返回当前频率么?
    它调用的ReadTimeStampCounter里写的
      DW  $310F
    指令其实就是 RDTSC(0F31h),cpuid指令是得不到频率的,具体可以参考AMD的26094手册:
    BIOS and Kernel Developer's Guide for AMD Athlon™ 64 and AMD Opteron™ Processors不过那个demo里有一个小错误
      Ticks := (T1 - T0) / CountFreq * 1000000;
    因为是MHz,所以他少写了一个0,别的都没问题
      

  6.   

    AMD的cpu手册都可以在它的主页里免费下载:
    http://developer.amd.com/documentation/guides/Pages/default.aspx
    其中 BIOS and Kernel Developer's Guide 是和获得cpu信息有关的
    有关RDTSC指令的使用在24593手册(AMD64 Architecture Programmer's Manual Volume 2: System Programming Rev 3.14)中13.3.4节正文346页(全文390页)
      

  7.   

    那个程序里的GetCPUSpeed获取的是CPU处于全速工作时的频率,即工作在最大倍频状态。
    然后另外检测CPU的最大倍频和当前工作倍频,由此计算出当前实际核心频率。在Intel CPU是可以正确检测当前倍频及最大倍频的,但在AMD CPU上不正确。注册表里的那个速度也是固定的最大倍频状态下的速度。
      

  8.   

    过来接点分。//获得CPU主频
    function GetCPUSpeed:Double;
    const
      DelayTime=500;   //   measure   time   in   ms
    var
      TimerHi,TimerLo   :   DWORD;
      PriorityClass,   Priority   :   Integer;
    begin
      PriorityClass:=GetPriorityClass(GetCurrentProcess);
      Priority:=GetThreadPriority(GetCurrentThread);
      SetPriorityClass(GetCurrentProcess,REALTIME_PRIORITY_CLASS);
      SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
      Sleep(10);  asm
       dw   310Fh   //   rdtsc
       mov   TimerLo,   eax
       mov   TimerHi,   edx
      end;  Sleep(DelayTime);
      asm
        dw   310Fh   //   rdtsc
        sub   eax,   TimerLo
        sbb   edx,   TimerHi
        mov   TimerLo,   eax
        mov   TimerHi,   edx
      end;  SetThreadPriority(GetCurrentThread,Priority);
      SetPriorityClass(GetCurrentProcess,PriorityClass);  Result:=TimerLo/(1000.0* DelayTime);
    end;呵呵,总感觉....