1. 如何取得AMD CPU当前核心频率?
2. 如何读取AMD CPU内核温度?
2. 如何读取AMD CPU内核温度?
解决方案 »
- 怎样用Delphi读出Oracle某个数据库中所有的表,以及所有表的字段名称?
- 通过执行一个程序,如何屏蔽所有窗口的alt+f4关闭窗口功能.运行完此程序后自动隐藏.
- 为什么运行的时候QuickReport会提示Property UseStandardprinter does not exist的错误?
- delphi web编程的一个小问题
- 很简单的问题……可是我忘记怎么做了……
- 实验室排课问题
- 怎样让Delphi做出来的程序在任务栏上显示不止一个按钮?
- 如何判断?
- 怎么动态配置odbc?高手请进----
- 请问分页控件是什么名字,假如我需要分5页,这个5怎么设置?谢谢!!!
- 请高手帮帮我 运行正常 但关闭时会报错
- delphi开发系统托盘问题
仅使用CPUID或RDMSR等CPU内置功能实现。一些旧的CPU不支持没关系。
我有驱动文件,可以支持Ring0的代码。
但两个问题都解决了才兑现奖励,不要求两个问题是同一个人回答,即两个人各解决一个问题就各获得100元。
http://www.codefans.net/soft/3731.shtml
读取 ~MHz 这个键值 ,记住那键前有个~别忘了,在注册表的HKEY_LOCAL_MACHINE\Hardware\Description\System\CentralProcessor\0\~MHz //第一个cpu,
HKEY_LOCAL_MACHINE\Hardware\Description\System\CentralProcessor\1\~MHz1 //第二个cpu
http://www.cpuid-pro.com/sysinfo.php
它调用的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,别的都没问题
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页)
然后另外检测CPU的最大倍频和当前工作倍频,由此计算出当前实际核心频率。在Intel CPU是可以正确检测当前倍频及最大倍频的,但在AMD 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;呵呵,总感觉....