Core 2 Duoマシンのcpufreqによるクロック周波数制御
このCore 2 Duo E6600のPCはわりとつけっぱなしにするので、(FreeBSD)そのパソコン、無意味に熱くなってませんか? ――― CPUの消費電力を減らす方法を参考にいじって電力を調べることにした。
もともと、sysctlでは、
dev.cpu.0.freq: 2400となっていたが、書いてあるとおりにkldload cpufreqをすると、
dev.cpu.0.freq_levels: 2400/88000 1600/56000
dev.acpi_perf.0.freq_settings: 2400/88000 1600/56000
dev.cpu.0.freq: 2400となり、非常にキメ細かくコントロールできそうに見える。
dev.cpu.0.freq_levels: 2400/88000 2100/77000 1800/66000 1600/56000 1400/49000 1200/42000 1000/35000 800/28000 600/21000 400/14000 200/7000
dev.acpi_perf.0.freq_settings: 2400/88000 1600/56000
そこで実際に、dev.cpu.0.freqをいろいろいじって、本当に速度が変化しているか実測してみた。ベンチマークはmake -j4 buildkernel。まずは、cpufreqをロードする前の状態。
周波数設定 | ユーザCPU時間 | システムCPU時間 |
---|---|---|
2400 | 462 | 51 |
1600 | 461 | 53 |
次に、cpufreqをロードした後の状態。
周波数設定 | ユーザCPU時間 | システムCPU時間 |
---|---|---|
2400 | 462 | 51 |
2100 | 540 | 60 |
1800 | 645 | 72 |
1600 | Invalid argument | |
1400 | Invalid argument | |
1200 | 808 | 88 |
1000 | Invalid argument | |
800 | Invalid argument | |
600 | 1637 | 170 |
400 | Invalid argument | |
200 | Invalid argument |
つまり、cpufreqをロードしていない場合は周波数を設定しても無意味であり、ロードした後でもすべての周波数が設定できるとは限らない(Invalid argumentが出ても実はdev.cpu.0.freqの値は設定されてしまうが、設定するたびにバラバラの性能になる)。きちんと設定できていれば、性能はほぼ比例している。
続いてワットチェッカーで電力を調べた。
周波数設定 | アイドル時電力 | ピーク電力 |
---|---|---|
2400 | 102 | 148 |
2100 | 102 | 143 |
1800 | 102 | 140 |
1200 | 102 | 135 |
600 | 102 | 126 |
つまり、アイドル時電力は周波数とはまったく無関係であった。ピーク電力はそれなりに周波数に依存するが、全体に比べて大した差が出るわけでもない。
PCをほったらかしにしているようなアイドリング時に自動的に周波数を下げて消費電力を抑えてやろうと思っていたが、これではほとんど何の役にも立たないことになる。別の見方をすれば、最近のCPUの技術では、アイドリング時はあちこちのクロック(あるいは電源?)供給をカットして、止まっているのとほとんど同じにできるんだろうなと想像される。
とりあえずグラフ化してみた。
追記(2/26)
上のグラフを出すのにgnuplotに食わせたソース(自分用メモ):
set terminal png large
set output "cpufreq.png"
set xrange [0:2500]
set xlabel "Frequency (MHz)"
set yrange [0:1.1]
set ytics nomirror
set ylabel "Performance (normalized at 2400MHz)"
set y2range [0:150]
set y2tics 20
set y2label "Power consumption (W)"
set label "Performance (make -j4 buildkernel)" at 600,0.25
set label "Power (idling)" at 600,0.72
set label "Power (peak for make -j4 buildkernel)" at 600,0.9
plot "-" using 1:(513/($2+$3)) notitle with lp, \
"-" using 1:2 notitle axes x1y2 with l, \
"-" using 1:2 notitle axes x1y2 with lp
# f u s
2400 462 51
2100 540 60
1800 645 72
1200 808 88
600 1637 170
e
# f W
2400 102
600 102
e
# f W
2400 148
2100 143
1800 140
1200 135
600 126
e
0 件のコメント:
コメントを投稿