HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0819
チャーくんCPUの「速度」を取得12未解決


チャーくん

リンク

2015/8/19(Wed) 17:29:14|NO.70922

この前は温度の取得について聞きましたが…
Windows8.1とか10をお使いの方はタスクマネージャーを見るとわかりますが、
なんと…CPUの「速度(今、何GHzで動いているか)」を読み取っています。
つまり、これをHSPで読み取りたいわけです。
わかるかた、よろしくお願いします。



この記事に返信する


チャーくん

リンク

2015/8/19(Wed) 17:47:18|NO.70925

調べると、http://uchukamen.com/WPF/ClockSpeed/Default.htmにたどり着きました。
…ソースコードもあるみたいなので、移植できる方、お願いします。
完全に他人任せで申し訳ありません……



b

リンク

2015/8/19(Wed) 18:09:27|NO.70927




チャーくん

リンク

2015/8/20(Thu) 12:11:21|NO.70944

b さん
掲示板も調べてみたのですが…
見落としていました。
見つけたサイトもご紹介いただいたスレッドも、CurrentClockSpeedを使っているので、
内容的には同じなのですが…
なぜか、MaxClockSpeedと同じ値になってしまいます。

ですが、タスクマネージャーの方は「速度」のところの表示も変化していて、
もっと速く取得ができている(0.5秒間隔)ので、もしかしたら
WMIを使っていないのかもしれません。


…それじゃあ、どうやってやってるんだろ…



くちくん

リンク

2015/8/20(Thu) 17:42:56|NO.70952

WMIまだよくわかんないんで適当に。
bさんのリンク先のモノから作り出しました。(というかすこしけずっただけ)
mod_wmi.zip リンク先からDLできます。
https://kie.nu/2GM8

WMI_CurrentClockSpeed.hsp に CurrentClockSpeedの場合のサンプル入れました。
タイトルバーに速度を表示します。
ざっと説明
関数
GetWMIData 配列変数,"Select * From Win32_Processor"(多分),"CurrentClockSpeed"(今回)

変数
data GetWMIDataの取得した値



チャーくん

リンク

2015/8/21(Fri) 19:44:58|NO.70977

くちくん さん
僕の環境では、なぜかCurrentClockSpeedで正しい値が取得できないようで、
MaxClockSpeedと同じになります。
でもWindowsのタスクマネージャーでは現在の周波数が表示されているので、
WMIを使っての取得ができないようです。

他の方法を探してみます。



inovia

リンク

2015/8/21(Fri) 20:19:46|NO.70978

http://www.02.246.ne.jp/~torutk/cxx/clock/cpucounter.html
RDTSC 命令を直接叩くしかないんじゃないかなと。
アセンブリやマシン語の知識が必要になりますが。



チャーくん

リンク

2015/8/22(Sat) 17:13:26|NO.70987

inova さん
げげっ マシン語!
とりあえず、RDTSC命令でCPUが起動してからのクロックした数が直接取得できる
…ということはわかったのですが、これを使って現在のクロック数を取得するには
どのようにすればよいのでしょうか?



inovia

リンク

2015/8/23(Sun) 01:36:33|NO.70992

RDTSC命令で取得できるかな?とこちらで試してみたところ、
標準のクロック数と同じになってしまいました。(WMIと同じ)

調べたところ、
http://www.4gamer.net/games/065/G006503/20090905001/
> 従来のIntel製CPUでは,動作クロックに同期している内部パフォーマンスカウンタ
> を,「RDTSC」命令を使って取得することにより,例えば「1秒間のカウント数」など
> から,動作クロック(=クロック周波数)を得ることができた。しかし,Core i7で
> は,Turbo BoostやEISTがどのような動作状態にあっても,内部パフォーマンスカウン
> タは,必ず規定のクロックでカウントアップする仕様に切り替えられた。

ということらしいです。
記事にはi7ってありますが、
Turbo BoostやEIST(SpeedStep)が有効なプロセッサであれば同じことかと。
RDTSC命令では最近のCPUだと正しく現在のクロック数が取得できなさそうです。



inovia

リンク

2015/8/23(Sun) 01:59:40|NO.70993

厳密には、Constant TSC/Invariant TSCをサポートしたCPUだと
RDTSC/RDTSCP命令では現在のクロック数が正しく取得できなさそうです。

「ベースクロック」と「クロック倍率」がわかれば、
「クロック周波数」が計算できるので、
「ベースクロック」と「クロック倍率」の取得方法がわかれば、
どうにかなりそうな感じ。



inovia

リンク

2015/8/23(Sun) 03:09:58|NO.70994

「クロック倍率」はMSRレジスタのIA32_PERF_STATUS(0x198)から、
「ベースクロック」はMSRレジスタの 0xCD から取得できる模様。

MSRレジスタの読み込みはRDMSR命令を使えば、できるようです。
ただし、RDMSR命令はRing0(特権モード)でないと実行できません。

※HSPなどの一般的なアプリケーションはRing3(ユーザーモード)で実行されています。
OSやデバイスドライバはRing0(カーネルモード)で実行されています。

・デバイスドライバ(カーネルモード)を作らないとRing0になれない
・64bit OSではドライバはデジタル署名が必要(とても値段が高い!)

はっきり言って敷居が高い感じです。

http://www.yamatyuu.net/computer/program/driver/rdmsrdrv64/index.html
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%97%E3%83%AD%E3%83%86%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
http://d.hatena.ne.jp/machi_pon/20090309/1236568289
https://github.com/SulkySoftware/MSRGetter.kext/blob/master/MSRGetter.c
http://d.hatena.ne.jp/Hossy/20110623/p1



skyblue

リンク

2015/8/23(Sun) 11:27:25|NO.70996

RDTSCPに関してはConstant TSC/Invariant TSC対応でも
性格に取得できたはずです。
理由としてはひとつは命令の順序の入れ替えが行われない事が保証されている事
二つ目は最新のCPUではCPU間で同期されているとか聞いた事があります



チャーくん

リンク

2015/8/23(Sun) 11:41:25|NO.70999

RDTSCで、一定時間ごとにどれだけクロックしたか、でクロック数を計算する
ということだったんですね。
まぁ、RDTSCはもともと時間を計る目的っぽいのでカウンタの変化が一定になるのは
当然といえば当然なんでしょうけどね…

ベースクロックとクロック倍率は、僕も考えていたのですが、
難しすぎてよくわかりませんでした。
つまり、金があればできんこともない…

ハードル越えに失敗してコケた状態ですね。
(さっき世界陸上でハードルやってた)



ONION software Copyright 1997-2023(c) All rights reserved.