HumansXドキュメントセンター 公式サイトへ ↗

2.4_Thermal と CPU 周波数管理

RDK X5

注意

以下の内容はRDK X5開発ボードに適用されます

Thermal 制御

温度センサー

X5 には DDR/BPU/CPU の温度を表示する 3 つの温度センサーがあります。/sys/class/hwmon/ 下の hwmon0 ディレクトリに温度センサー関連のパラメータが含まれています。temp1_input は DDR の温度、temp2_input は BPU の温度、temp3_input は CPU の温度で、温度の精度は 0.001℃ です。

cat /sys/class/hwmon/hwmon0/temp1_input
46643

BPU の温度センサーは bpu subsystem 内にあり、bpu subsystem は BPU の動作時にのみ通電されるため、BPU の温度は BPU の動作中にのみ確認できます。

Thermal

Linux Thermal は Linux システムの温度制御関連モジュールで、主にシステム動作中にチップが発生する熱を制御し、チップ温度とデバイス筐体温度を安全で快適な範囲に保つために使用されます。

デバイスの温度を適切に制御するには、以下の 3 つのモジュールを理解する必要があります:

温度を取得するデバイス:Thermal フレームワークでは Thermal Zone Device として抽象化されています。X5 には thermal_zone0 と thermal_zone1 の 2 つの thermal zone があります;

冷却が必要なデバイス:Thermal フレームワークでは Thermal Cooling Device として抽象化されており、CPU、BPU、GPU、DDR があります;

温度制御ポリシー:Thermal フレームワークでは Thermal Governor として抽象化されています;

以上のモジュールの情報と制御は、すべて /sys/class/thermal ディレクトリで取得できます。

X5 には全部で 4 つの cooling(冷却)デバイスがあります:

  • cooling_device0: cpu
  • cooling_device1: bpu
  • cooling_device2: gpu
  • cooling_device3: ddr

このうち、cooling デバイス DDR は thermal_zone0 に、cooling デバイス CPU/BPU/GPU は thermal_zone1 に関連付けられています。以下のコマンドで、現在のデフォルトポリシーが step_wise であることがわかります。

cat /sys/class/thermal/thermal_zone0/policy

以下のコマンドで、対応しているポリシーが user_space と step_wise の 2 種類であることを確認できます。

cat /sys/class/thermal/thermal_zone0/available_policies

user_space は、uevent を通じて温度ゾーンの現在の温度や温度制御のトリガーポイントなどの情報をユーザー空間に通知し、ユーザー空間のソフトウェアが温度制御ポリシーを決定する方式です。

step_wise は、ポーリング周期ごとに冷却状態を段階的に引き上げる、比較的穏やかな温度制御ポリシーです

どちらのポリシーを選ぶかは製品の要件に応じて決めてください。ビルド時に指定するか、sysfs で動的に切り替えることができます。例:thermal_zone0 のポリシーを user_space モードに動的に切り替える場合

echo user_space > /sys/class/thermal/thermal_zone0/policy

thermal_zone0 には 1 つの trip_point があり、cooling デバイス DDR の周波数調整温度を制御します

sysfs で DDR の周波数調整温度を確認できます。現在の設定は 95℃ です

cat /sys/devices/virtual/thermal/thermal_zone0/trip_point_0_temp

DDR の周波数調整温度を例えば 85℃ に調整したい場合は、以下のコマンドを使用します:

echo 85000 > /sys/devices/virtual/thermal/thermal_zone0/trip_point_0_temp

thermal_zone1 には 3 つの trip_point があります。trip_point_0_temp は予約用、trip_point_1_temp はこの thermal zone の周波数調整温度で、CPU/BPU/GPU の周波数を制御し、現在 95℃ に設定されています。trip_point_2_temp はシャットダウン温度で、現在 105℃ に設定されています。例えば接合部温度が 85℃ に達したら CPU/BPU/GPU の周波数調整を開始させたい場合:

echo 85000 > /sys/devices/virtual/thermal/thermal_zone1/trip_point_1_temp

シャットダウン温度を 105℃ に調整したい場合:

echo 105000 > /sys/devices/virtual/thermal/thermal_zone1/trip_point_2_temp

以上の設定は、電源を切って再起動した後に再度設定する必要があります

CPU 周波数管理

Linux カーネルには、CPU の周波数と周波数制御ポリシーを制御する cpufreq サブシステムが組み込まれています。

ディレクトリ/sys/devices/system/cpu/cpufreq/policy0に移動して ls を実行すると、以下のファイルが表示されます:

affected_cpus                       // 当前控制影响的CPU核(没有显示处于offline状态的cpu)
cpuinfo_cur_freq                    // 当前CPU频率(单位: KHz)
cpuinfo_max_freq                    // 当前调频策略下CPU可用的最高频率(单位: KHz)
cpuinfo_min_freq                    // 当前调频策略下CPU可用的最低频率(单位: KHz)
cpuinfo_transition_latency          // 处理器切换频率所需要的时间(单位:ns)
related_cpus                        // 该控制策略影响到哪些CPU核(包括了online+offline的所有cpu)
scaling_available_frequencies       // CPU支持的主频率列表(单位: KHz)
scaling_available_governors         // 当前内核中支持的所有 governor(调频)类型
scaling_boost_frequencies           // 在boost(超频)模式下CPU支持的主频率列表(单位: KHz)
scaling_cur_freq                    // 保存着 cpufreq 模块缓存的当前 CPU 频率,不会对 CPU 硬件寄存器进行检查。
scaling_disable_freq                // 禁止设置的CPU频率,只能设置一个
scaling_driver                      // 当前使用的调频驱动
scaling_governor                    // governor(调频)策略
scaling_max_freq                    // 当前调频策略下CPU可用的最高频率(从cpufreq模块缓存中读取)
scaling_min_freq                    // 当前调频策略下CPU可用的最低频率(从cpufreq模块缓存中读取)
scaling_setspeed                    // 需将governor切换为userspace才能使用,往这个文件echo数值,会切换频率

現在対応している周波数は以下のとおりです

cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies
300000 600000 1200000 1500000

RDK X5 システムで使用している Linux カーネルは、以下の種類の周波数調整ポリシーに対応しています:

  • パフォーマンス(performance):常に CPU を最高消費電力かつ最高性能の状態、すなわちハードウェアがサポートする最高周波数に置きます。
  • performance:最高周波数で動作
  • ondemand:負荷に応じて周波数を調整
  • userspace:ユーザーが設定した周波数で動作
  • powersave:最低周波数で動作
  • schedutil:負荷に応じて周波数を調整。CPU スケジューラと連携して使用します

ディレクトリ/sys/devices/system/cpu/cpu0/cpufreq/下の対応する設定を操作することで、CPU の周波数調整ポリシーを制御できます。

例えば CPU をパフォーマンスモードで動作させる場合:

echo performance >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

または CPU を固定周波数(1.2GHz)で動作させる場合:

echo userspace >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 1200000 >/sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed

CPU オーバークロック

開発ボードは CPU Freq ドライバで CPU の動作状態を管理しており、デフォルトはschedutilモードです。このモードでは負荷に応じて CPU の動作周波数が動的に調整され、消費電力を節約します。performanceモードに変更すると、CPU を常に最高周波数で動作させることができます。コマンドは以下のとおりです:

echo performance >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

開発ボードのシステムにはオーバークロック機能があり、CPU の最大周波数を 1.5GHz から 1.8GHz に引き上げることができます。設定コマンドは以下のとおりです:

echo 1 >/sys/devices/system/cpu/cpufreq/boost
echo performance >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

上記のコマンドで設定した CPU 周波数は現在の動作中のみ有効で、デバイスを再起動するとデフォルト設定に戻ります。

注意

CPU のオーバークロックはチップの消費電力と発熱を増加させます。安定性の問題が発生した場合は、以下のコマンドでオーバークロック機能を無効にできます:

echo 0 >/sys/devices/system/cpu/cpufreq/boost

注意

オーバークロックに対応しているのは X5H のみで、X5M ではオーバークロックできません。チップの種類は以下のコマンドで確認できます。例えば以下の例で確認されたチップは X5M です

cat /sys/class/socinfo/soc_name X5M

チップの種類が X5U(すなわち X5 UNKNOWN)と識別された場合、通常は初期出荷版のチップで、eFUSE に対応する識別ビットがまだ書き込まれていないため、ソフトウェアから正確なチップ型番を読み取ることができません。チップのシルク印刷情報から目視で識別する必要があります。

この種のチップではオーバークロック制限が有効になっておらず、理論上はオーバークロック設定を実行できますが、以下の点に注意してください:

  • オーバークロック後は消費電力が大幅に上昇します
  • システムの安定性は保証されず、動作異常や寿命短縮のリスクがあります

研究開発段階でのテスト用途に限って使用することをお勧めします。量産ではオーバークロック機能に依存することは推奨しません。

sudo hrut_somstatusコマンドで、現在のチップの動作周波数や温度などの状態を確認できます: