タイトルの通りのことをするのにCLI環境で楽に実行できる方法を調べたのでメモ
必要
- intel CPU Sandy Bridge 以降
- intel以外のことは調べてないので不明
- msr-tools
- apt-get とかでインストールできる
- msrドライバ
-
/dev/cpu/*/msr
が存在しない場合はmodprobe msr
でロードする
-
読む
生値
sudo rdmsr 0x198 -u --bitfield 47:32
電圧[V]に変換
awk "BEGIN { print $(sudo rdmsr 0x198 -u --bitfield 47:32)/8192 }"
bc
でもいいけど、awk
のほうが確実にインストールされている気がする。
繰り返し読む
watch -n 1 'awk "BEGIN { print $(sudo rdmsr 0x198 -u --bitfield 47:32)/8192 }"'
やってること
CPUのMSR (Model Specific Register) レジスタのアドレス0x198は MSR_PERF_STATUS
という名前で、コア電圧がビット[47:32]に格納されている。これをrdmsr
コマンドで読み出し、読み出しやすいように変換する。
取説によると、
P-state core voltage can be computed by MSR_PERF_STATUS[37:32] * (float) 1/(2^13).
とのことなので、読みだした値を8192で割ってる。(↑[37:32]になってるけど多分誤植)
- 取説 : Intel 64 and IA-32 Architectures Software Developer’s Manual
ただし、このレジスタの[47:32]ビットの定義があるのはSandy Bridgeのテーブル2-20だけで、他の世代については記載がない。取説によるとMSR_hogeは世代ごとに定義されるものなので、上書きされる可能性はある。現に、Core世代(core2duoとかの)では、ビット[46,44:40]はそれぞれ別の定義が存在する。
これについてSandy Bridge以降の世代のCPUで読んだ場合に値が保証されるのか調べたものの、解釈が割れておりよくわからなかった。ただし、上書き定義も無い。手持ちのKaby Lakeではそれっぽい値が読めてる。
もっと確実な方法があったら教えて下さい。