民 生 組 込 み 機 器 における 低 消 費 電 力 化 の 手 法 山 本 英 雄 ( 早 稲 田 大 ) 1
組 み 込 みプラットフォームの2 極 化 A7 A7 A7 A7 High performance device A15 A15 A15 A15 Linux 8 core HMP A9 A7 A7 A7 A7 A9 A9 A9 A9 A15 A15 A15 A15 Linux - 5 core 4+1 vsmp Linux - 8 core big.little ARM11/ A8 Lnux A9 A9 Linux -2 core SMP A9 A9 A9 A9 Linux - 4 core SMP Embedded device M[0-3] RTOS 2007 2011 2013 2014 2
汎 用 OSを 用 いた 組 み 込 み 機 器 フルセットのネットワーク 機 能 Java,c,c++とそれらの 標 準 ランタイムのサポート コーデック 3D 描 画 過 去 のソフトウェア 資 産 3
AndroidとLinuxの 関 係 Linuxカーネルへの 追 加 は 僅 少 - 共 用 メモリ binder 一 般 的 なアプリはDalvik (java VM) 上 で 動 作 電 力 管 理 他 空 間 の 保 護 スケジューラーもLinuxの 機 能 に 依 存 4
前 提 とするHW/SWの 基 礎 HW:オームの 法 則 からSW:プロセスの 状 態 遷 移 5
電 力 って 何 P: 電 力 V: 電 圧 I: 電 流 R: 直 流 抵 抗 C x F: 交 流 抵 抗 ( 逆 数 ) V=IR I=V/R 電 圧 が 一 定 の 時 抵 抗 小 なら 電 流 大 抵 抗 が 一 定 の 時 電 圧 大 なら 電 流 大 電 力 P=VI なので I=V/RでIを 置 き 換 えてP=V²/R 直 流 で 考 えると Rが 一 定 の 時 電 圧 を2 倍 で 電 力 は4 倍 Rが 一 定 の 時 電 圧 を1/2 倍 で 電 力 は1/4 倍 交 流 で 考 えると C キャパシタンス F 周 波 数 のときC x Fの 逆 数 が 交 流 抵 抗 Cが 一 定 の 時 周 波 数 高 なら 抵 抗 小 で 電 流 大 P=CFV² 6
電 力 削 減 のためのハードウェア 機 構 CPUコア 電 力 のモデル 式 P = 交 流 成 分 + 直 流 成 分 = F x C x V² + V²/R F: 動 作 周 波 数 を 上 げるには 電 圧 も 上 げる 必 要 がある F: 動 作 周 波 数 が0なら 交 流 成 分 の 電 力 は0 DVFS dynamic voltage/frequency scaling CPUのF: 動 作 周 波 数 とV: 電 圧 を 動 的 に 変 更 する Clock Gateing - クロック 遮 断 F: 動 作 周 波 数 を0にする Power Gateing - 電 力 遮 断 V: 電 圧 を0にする 7
idleによる 休 眠 状 態 カーネル アプリ 8 実 行 可 能 状 態 のプロセスを 探 して コンテキストを 復 元 実 行 可 能 状 態 のプロセスが 存 在 しない 場 合 はidle()を 呼 ぶ CPU PC text data bss Running task task task task kstack kstack kstack kstack text data bss stack Ready text data bss stack Blocked text data bss stack text data bss stack Ready idle Redyなプロセスが 存 在 しなければ idle()を 呼 ぶ Ready 実 行 可 能 Running 実 行 中 Blocked イベント 完 了 待 ち
割 り 込 み イベントに 応 じて PCに 任 意 のアドレスを 書 き 込 む HW 割 り 込 み 外 部 の 装 置 が 生 成 する 代 表 的 なイベント タイマ 割 り 込 み 設 定 した 時 間 の 経 過 時 に 生 成 IO 割 り 込 み DISK/LAN/keyboardなどIO 装 置 が 生 成 SW 割 り 込 み プログラム 自 身 が 生 成 するイベント システム 呼 び 出 し 命 令 *の 実 行 0 除 算 不 正 アドレス 参 照 などの 例 外 9
割 り 込 みとidleの 関 係 タイマー 割 り 込 み 時 間 P1 P2 P3 #1 Running Ready Ready sleep() - - #2 Blocked Running Ready - read() - #3 Blocked Blocked Running - - exit() #4 Blocked Blocked idle() Ready - #N Runnig Blocked idleの 割 合 がCPUの 負 荷 を 示 す idleを 呼 ぶとOSがCPUを 休 眠 状 態 ( 低 電 力 )に 遷 移 させる 割 り 込 み 発 生 時 にHWが 休 眠 状 態 から 復 帰 させる 10
割 り 込 みがidelからの 復 帰 契 機 idleを 読 んだ 後 システムの 状 態 は 全 て 割 り 込 みを 契 機 に 更 新 される カーネル 3 更 新 CPU PC text data bss Blocked 2 割 り 込 み Blocked Blocked 1 無 負 荷 idle Blocked task task task task kstack kstack kstack kstack idle アプリ text data bss text data bss text data bss text data bss stack stack stack stack 11
電 力 削 減 のためのOSの 役 割 A) 制 御 ロジック 例 )CPU 負 荷 など システムの 状 態 を 判 断 して 動 作 周 波 数 を 変 更 する B) ハードウェアIF 例 )SoCの 仕 様 に 従 い 動 作 周 波 数 と 電 圧 のテーブルを 用 意 し 周 波 数 の 対 応 した 電 圧 を 指 定 する DVFSの 例 A) 制 御 ロジック コアモジュール + governor B) 動 作 周 波 数 変 更 制 御 コア 電 圧 変 更 制 御 動 作 周 波 数 コア 電 圧 変 更 コストのテーブル 12
代 表 的 な 制 御 ロジック A) 負 荷 に 応 じて 動 作 周 波 数 を 調 整 する DVFS 負 荷 に 応 じてClockとVoltageを 変 更 負 荷 はidle 状 態 を 評 価 B) idle 時 の 休 眠 状 態 を 調 整 する Clock Gating 深 く 寝 ると 復 帰 に 時 間 がかかる C) 負 荷 に 応 じて 動 作 コア 数 を 調 整 する Power Gating 過 負 荷 を 検 出 してコアを 自 動 的 に 追 加 削 除 D) 電 力 と 応 答 性 のバランスを 調 整 する Tick Less OSが 制 御 する 範 囲 で OSが 扱 う 時 間 はCPUの 動 作 周 波 数 とは 別 の 時 計 で 刻 む TICK TICKが 進 む 都 度 タイマ 割 り 込 みが 発 生 して 実 行 可 能 状 態 のプロ セスをプライオリティ 順 に 実 行 する 13
電 力 評 価 の 手 法 14
電 力 の 測 定 方 法 正 確 な 値 がわかっている 抵 抗 を 電 源 部 に 挿 入 し 抵 抗 での 降 下 電 圧 を 測 定 して 電 流 を 得 る I=V/R Rは 定 数 なので Iは 降 下 電 圧 :VをRで 除 算 すれば 求 まる 電 流 :Iを 降 下 後 の 電 圧 Vで 乗 算 すれば 電 力 が 求 まる 電 力 回 りの 回 路 はPMIC+L+Cなので 回 路 図 無 しでも 解 析 は 容 易 で 複 数 の 改 造 事 例 あり 15
Exynos4412の 例 ODROID-X2 hardkernel 社 Samsung Exynos4412 Prime ARM Cortex-A9 Quad core 最 大 1.7GHz 回 路 図 とAndroid/linuxのソースコードは 公 開 シリアル 番 号 をメールで 送 ると 回 路 図 が 送 られてくる 16
Power Railの 例 Exynos4412の 場 合 PMICはExynos4412 に4 種 類 の 電 源 を 供 給 VDD_ARM CORE VDD_INT Interrupt controller and L2 VDD_G3D GPU VDD_MIF DDR Memory VDD_ARM (CORE) を 測 定 対 象 にした SoC Exynos4412 PMIC VDD_ARM VDD_INT Cortex-A9 32KB I/D NEON Cortex-A9 32KB I/D NEON Cortex-A9 32KB I/D NEON Interrupt controller + L2 Cortex-A9 32KB I/D NEON VDD_G3D GPU VDD_MIF DDR 17
回 路 パターンの 変 更 例 Exynos4412の 場 合 PMIC( 電 力 制 御 IC)からCPUにつながる 回 路 を 加 工 VDD_ARM VDD_ARM 電 圧 測 定 点 GND GND GND C C C R 電 流 測 定 点 L L L L PMIC 改 造 前 PMIC 改 造 後 Rでの 電 位 差 は 微 小 なため 専 用 の 測 定 器 または 計 装 アンプが 必 要 18
Exynos4412の 改 造 例 SoC オシロ ADCなど PMIC Shunt Shunt 電 圧 計 装 アンプ 19
ハードウェアIF 層 での 電 力 削 減 の 効 果 実 測 を 結 果 から 20
DVFSの 効 果 (Intel Haswell) 負 荷 を 掛 けた 状 態 でクロックを 変 更 7W 800MHz 時 ~ 17w 3GHz 時 mw 3GHz 時 17W 16 段 階 800MHz 時 7W shunt:2mω INA226を 利 用 21 ms Intel Haswell 2 coreで 測 定
1Core-2Core-DVFS 測 定 結 果 prime2 無 負 荷 prime1 1 秒 間 隔 で16 段 階 (3GHz~0.8GHz)にClockを 変 更 3GHz 3GHz CPU 追 加 Clock UP CPUFreq 自 動 16 段 階 CPUFreq 手 動 0.8GHz 22
Power Gatingの 効 果 (ARM) 4 多 重 の 負 荷 を 掛 けた 状 態 でコアを 順 次 Pon 1core 2cores 3cores 4cores Exynos 4412 で 測 定 24
Tick 値 の 影 響 (ARM) 一 定 時 間 間 隔 でタイマ 割 り 込 みを 発 生 させる 頻 度 100HZから200HZ 程 度 割 り 込 み 処 理 で 時 間 関 連 のソフトウェアイベントを 処 理 割 り 込 み 処 理 のコストは 一 定 応 答 性 能 を 向 上 するために Tickを200から2000に 変 更 すると 割 り 込 みオーバヘッドが10%に 従 来 は1% D D 50us 500us 25 Exynos 4412 1coreで 測 定
Linuxの 電 力 管 理 制 御 ロジック - governor 26
DVFSの 制 御 CPUFreq 制 御 ロジックの 実 装 - drivers/cpufreq/ Governorの 種 類 Powersave(cpufreq_powersave.c) いつも 最 低 Performance(cpufreq_performance.c) いつも 最 高 Conservative(cpufreq_conservative.c) 控 え 目 (Step 毎 )に 変 更 Ondemand(cpufreq_ondemand.c) 一 度 に 高 クロックにあげる Userspace(cpufreq_userspace.c) sysfs 経 由 でユーザーが 操 作 Ondemandを 標 準 とする 場 合 が 多 い 対 話 性 能 を 重 視 idleが80%( 調 整 可 )を 超 えると Stepを 無 視 して 高 クロックに 変 更 27
電 圧 周 波 数 テーブルの 例 28
CPUFreq Clock up の 遷 移 時 間 <7>[ 942.369161] notification 0 of frequency transition to 1200000 khz <7>[ 942.369500] notification 0 of frequency transition to 1200000 khz <7>[ 942.369685] notification 0 of frequency transition to 1200000 khz <7>[ 942.370010] notification 0 of frequency transition to 1200000 khz <7>[ 942.370193] cpufreq-tegra: transition: 340000 --> 1200000 <7>[ 942.370555] regulator regulator.2: set_voltage: name=max77663_sd1, min_uv=1100000, max_uv=1350000 <7>[ 942.371086] regulator regulator.1: set_voltage: name=max77663_sd0, min_uv=900000, max_uv=1250000 <7>[ 942.371467] regulator regulator.2: set_voltage: name=max77663_sd1, min_uv=1200000, max_uv=1350000 <7>[ 942.371985] regulator regulator.1: set_voltage: name=max77663_sd0, min_uv=1000000, max_uv=1250000 <7>[ 942.372505] regulator regulator.1: set_voltage: name=max77663_sd0, min_uv=1025000, max_uv=1250000 <7>[ 942.373135] notification 1 of frequency transition to 1200000 khz <7>[ 942.373209] FREQ: 1200000 - CPU: 0 <7>[ 942.373345] notification 1 of frequency transition to 1200000 khz <7>[ 942.373483] FREQ: 1200000 - CPU: 1 <7>[ 942.373561] notification 1 of frequency transition to 1200000 khz <7>[ 942.373756] FREQ: 1200000 - CPU: 2 <7>[ 942.373832] notification 1 of frequency transition to 1200000 khz <7>[ 942.374027] FREQ: 1200000 - CPU: 3 5ms 29 Nexus7(2012)
CPUFreq Clock down 遷 移 時 間 <7>[ 1035.045405] notification 0 of frequency transition to 1000000 khz <7>[ 1035.045529] notification 0 of frequency transition to 1000000 khz <7>[ 1035.045591] notification 0 of frequency transition to 1000000 khz <7>[ 1035.045702] notification 0 of frequency transition to 1000000 khz <7>[ 1035.045763] cpufreq-tegra: transition: 1200000 --> 1000000 <7>[ 1035.046042] regulator regulator.1: set_voltage: name=max77663_sd0, min_uv=975000, max_uv=1250000 <7>[ 1035.046315] notification 1 of frequency transition to 1000000 khz <7>[ 1035.046387] FREQ: 1000000 - CPU: 0 <7>[ 1035.046462] notification 1 of frequency transition to 1000000 khz <7>[ 1035.046593] FREQ: 1000000 - CPU: 1 <7>[ 1035.046669] notification 1 of frequency transition to 1000000 khz <7>[ 1035.046857] FREQ: 1000000 - CPU: 2 <7>[ 1035.046929] notification 1 of frequency transition to 1000000 khz <7>[ 1035.047116] FREQ: 1000000 - CPU: 3 <7>[ 1035.047352] regulator regulator.2: set_voltage: name=max77663_sd1, min_uv=1100000, max_uv=1350000 2ms 30 Nexus7(2012)
CPUFreqのまとめ 制 御 ロジックとハードウェアIF ポリシーベースのGovernor 遷 移 時 間 は 数 ms 動 作 電 圧 の 制 御 外 付 けレギュレータとの 通 信 の 時 間 電 圧 安 定 までの 時 間 動 作 クロック(PLL)の 制 御 最 新 のCPUでは レギュレータを 内 蔵 するものが 登 場 31
Clock Gatingの 制 御 - CPUIdle 制 御 ロジックの 実 装 - drivers/cpuidle CPUの 休 眠 状 態 の 深 さを 管 理 休 眠 開 始 はidle() C1 - MPU WFI + Core active C2 - MPU WFI + Core inactive C3 - MPU CSWR + Core inactive C4 - MPU OFF + Core iactive C5 - MPU RET + Core RET C6 - MPU OFF + Core RET C7 - MPU OFF + Core OFF 選 択 Coreの 状 態 :omap3の 例 Governorの 種 類 Ladder(cpufreq_powersave.c) Menu(cpufreq_performance.c) 軽 い 休 眠 から 重 い 休 眠 へ 統 計 情 報 から 特 定 の 深 さへ 32
Power Gatingの 制 御 - hotplug マルチコアで 利 用 Core0が 他 のCoreの 起 動 停 止 を 制 御 停 止 対 象 のCoreからプロセスのコンテキストを 移 動 する コストが 高 い 詳 細 は 後 述 33
電 力 と 応 答 性 Tick Less 従 来 のTick OS 内 部 のソフトウェア 時 計 Kernel 内 の 定 数 10Hz(100ms)~100Hz(10ms) 程 度 間 隔 が 長 いと 休 眠 時 間 が 長 い 反 面 応 答 性 が 劣 化 Tick less(nohzモード) 制 限 付 きでTickの 値 を 変 数 に 1プロセス 最 大 1 秒 OSが 休 眠 時 間 をタイマーに 設 定 マルチコアの 場 合 にはコア 毎 にタイマーを 持 っている 必 要 がある 34
Tick Lessの 電 力 波 形 mw 1 秒 35 ms Exynos 5420
マルチコアLinuxの 電 力 管 理 36
マルチコアの 利 用 の 現 状 Nexus7 (2012) TwitterクライアントとChrome 動 作 時 のsystrace 4コア 動 いてるように 見 えるが 拡 大 してみると 利 用 効 率 は 低 い 37
マルチコアの 電 力 管 理 CPUの 追 加 削 除 をCPUFreqの 拡 張 として 実 装 - hotplug 過 負 荷 を 検 出 CPUFreq 低 負 荷 を 検 出 クロックを 上 げる クロックを 下 げる クロックが 上 限 値 hotplug クロックが 下 限 値 コアを 追 加 コアを 削 除 38
Hotplugの 問 題 点 プロセスの 移 動 コスト Pon/Poffコストが 大 きい CPU0 blocked CPU1 Blocked blocked Running Idle: 50% Idle: 100% CPU1をPoffする 場 合 CPU1が 管 理 しているblockedプロセスをCPU1への 移 動 が 必 要 Pon 時 対 象 CPUのリセット 割 り 込 みから 初 期 化 プロセスの 移 動 1~10ms 程 度 を 要 するため Pon/Poffは 慎 重 な 判 断 が 必 要 39
on/off lineのカーネルログ Tegra3の 場 合 <4>[138006.624075] CPU1: Booted secondary processor <6>[138006.634275] Switched to NOHz mode on CPU #1 B <4>[138006.636903] CPU2: Booted secondary processor <6>[138006.646632] Switched to NOHz mode on CPU #2 B <4>[138006.650118] CPU3: Booted secondary processor <6>[138006.657736] Switched to NOHz mode on CPU #3 B <4>[138020.741637] stop_machine_cpu_stop smp=1 <4>[138020.741649] stop_machine_cpu_stop smp=3 <4>[138020.741659] stop_machine_cpu_stop smp=0 <4>[138020.741670] stop_machine_cpu_stop smp=2 <5>[138020.743037] CPU1: shutdown <4>[138020.746183] stop_machine_cpu_stop smp=0 <4>[138020.746195] stop_machine_cpu_stop smp=2 <4>[138020.746206] stop_machine_cpu_stop smp=3 <5>[138020.747326] CPU2: shutdown <4>[138021.227998] stop_machine_cpu_stop smp=0 <4>[138021.228010] stop_machine_cpu_stop smp=3 <5>[138021.228841] CPU3: shutdown 12ms 11ms 1.4ms 1.1ms 0.8ms ONline OFFline 40
vsmp: Tegra3の 事 例 SMPVariable SMP Variable SMP Variable SMP (4 -PLUS PLUS -1 )より 41
Battery Save Coreとは 何 か CPU0の 定 電 圧 動 作 時 にCPU0に 成 り 代 わって 透 過 的 に 動 作 するCPU(LP0) LP0 動 作 LCD offで 遷 移 CPU0 動 作 LCD onで 遷 移 CPU0 電 力 LP0 Clock 42
Tegra-3のhotplug governor Edp_Thermal Suspend tegra_cpu_set_speed_cap 578 int tegra_cpu_set_speed_cap(unsigned int *speed_cap) 579 { 581 unsigned int new_speed = tegra_cpu_highest_speed(); 586 new_speed = tegra_throttle_governor_speed(new_speed); 587 new_speed = edp_governor_speed(new_speed); 588 new_speed = user_cap_speed(new_speed); 592 ret = tegra_update_cpu_speed(new_speed); 594 tegra_auto_hotplug_governor(new_speed, false); 596 } Throttle_table Auto Hot plug CpuFreq throttle_index tegra_auto_hotplug_governor parameters LP-mode GP-MODE up_delay up2g0_delay up2dn_delay down_delay down_deley down_delay top_freq idle_top_freq idle_bottom_freq botttom_freq 0 idle_bottom_freq Current State Compare with requested freq New State Delay to effecte IDLE > top_freq UP Up_delay IDLE <=bottom_freq DOWN Down_delay DOWN >top_freq UP Up_delay DOWN >bottom_freq IDLE NA UP <bottom_freq DOWN Down_delay UP <=top_freq IDLE ND Update form user thermal_cooling_device 43
hotplug governorによる 慎 重 な 判 断 up down idle disable 動 作 周 波 数 が 上 限 値 に 達 しているのでコアを 追 加 動 作 周 波 数 が 下 限 値 に 達 しているのでコアを 削 除 動 作 周 波 数 が 上 限 値 よりも 低 く 下 減 値 よりも 高 いのでコア 個 数 の 変 更 なし Auto hotplug 機 能 を 停 止 する Idle Idle up 2 2 2 2 2 2 Down Idle Idle up 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Down up L L L L Down 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 L L up2g0_delay up2gn_delay up2gn_delay down_delay down_delay down_delay 44
Hotplugが 阻 害 する 並 列 化 プログラムの 起 動 並 列 化 ベンチマークの 結 果 実 行 時 間 にばらつき サンプル 1 2 3 4 5 6 7 8 9 10 最 速 平 均 最 遅 実 行 時 間 ( 秒 ) 5.12 5.08 3.65 5.05 2.78 2.73 5.06 2.74 5.05 2.74 2.73 4.00 5.12 Systraceによる 解 析 結 果 Thread 生 成 からCPUのbindまでに 遅 延 (Start-Migrated 440.6ms) CPUの 自 動 ON/OFF line(auto Hotplug)が 影 響 440.6ms 45
big.little: Exynos5 の 事 例 vsmp の1+4に 対 して, 4+4で 動 作 A9 A7 A7 A7 A7 A9 A9 A9 A9 A15 A15 A15 A15 Linux - 5 core 4+1 vsmp Linux - 8 core big.little vsmpの 構 成 Big.LITTLEの 構 成 vsmpのa9+a9に 対 して A7+A15 利 用 者 からは4コアに 見 えて クロックに 応 じて 内 部 で A7-A15を 切 り 替 えて 動 作 制 御 はCPUFreq 46
big.littleの 電 力 波 形 mw 16ms 47 ms Exynos 5420
まとめ 48
自 動 制 御 の 限 界 と 期 待 自 動 制 御 の 限 界 過 去 の 状 態 から 将 来 の 状 態 を 予 測 予 測 は 当 たらない 例 ) 並 列 性 の 負 荷 が 低 くてもコアを 追 加 する 無 駄 応 答 性 を 上 げるために 投 機 的 にクロック 上 げる 無 駄 実 装 はCPUの 機 能 を 対 応 したハードウェアIFの 追 加 に 限 定 制 御 ロジックはCPUFreqのまま 新 しい 試 みへの 期 待 コンパイラによる 電 力 管 理 コードの 出 力 プロファイルベースのスケジューリング 省 電 力 機 構 の 全 面 刷 新 49