ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

raspberry pi クロックダウン

raspberry piのクロック制御

あまり需要は無いかもしれないのですが、実はraspberry piクロックダウン出来ます。


公式サイトに「Overclocking options in config.txt」というドキュメントがあり、ラズパイ内の各種クロック周波数や関連する電圧設定を変更出来る事が書かれています。
(出来るけど、正常動作するかは自己責任。当然適切に冷却したり、容量に余裕ある電源使ったり等必要です。)

www.raspberrypi.org

/boot/config.txt内に各種ハードウェア設定値が記載されており、これを書き換える事で色々HWの挙動が変更可能で、その中でいくつかのクロック周波数の上限値の設定があります。
もちろん、ラズパイのモデル毎のSoCがHW的に許容する範囲である必要があります。

で、ラズパイに搭載されたARMのクロック周波数ですが、arm_freqという項目の他にarm_freq_minという項目があり、これを設定するとラズパイの動作クロックの下限値が変更可能な様です。

うちのラズパイはpi 2 Model Bで、通常は下限600MHz,上限900MHzで、cpufrequtilsでcpufreqのgovernorをOnDemandにしておくと(通常はこれがデフォルト?)、CPU負荷に応じてクロック周波数が切り替わります。

ちなみにうちのラズパイは電源との相性か、はたまたSoCにヒートシンクとか貼っていないせいか、900MHz駆動だと不安定動作していたので、かなり以前にgovernorをpowersaveに変更して常時下限クロック600MHz駆動にしてあります。


rc30-popo.hatenablog.com

vcgencmdでARMクロックを測定すると以下のような感じで600MHz駆動を教えてくれます。

pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=600062000
pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=600000000
pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=600000000
pi@raspberrypi:~ $ vcgencmd measure_clock arm

この状態で試しにconfig.txtにarm_freq_min=400という行を追加(root権限が必要なので、sudo nanoとかsudo viで編集)してrebootします。

しばらく待って、再度ログイン、ARMクロックを再測定します。

pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=400042000
pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=400000000
pi@raspberrypi:~ $ vcgencmd measure_clock arm
frequency(45)=400000000
pi@raspberrypi:~ $ 


あと、下限を変更可能なのは判ったのですが、どこまで落とせるかは、公式サイトにも記載がありません。チップの仕様をチェックするしか無いのかな?
cpufreqドライバーのラズパイ対応のソースはチェックしましたが、firmware上のテーブルから下限値取得するみたいので、おそらくconfig.txtの下限値がそこに反映されているんじゃないかと思っています。


念のため、600MHz駆動時と400MHz駆動時で、byte UNIXBENCHからdhry2のみ単体走行させて比較しました。(全部測るとものすごく時間かかるので)

600MHz駆動時、byte UNIXBENCHのdhry2単体走行(10秒間x3回)

pi@raspberrypi:~/byte-unixbench/UnixBench/pgms $ ./dhry2 10
COUNT|20633470|1|lps
pi@raspberrypi:~/byte-unixbench/UnixBench/pgms $ ./dhry2 10
COUNT|19905914|1|lps
pi@raspberrypi:~/byte-unixbench/UnixBench/pgms $ ./dhry2 10
COUNT|20640950|1|lps


400MHz駆動時、byte UNIXBENCHのdhry2単体走行(10秒間x3回)

pi@raspberrypi:~/byte-unixbench/UnixBench/pgms $ ./dhry2 10
COUNT|13740372|1|lps
pi@raspberrypi:~/byte-unixbench/UnixBench/pgms $ ./dhry2 10
COUNT|13745414|1|lps
pi@raspberrypi:~/byte-unixbench/UnixBench/pgms $ ./dhry2 10
COUNT|13738639|1|lps

概ね、クロック比でスコアが変化している様です。

これが何の役に立つのか?ですが、Pi ZEROをバッテリー駆動とかで動かしている際に、そんなに性能は要らないケースでクロックと電圧ダウンで安定動作するポイント見つければ多少バッテリー駆動時間伸ばせるとかあるかもしれないです...あまり遅くすると周辺デバイスとのやり取りとかに時間かかってトータルでかえって電力食う可能性とかもあるので、あくまでも可能性としてですが...