Raspberry Pi3 CPUクロック周波数を固定にする方法

Raspberry Pi CPU周波数の制御

2017年12月、Raspberry Pi3でCPUクロック周波数を固定に設定しました。
Raspberry Pi3のデフォルト設定では、CPU負荷やCPU温度によりCPUクロック周波数が動的に変化します。

Raspberry Pi3

Raspberry Pi3

ブログ「Raspberry Pi CPU周波数、CPU温度、CPU使用率の取得Pythonスクリプト」で、デフォルト設定の動作を確認しました。顔検出を開始するとCPU負荷が上がりCPU周波数は 600MHz → 1200MHz に上昇し、CPU温度が80度を超えるとCPU周波数を適切に低減します。

Raspberry Pi CPU周波数、CPU温度、CPU使用率の取得Pythonスクリプト

Raspberry Pi でリアルタイムなシステムを構築した場合などに、CPUクロックが動的に変化して応答速度が変化することを避けなければなりません。また、アルゴリズムの最適化実装するときに、CPUクロックが動的に変化すると実装工夫の効果を正確に評価することができません。

そこで、CPUクロック周波数を固定にする方法を調べました。

CPUクロック周波数は、CPUfreq ツールのgovernor動作ポリシー設定により変化します。

Governor 動作
performance 負荷に関わらず最大動作周波数で動作
powersave 負荷に関わらず最小動作周波数で動作
ondemand CPU負荷に応じ動的に動作周波数を変更(低遅延で負荷の変化に追従)
conservative CPU負荷に応じ動的に動作周波数を変更(ゆっくりと段階的に変更)
userspace ユーザー指定の動作周波数で動作
schedutil スケジューラによってCPU周波数を選択

cpufrequtils とは

「cpufrequtils」は、Linux Kernelが提供するCPUfreqの情報取得や操作を行うコマンドです。

cpufrequtils パッケージをインストールします

cpufreq インターフェースは、/sys/devices/system/cpu/cpu*/cpufreq/ のsysfs設定情報です。
Raspberry Pi3は、4つのCPUコアがありますので cpu0 から cpu3 の4種類が表示されます。

CPUfreq インターフェース

CPUfreq インターフェース

scaling_governor は、現在設定しているgovernor動作ポリシーを表します。

確認してみます。cat コマンドではファイル名を表示することができないので、grep コマンドを使用します。

scaling_governor は、ondemand になってるのでCPU負荷に応じ動的に動作周波数が変化します。

4つのCPUコア別にgovernor動作ポリシーの設定領域があるので、CPUコア別に設定できるのかと思いました。しかし、実際にはリンクでひとつの領域を示しているので、CPUコア別に設定できるわけではありません。

cpufrequtils コマンド

cpufrequtils は、CPUfreqの状態を参照する cpufreq-infoコマンド と 設定する cpufreq-setコマンドがあります。

オプション指定なしでcpufreq-infoコマンドを実行するとすべての情報を参照できます。

–help オプションでコマンドオプションを調べます。




ondemandポリシー

cpufreq-infoコマンド(-p と -f)で、governor動作ポリシーと動作周波数を参照します。

デフォルトの設定は、ondemandポリシーです。過負荷が無い状態ですので600MHzで動作しています。

performanceポリシー

cpufreq-setコマンドで、governor動作ポリシーをperformanceに設定します。root権限が必要ですので、sudoでコマンドを起動します。

cpufreq-infoコマンドで、governor動作ポリシーと動作周波数を参照します。

performanceポリシーとなり、1200MHzで動作しています。

powersaveポリシー

cpufreq-setコマンドで、governor動作ポリシーをpowersaveに設定します。root権限が必要ですので、sudoでコマンドを起動します。

cpufreq-infoコマンドで、governor動作ポリシーと動作周波数を参照します。

powersaveポリシーとなり、600MHzで動作しています。

Python版OpenCVによる顔検出

governor動作ポリシーを変更して、顔検出を実行しながら CPU周波数/CPU温度/CPU使用率をモニターしてみます。画面にOpenCVのlena.jpg サンプル画像を表示して、そのモニター画像をカメラで撮影して顔を検出します。

顔検出とCPU周波数・温度

顔検出とCPU周波数・温度

performanceポリシー

governor動作ポリシーをperformanceに設定して確認します。

顔検出実行前のアイドル状態からCPU周波数は1200MHzになっています。顔検出を開始します。CPU周波数は1200MHzで動作しています。しかし、CPU温度が80度を超えるとCPU周波数は1162MHz程度に下がりました。

performance ポリシー動作

performance ポリシー動作

performance ポリシー動作(高温時)

performance ポリシー動作(高温時)

 

powersaveポリシー

governor動作ポリシーをpowersaveに設定して確認します。

顔検出実行前のアイドル状態からCPU周波数は600MHzになっています。顔検出を開始します。CPU周波数は600MHzで動作しています。

powersave ポリシーの動作

powersave ポリシーの動作

usersaveポリシー

governor動作ポリシーをusersaveに設定して確認します。

ユーザーの設定したCPU周波数で動作すると思ったのですが、最高周波数の1200MHzで動作し任意のCPU周波数で動作しませんでした。

もう少し、調査が必要です。

 

 

このエントリーをはてなブックマークに追加