2007-02-24

Core 2 Duoマシンのcpufreqによるクロック周波数制御

このCore 2 Duo E6600のPCはわりとつけっぱなしにするので、(FreeBSD)そのパソコン、無意味に熱くなってませんか? ――― CPUの消費電力を減らす方法を参考にいじって電力を調べることにした。

もともと、sysctlでは、

dev.cpu.0.freq: 2400
dev.cpu.0.freq_levels: 2400/88000 1600/56000
dev.acpi_perf.0.freq_settings: 2400/88000 1600/56000
となっていたが、書いてあるとおりにkldload cpufreqをすると、
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時間
240046251
160046153

次に、cpufreqをロードした後の状態。
周波数設定ユーザCPU時間システムCPU時間
240046251
210054060
180064572
1600Invalid argument
1400Invalid argument
120080888
1000Invalid argument
800Invalid argument
6001637170
400Invalid argument
200Invalid argument

つまり、cpufreqをロードしていない場合は周波数を設定しても無意味であり、ロードした後でもすべての周波数が設定できるとは限らない(Invalid argumentが出ても実はdev.cpu.0.freqの値は設定されてしまうが、設定するたびにバラバラの性能になる)。きちんと設定できていれば、性能はほぼ比例している。

続いてワットチェッカーで電力を調べた。
周波数設定アイドル時電力ピーク電力
2400102148
2100102143
1800102140
1200102135
600102126

つまり、アイドル時電力は周波数とはまったく無関係であった。ピーク電力はそれなりに周波数に依存するが、全体に比べて大した差が出るわけでもない。

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 件のコメント: