自動並列化コンパイラをandroidに適用してみた

81
自動並列化コンパイラをAndroidに適用 してみた @magoroku15 2013/10/14 横浜PF部第33回勉強会 1

Upload: magoroku-yamamoto

Post on 24-May-2015

5.985 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: 自動並列化コンパイラをAndroidに適用してみた

自動並列化コンパイラをAndroidに適用してみた

@magoroku15

2013/10/14 横浜PF部第33回勉強会 1

Page 2: 自動並列化コンパイラをAndroidに適用してみた

SlideshareのAnalytics

2012年末から急落

http://www.slideshare.net/magoroku15

2013/10/14 横浜PF部第33回勉強会 2

Page 3: 自動並列化コンパイラをAndroidに適用してみた

最近…. 人に会うと言われます

最近何やってるんですか?

飽きた?

カーネルの話の続きは何時やるの?

つ部は参加しないの?

ギークバーは行かないの?

家庭に問題でも(ねーよ)

●人でもできた?(いねーよ)

引きこもってました

2013/10/14 横浜PF部第33回勉強会 3

Page 4: 自動並列化コンパイラをAndroidに適用してみた

引きこもってた理由

実は早稲田大学が開発した自動並列化コンパイラ(OSCAR)をAndroidで動かす研究をしてました 平日の夜と、週末の時間

Androidプラットフォームを並列化する試み

測定装置の設計、基板作成、自宅リフローもその一部

春までの成果は全部論文になったので、今日はその紹介

研究グループを代表してお話します

コミュニティのみなさんの情報がとても役に立ちました

自動並列化コンパイラの詳細は http://www.kasahara.elec.waseda.ac.jp/ または

検索: [早稲田 笠原研究室]

2013/10/14 横浜PF部第33回勉強会 4

Page 5: 自動並列化コンパイラをAndroidに適用してみた

今日のお話し

スマートディバスの高性能化 高クロック化とマルチコア化

準備体操 電力の基礎、Linuxの電力管理、OSCARコンパイラ、メモリ性

能、他

Androidのマルチコア利用率を調べてみた 通常の利用範囲ではマルチコアの利用率は低い

マルチコアによる高性能化が実利用では機能していない

Androidを対象に自動並列化をやってみた 並列化プログラムの動作阻害要因と改善

フレームワーク層の並列化→高速化

リアルタイム処理の並列化→低消費電力化

2013/10/14 横浜PF部第33回勉強会 5

Page 6: 自動並列化コンパイラをAndroidに適用してみた

スマートディバスの高性能化

それは正しい競争なのかなぁ?

2013/10/14 横浜PF部第33回勉強会 6

Page 7: 自動並列化コンパイラをAndroidに適用してみた

SoCの開発競争 マルチコア化

Linux

ARM11/

A8

Linux -2 core

SMP

A9 A9

Linux - 4 core SMP

A9 A9 A9 A9

Linux – 8 core HMP

A15 A15 A15 A15 A7 A7 A7 A7

Linux - 8 core big.LITTLE

A15 A15 A15 A15

A7 A7 A7 A7

Linux - 5 core 4+1 vSMP

A9 A9 A9 A9

A9

2013 2007 2011 ・・・・・・・ 2014

High performance device

累積出荷台数 iOS 700,000,000 Android 1000,000,000

2013/10/14 横浜PF部第33回勉強会 7

Page 8: 自動並列化コンパイラをAndroidに適用してみた

SoCベンダ 各社の方針 -個人の感想です-

Qualcomm 独自路線 4コアでも使いきれないので8コアは無駄だ、RFで勝負だ

NVIDIA 独自路線 4+1 vSMPで十分だ、Big LITTLEは4+1の劣化版だ

Samsung ARM追従路線 ARMの新アーキを一番最初に出荷するのだ Octaが同時に動かなくても商品名はOctaだ

Apple よくわかりません ふふん、他コア化してもスマートデバイスじゃ使わないよ 64bit x 2コアが最高(正しい気がする) 自分で作るのは面倒なので、Samsung・TSMCに委託するもん

2013/10/14 横浜PF部第33回勉強会 8

Page 9: 自動並列化コンパイラをAndroidに適用してみた

準備体操

オームの法則覚えてますか?

2013/10/14 横浜PF部第33回勉強会 9

Page 10: 自動並列化コンパイラをAndroidに適用してみた

電力って何

V:電圧、I:電流、R:抵抗

V=IR 電圧が一定の時、抵抗大なら電流小

抵抗が一定の時、電圧大なら電流大

電力はW=VI なので、I=V/RでIを置き換えて

W=V^2/R Rが一定の時、電圧を2倍で電力は4倍

Rが一定の時、電圧を1/2倍で電力は1/4倍

ACで考えると C キャパシタンス、F 周波数が登場

電圧が一定の時 C*Fが大なら電流大

W=V^2*C*F

2013/10/14 横浜PF部第33回勉強会 10

Page 11: 自動並列化コンパイラをAndroidに適用してみた

• 4コア並列動作の場合、周波数‘f’を ¼ にしても性能は同じ

• この時の電圧‘v’ が0.6vに下げられるとすると、電力は0.36倍(1/3に削減)

マルチコアと電力消費

1Coreの場合

P = f*c*v^2 ・・・・・ Eq.1

マルチコアの場合

P = n*f*c*v^2 ・・・・・ Eq.2

ACのみ、DCは無視 2013/10/14 横浜PF部第33回勉強会 11

Page 12: 自動並列化コンパイラをAndroidに適用してみた

OSCAR コンパイラ

一般的なC, FORTRANコンパイラのフロントエンドとして動作

逐次プログラムを自動並列化

A) 多様な並列性の抽出

再内ループ以外にの繰り返しはタスク並列

B) データ配置の最適化

キャッシュに乗せる

C) 周波数/電圧の制御APIを埋め込み

DVFS, Clock Gating, Power Gating

2013/10/14 横浜PF部第33回勉強会 12

Page 13: 自動並列化コンパイラをAndroidに適用してみた

多様な並列性の抽出

タスクレベルの並列化

ループレベルの並列化

ステートメントレベルの並列化

2013/10/14 横浜PF部第33回勉強会 13

Page 14: 自動並列化コンパイラをAndroidに適用してみた

データ配置の最適化

L1 L2 外部メモリを考慮してデータの配置を管理

L1

L2

外部メモリ

速い・少ない

遅い・多い

L1 L1 L1 L1

L2

外部メモリ

2013/10/14 横浜PF部第33回勉強会 14

Page 15: 自動並列化コンパイラをAndroidに適用してみた

データ配置の最適化

L1 L2 外部メモリのレイテンシ

ARM Connect Community Technical Symposium 2009 System Level Benchmarking Analysisof the Cortex™-A9 MPCore™ http://www.ruhr-uni-bochum.de/integriertesysteme/emuco/files/System_Level_Benchmarking_Analysis_of_the_Cortex_A9_MPCore.pdf

2013/10/14 横浜PF部第33回勉強会 15

Page 16: 自動並列化コンパイラをAndroidに適用してみた

周波数/電圧の制御APIの埋め込み

並列化かしたtaskの隙間に電力制御APIを埋め込む

Dynamic Voltage and Frequency Scaling (DVFS)で部分的にゆっくり・消費電力を落として動作

Power gating: Power を落とす

Clock gating: Clockを止める

MT1

MT2

MT5

MT3

MT6

MT8

MT4

MT7

MT9

Core0 Core1 Core2 Core0 Core1 Core2

MT1

MT2

MT5 (Low freq.)

MT3 (Low freq.)

MT6

MT8

MT4

MT7

MT9

Given Dead Line

time

Margin Clock gating

Power gating

Power gating

Power gating

Time management

time

2013/10/14 横浜PF部第33回勉強会 16

Page 17: 自動並列化コンパイラをAndroidに適用してみた

#pragma oscar get_current_time(current, timer_no)

OSCAR がAPI電力管理APIを挿入

Proc0

Scheduled

Tasks

T1 off

Proc1

Scheduled

Tasks

T2 T4

Proc2

Scheduled

Tasks

T3 T6(slow)

OSCAR Compiler

•Multigrain Parallelization •Memory Optimization •Data Transfer Optimization •DVFS, Clock gating

Sequential Programs C/Fortran

Low-power parallel C/Fortran Programs including OSCAR API

Backend Compiler

API Decoder

Native Compiler

#pragma oscar fvcontrol(pe, (id, state)) #pragma oscar get_fvstatus(pe, id, state)

Translate OSCAR API into Library call

Exec. Object

2013/10/14 横浜PF部第33回勉強会 17

Page 18: 自動並列化コンパイラをAndroidに適用してみた

並列化プログラムの動作阻害要因と改善

2013/10/14 横浜PF部第33回勉強会 18

Page 19: 自動並列化コンパイラをAndroidに適用してみた

評価環境

ハードウェア

Google Nexus-7

NVIDIA 社Tegra-3

ARM Cortex-A9 Quad-core + LP core

vSMP: Variable SMP

Clock 最大1.3GHz

ソフトウェア

Android 4.1.2

JCROM Japanese Custom ROM

2013/10/14 横浜PF部第33回勉強会 19

Page 20: 自動並列化コンパイラをAndroidに適用してみた

Android/Linuxのパワーコントロール

CPUFreq 負荷に応じてClockとVoltageを変更 DVFSの実装

CPUIdle 実行可能なプロセスが存在しない場合の休眠レベルを決める 深く寝ると、電力削減効果は大きいが、起きるのが遅い

HotPlug CPUFreq、CPUIdleの拡張 コアを高負荷時に増やす、低負荷時に減らす OSが負荷をサンプリングして自動的に 上手くいかない→後で詳しく

2013/10/14 横浜PF部第33回勉強会 20

Page 21: 自動並列化コンパイラをAndroidに適用してみた

SMPVariable SMP Variable SMP Variable

SMP (4 -PLUS PLUS -1™)より

2013/10/14 横浜PF部第33回勉強会 21

Page 22: 自動並列化コンパイラをAndroidに適用してみた

Battery Save Coreとは何か

CPU0の定電圧動作時にCPU0に成り代わって透過的に動作するCPU(LP0)

LP0動作 LCD offで遷移

policy_min_freq:51,000 policy_max_freq:700,000

実測では 340,000~640,000の範囲で指定可能

通常動作 LCD onで遷移

policy_min_freq:51,000 policy_max_freq:1,300,000

実測では340,000~1,300,000の範囲で指定可能

2013/10/14 横浜PF部第33回勉強会 22

Page 23: 自動並列化コンパイラをAndroidに適用してみた

マルチコアの利用状況

TwitterクライアントとChrome動作時のsystrace 4コア動いてるように見えるが……

拡大してみると

スカスカ マルチコアの利用効率は低い

2013/10/14 横浜PF部第33回勉強会 23

Page 24: 自動並列化コンパイラをAndroidに適用してみた

並列化プログラムの動作

並列化ベンチマークの結果

実行時間にばらつき

Systraceによる解析結果

Thread生成からCPUのbindまでに遅延 (Start-Migrated 440.6ms)

CPUの自動ON/OFF line(Auto 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

440.6ms

2013/10/14 横浜PF部第33回勉強会 24

Page 25: 自動並列化コンパイラをAndroidに適用してみた

おまわりさんこいつです hotplug

L L L L 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

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

2 2 2 2 2 2

up2g0_delay up2gn_delay down_delay up2gn_delay down_delay

1 1

up

up

up Down

Down

Down

down_delay

Idle

Idle

Idle

Idle

up 動作周波数が上限値に達しているのでコアを追加 down 動作周波数が下限値に達しているのでコアを削除 idle 動作周波数が上限値よりも低く、下減値よりも高いのでコア個数の変更なし disable Auto hotplug 機能を停止する

2013/10/14 横浜PF部第33回勉強会 25

Page 26: 自動並列化コンパイラをAndroidに適用してみた

Tegra-3のhotplug governor

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 }

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

Throttle_table throttle_index

Update form user thermal_cooling_device

Edp_Thermal Auto Hot plug

Suspend CpuFreq

2013/10/14 横浜PF部第33回勉強会 26

Page 27: 自動並列化コンパイラをAndroidに適用してみた

Auto_hotplugの無効化

auto hotplug のstate

# echo 0 >/sys/module/cpu_tegra3/parameters/auto_hotplug

# echo 1 >/sys/module/cpu_tegra3/parameters/auto_hotplug

# cat /sys/module/cpu_tegra3/parameters/auto_hotplug

0: disabled

1: idle

2: down

3: up

0を書き込むと無効可できる

2013/10/14 横浜PF部第33回勉強会 27

Page 28: 自動並列化コンパイラをAndroidに適用してみた

CPU ON/OFF

以下の操作で可能

Online

echo 1 > /sys/devices/system/cpu/cpuX/online

Offline

echo 0 > /sys/devices/system/cpu/cpuX/online

2013/10/14 横浜PF部第33回勉強会 28

Page 29: 自動並列化コンパイラをAndroidに適用してみた

on/off lineのカーネルログ <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

11ms

12ms

1.4ms

1.1ms

0.8ms

ONline

OFFline

2013/10/14 横浜PF部第33回勉強会 29

Page 30: 自動並列化コンパイラをAndroidに適用してみた

クロック制御

CPUFreqがインタフェースを提供

実体はクロックと電圧のテーブルを操作

/sys/devices/system/cpu/cpuX/cpufreq がI/F

scaling_available_frequencies

51000 102000 204000 340000 475000 640000 760000 860000 1000000 1100000 1200000 1300000

scaling_max_freq

最大動作クロック

scaling_min_freq

最低動作クロック

2013/10/14 横浜PF部第33回勉強会 30

Page 31: 自動並列化コンパイラをAndroidに適用してみた

クロック制御の制約

特定のCPUにクロックを設定すると他のCPUのクロックも同じ値に変化?

PLL,VCCが共通か?

CPU個別のクロック制御はできない

ON/OFFで制御するか?

2013/10/14 横浜PF部第33回勉強会 31

Page 32: 自動並列化コンパイラをAndroidに適用してみた

Clock up transit <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

2013/10/14 横浜PF部第33回勉強会 32

Page 33: 自動並列化コンパイラをAndroidに適用してみた

Clock down transit <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

2013/10/14 横浜PF部第33回勉強会 33

Page 34: 自動並列化コンパイラをAndroidに適用してみた

おまけ Systelcall cost

getpid(2) 1M times # time ./scalltest p M

0m0.19s real 0m0.02s user 0m0.18s system

190000000ns / 1000000 = 190ns

Clock 1.2GHz

One CPU, ON & Off line 1K times # time ./scalltest 0 h K

0m23.43s real 0m0.00s user 0m1.49s system

23430 ms / 1000 = 23 ms

Three CPU, ON & Off line 1K times #time ./scalltest 0 H K

0m31.01s real 0m0.00s user 0m4.77s system

30s / 1000 = 30ms

2013/10/14 横浜PF部第33回勉強会 34

Page 35: 自動並列化コンパイラをAndroidに適用してみた

遷移評価 まとめ

CPUのON/OFF line

1CPU 23ms

3CPU 30ms

Clock

UP 5ms

Down 2ms

測定環境

Affinity init + factory kernel

Autohotplug off via sysfs

1.2 GHz

2013/10/14 横浜PF部第33回勉強会 35

Page 36: 自動並列化コンパイラをAndroidに適用してみた

並列化プログラムの実行環境

CPU Hot Plug Auto Hot Plugの課題

周波数制御でも負荷が改善できない場合にCPUを追加

サンプリングによる遅延

対処 Auto Hot Plugの無効化

アプリケーションからの要求によるHot Plug

並列化プログラムから必要コア数を要求・割り当て

CPUバインディング 非並列プログラムとシステムプロセスをCPU0に割り付け

Initを修正して、非並列プログラムをCPU0に

並列化プログラムをCPU1~3に割り付け 並列化プログラムからthreadをCPUに割り付け

2013/10/14 横浜PF部第33回勉強会 36

Page 37: 自動並列化コンパイラをAndroidに適用してみた

並列化ランタイム

CPU HotplugとCPUバインディングを制御

sysfsインタフェースを利用

主な仕様

アプリケーションがCPU Auto Hot Plug 機能を無効化できる事

アプリケーションがCPU のオンライン・オフラインの変更を行える事

複数の並列化アプリケーションの要求を管理できる事

アプリケーションが異常終了した場合に獲得した資源を解放できる事

評価対象以外のプログラムはコア#0 で動作する事.

2013/10/14 横浜PF部第33回勉強会 37

Page 38: 自動並列化コンパイラをAndroidに適用してみた

並列化ランタイムの効果 - 過渡特性

Start-Migratedの時間は7.2ms 並列化ランタイムを用いない場合は440.6ms

以下を改善 Auto hotplug によるコアの追加に伴う遅延時間

一旦, 任意のコアで実行を開始した後に, 指定されたコアにスレッドが移行する遅延時間

コア追加時に一旦クロックを低下させる処理

7.2ms

2013/10/14 横浜PF部第33回勉強会 38

Page 39: 自動並列化コンパイラをAndroidに適用してみた

並列化ランタイムの効果 – 実行速度

適用前

適用後

以下の改善により、高速化・安定化

過渡特性の改善により、急峻な並列性負荷変動に対応

必要なコア・クロックを明示的に指定

サンプル 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

サンプル 1 2 3 4 5 6 7 8 9 10 最速 平均 最遅

実行時間(秒) 2.70 2.71 2.72 2.72 2.73 2.73 2.76 2.72 2.72 2.73 2.70 2.72 2.76

2013/10/14 横浜PF部第33回勉強会 39

Page 40: 自動並列化コンパイラをAndroidに適用してみた

フレームワーク層の並列化

- 高速化 -

Skiaを並列化

2013/10/14 横浜PF部第33回勉強会 40

Page 41: 自動並列化コンパイラをAndroidに適用してみた

システムレベルの並列化

並列化ランタイムライブラリ ネイティブバイナリを高速化できた

Android上で利用する場合NDKを利用 1. C又はC++でネイティブライブラリを作成

2. JavaからJNI経由で呼び出し

NDKの問題 Java とC++の2 種類のフレームワークの習熟が必要

Java で開発をしてきたデベロッパの負担大

Android のシステム側での並列化 既存のAPIを変更せず、その処理を並列化

デベロッパの負担無し

既存のプログラムも高速化が可能

2013/10/14 横浜PF部第33回勉強会 41

Page 42: 自動並列化コンパイラをAndroidに適用してみた

Androidの構造1 アプリケーションの空間構成

User 記述部分

libc

Java クラスライブラリ

JNI

skia その他

Dalvik (VM)

描画 バッファ

Native

Java

2013/10/14 横浜PF部第33回勉強会 42

Page 43: 自動並列化コンパイラをAndroidに適用してみた

Skia

2D描画ライブラリ

2005年にGoogleが買収したSkia社のライブラリ

オープンソースとして公開

Androidでは2Dレンダリングエンジンとして利用

例 Java: canvas→Skia: SkCanvas

Google Chrome等でも採用

Skiaの構成

インタフェース層 APIを提供

演算層 API層の指示でラスタの演算を処理

BitBLT層 演算層の指示で描画バッファを操作

2013/10/14 横浜PF部第33回勉強会 43

Page 44: 自動並列化コンパイラをAndroidに適用してみた

Androidの構造2 Surfaceflinger

アプリケーション アプリケーション アプリケーション

Skia Skia Skia

Frame Buffer

アプリケーション用 描画バッファ

SurfaceFlinger

2013/10/14 横浜PF部第33回勉強会 44

Page 45: 自動並列化コンパイラをAndroidに適用してみた

Android描画機能の並列化

アプリケーションから多用される2D描画処理 Skia

HTMLのレンダリングでも利用

Java APIとして提供 C++で記述されたSkiaライブラリをJavaからJNIで呼び出す

描画以外にも画像展開、bitmap操作など

Skiaの最適化 HWアクセラレーションは進んでいない

ストリーミング演算ではない

BitBLT層はループ展開とSIMDで最適化

Skia並列化による改善を検討

2013/10/14 横浜PF部第33回勉強会 45

Page 46: 自動並列化コンパイラをAndroidに適用してみた

BitBLT

32bit/pixel

fx dx

count

アプリケーション用 描画バッファ

16bit/pixel

Y

X

dst

0

count

イメージ (例:アイコン)

X

Y

回転

2013/10/14 横浜PF部第33回勉強会 46

Page 47: 自動並列化コンパイラをAndroidに適用してみた

BitBLT 従来の最適化

BitBLTはAndroidの改版の都度改善されてきた

C言語→ASM→SIMD

GPUでは効果が出ない(実は最近………)

SIMD命令による最適化

SIMDを用いたストライド転送を8画素単位にcount個繰り返す

fx

dx

count

dst

ストライド転送

2013/10/14 横浜PF部第33回勉強会 47

Page 48: 自動並列化コンパイラをAndroidに適用してみた

BitBLTの並列化 初回の呼び出し時にスレッドを生成

システムコールsched setaffinity でコアに割り付け

演算の開始、完了の待ち合わせはスレッド間で共有するvolatile 変数の参照・更新で行う

待ち合わせはSpin lock 方式で行う

待ち合わせ処理はSkia のインターフェース層で行う

パラメタの設定

コア#1 コア#2 コア#0

count/2

fx

dst count/2

fx+count//2

dst+count/2

② ④

⑤ ⑤

2013/10/14 横浜PF部第33回勉強会 48

Page 49: 自動並列化コンパイラをAndroidに適用してみた

Skia並列化による描画性能の向上

変更前 逐次処理の描画フレームレート(FPS)

変更後 並列処理の描画フレームレート(FPS)

3%の向上

サンプル 1 2 3 4 5

Round 1 44.56 44.88 43.95 44.56 44.82

Round 2 44.91 44.67 45.18 44.91 44.42

Average 44.74 44.77 44.56 44.74 44.62

サンプル 1 2 3 4 5

Round 1 44.89 45.84 45.89 45.87 45.80

Round 2 45.82 45.90 46.16 46.08 45.86

Average 45.85 45.87 46.02 45.97 45.83

OSCARによる自動並列化で フレームレートを2倍に向上

2013/10/14 横浜PF部第33回勉強会 49

Page 50: 自動並列化コンパイラをAndroidに適用してみた

Skia自動並列化のまとめ

4コア商用スーマートディバイスの課題

一定時間の負荷が継続した場合にのみコアを追加

短時間の並列性負荷ではマルチコアは動作しない

急峻な並列性負荷に対応可能なランタイム環境を整備

描画APIの1処理を例題としてAndroid内部で並列化

標準の描画APIの性能をフレームレートで3%向上

OSCARコンパイラで性能を2倍に

2013/10/14 横浜PF部第33回勉強会 50

Page 51: 自動並列化コンパイラをAndroidに適用してみた

Skia高速化 0xbenchでの評価

動画は近日中にyoutubeにupload予定

2013/10/14 横浜PF部第33回勉強会 51

Page 52: 自動並列化コンパイラをAndroidに適用してみた

Draw Image 27.2FPS → 52.9FPS

2013/10/14 横浜PF部第33回勉強会 52

Page 53: 自動並列化コンパイラをAndroidに適用してみた

Draw Rect 20.9FPS → 42.1FPS

2013/10/14 横浜PF部第33回勉強会 53

Page 54: 自動並列化コンパイラをAndroidに適用してみた

Draw Circle2 33.9FPS→ 50.8FPS

2013/10/14 横浜PF部第33回勉強会 54

Page 55: 自動並列化コンパイラをAndroidに適用してみた

電力評価環境

2013/10/14 横浜PF部第33回勉強会 55

Page 56: 自動並列化コンパイラをAndroidに適用してみた

Nexus 7でやってみた

回路図なし

PMIC、SoCの仕様は非公開

バッテリ側のPMICを加工して、電流測定

2013/10/14 横浜PF部第33回勉強会 56

Page 57: 自動並列化コンパイラをAndroidに適用してみた

Power Rail and Measurement point

for Nexus 7

A) VBAT の出力

B) DC-DCの出力

C) PMICの出力

Bat-mgr Battery DC-DC PS63020

USB 5V

PMIC MAX77612 I2

C I2C

SOC

I2C slave slave master

Unregulated VBAT (typ. 3.7v)

3.0v 0.8v-3.3v

Valuable

C B A

2013/10/14 横浜PF部第33回勉強会 57

Page 58: 自動並列化コンパイラをAndroidに適用してみた

作ってみた

2013/10/14 横浜PF部第33回勉強会 58

Page 59: 自動並列化コンパイラをAndroidに適用してみた

測ってみた#1

平らなところはidle

1ms 間隔で割り込み

16ms 間隔でVSYNC

1ms 73mv Vsync

2013/10/14 横浜PF部第33回勉強会 59

Page 60: 自動並列化コンパイラをAndroidに適用してみた

測ってみた#2

0xbenchのDraw rectで測ってみた VSYNC の間隔で負荷が上昇

2013/10/14 横浜PF部第33回勉強会 60

Page 61: 自動並列化コンパイラをAndroidに適用してみた

電力測定はおもしろい

SDを動作させた時の大電力 割り込みで間欠的に上昇する負荷 画面更新の少ない場合の負荷 画面更新の多い場合の負荷 突然Nexus7がお亡くなりに………

http://lbdaberi.blogspot.jp/2012/12/nexus-7.html

2013/10/14 横浜PF部第33回勉強会 61

Page 62: 自動並列化コンパイラをAndroidに適用してみた

新しい評価環境 ODROID-X2

Samsung Exynos4412 Prime

ARM Cortex-A9 Quad core

最大 1.7GHz

Samsung Galaxy S3で使ってます

DVFS は4コア共通

Hardkernel 社からAndroid/linuxがソース提供

回路図も公開

シリアル番号をメールで送ると回路図が送られてくる

2013/10/14 横浜PF部第33回勉強会 62

Page 63: 自動並列化コンパイラをAndroidに適用してみた

SoC Exynos4412

Exynos4412のPower Rail

PMICはExynos4412 に4種類の電源を供給 VDD_ARM CORE VDD_INT Interrupt controller and L2 VDD_G3D GPU VDD_MIF DDR Memory

VDD_ARM (CORE) を測定対象にした

Cortex-A9 32KB I/D

NEON

Cortex-A9 32KB I/D

NEON

Cortex-A9 32KB I/D

NEON

Cortex-A9 32KB I/D

NEON

Interrupt controller + L2

GPU

DDR

VDD_ARM

VDD_INT

VDD_G3D

VDD_MIF

PMIC

2013/10/14 横浜PF部第33回勉強会 63

Page 64: 自動並列化コンパイラをAndroidに適用してみた

ODROIDオリジナル

L

C

GND

L

C

GND

VDD_ARM

回路図 レイアウト

PMIC

C27 C32

2013/10/14 横浜PF部第33回勉強会 64

Page 65: 自動並列化コンパイラをAndroidに適用してみた

ODROID-X2の改造

Current

Voltage

Voltage (V) Current (A) x = Power (W)

2013/10/14 横浜PF部第33回勉強会 65

Page 66: 自動並列化コンパイラをAndroidに適用してみた

やってみた

PMIC

GND GND

VDD_ARM

R

C C

L

GND

Single 5 Pin

Drop Voltage

L

R

Voltage

2013/10/14 横浜PF部第33回勉強会 66

Page 67: 自動並列化コンパイラをAndroidに適用してみた

こんな感じ ODROID-X2

SoC

PMIC

Shunt

Instrumentation amp

Shunt電圧

オシロ・ADCなど

2013/10/14 横浜PF部第33回勉強会 67

Page 68: 自動並列化コンパイラをAndroidに適用してみた

リアルタイムアプリケーションの並列化

- 低消費電力化 -

2013/10/14 横浜PF部第33回勉強会 68

Page 69: 自動並列化コンパイラをAndroidに適用してみた

ベンチマーク MPEG2 decode

60FPS(16.6ms)毎に1フレームを処理

b)時間を待ち合わせ(loop)

a)1フレーム分のdecode処理

1ms程度で正確にsleep/wakeupできればb)の電力を下げられる

2013/10/14 横浜PF部第33回勉強会 69

Page 70: 自動並列化コンパイラをAndroidに適用してみた

clock gating

ARM のWFI 命令

WFI 命令はイベント(割り込み)が発生するまでClockを止めて電力を低減できる

通常はカーネルのidle処理で利用

動作可能なプロセスが存在しない場合に呼び出し休眠、タイマ割り込で復帰

Clock gating ドライバを作ってみる

WFI は特権命令

APIから呼び出し可能なLinux driverを作ってみたら?

2013/10/14 横浜PF部第33回勉強会 70

Page 71: 自動並列化コンパイラをAndroidに適用してみた

while(1) { gpio_value(1);

call_wfi_api(1);

gpio_value(0); }

250mA

500mA

作ってみた WFI driver

250mA

500mA

2000us (4 slot)

Wake up

Time Slot is 500 us

GPIO

while(1) { gpio_value(1); call_wfi_api(4); gpio_value(0); }

GPIO

Clock gating

0us < T < 500us 1500us < T < 2000us

15000us (3 slot)

(N -1) x 500us < T < N x 500us 2013/10/14 横浜PF部第33回勉強会 71

Page 72: 自動並列化コンパイラをAndroidに適用してみた

電流 - 4コア Clock gating無し

1000mA

1500mA

2000mA

500mA

1core 2cores 3cores 4cores

Busy wait in ordinary execute

2013/10/14 横浜PF部第33回勉強会 72

Page 73: 自動並列化コンパイラをAndroidに適用してみた

電流 - 4コア Clock gating有り

1000mA

1500mA

2000mA

500mA

1core 2cores 3cores 4cores

Busy wait with clock gating 割り込み処理

Clock gating 中

電流は一定

2013/10/14 横浜PF部第33回勉強会 73

Page 74: 自動並列化コンパイラをAndroidに適用してみた

電流 Clock Gating ありなしの比較

1000mA

1500mA

2000mA

500mA

1core 2cores 3cores 4cores

Busy wait in ordinary execute

1000mA

1500mA

2000mA

500mA

1core 2cores 3cores 4cores

Busy wait with clock gating

2013/10/14 横浜PF部第33回勉強会 74

Page 75: 自動並列化コンパイラをAndroidに適用してみた

並列化+DVCF+ClockGateingでの

MPEG2 Decoder 消費電力

1/7(13.3%)

1/3(38.1%)

NUMBER OF CORES

With Power Reduction Control Without Power Reduction Control

2013/10/14 横浜PF部第33回勉強会 75

Page 76: 自動並列化コンパイラをAndroidに適用してみた

MPEG2 Decode execution In high clock and voltage

Busy Wait execution Clock gating

by WFI

Reduced by WFI

Consumed Reduced

(a) Without Power Reduction Control (b) With Power Reduction Control

電力測定 MPEG2 Decoder 1コア

1.7GHz, 1.4V

1.7GHz, 1.4V

2013/10/14 横浜PF部第33回勉強会 76

Page 77: 自動並列化コンパイラをAndroidに適用してみた

Busy Wait execution

Clock gating by WFI

MPEG2 Decode execution In low clock and voltage

電力測定 MPEG2 Decoder 3コア

DVFS P = n*f*c*V^2

Reduced by WFI

MPEG2 Decode execution In high clock and voltage

Consumed Reduced

(a) Without Power Reduction Control (b) With Power Reduction Control

1.7GHz, 1.4V

400MHz, 1.05V

200MHz, 0.92V

2013/10/14 横浜PF部第33回勉強会 77

Page 78: 自動並列化コンパイラをAndroidに適用してみた

MPEG2 Decoder の消費電力2は3並列で1/3に

NUMBER OF CORES

2.79

0.97

0.63 0.37

WFI

DVFS

WFI

1/3(38.1%)

Consumed Reduced

2013/10/14 横浜PF部第33回勉強会 78

Page 79: 自動並列化コンパイラをAndroidに適用してみた

まとめ

Androidのマルチコアは殆ど動いていない

Javaアプリを並列化するのは難しく、効果が少ない

OSでの自動制御には無理がある

アプリから制御する(OS屋をとしては敗北!)

頻出するJava APIのNative側(Skia)を自動並列化してみた

2Dレンダリング性能が2倍に向上

実はHTML5でも効果あるんです

リアルタイムアプリ(MPEG2 decode)を自動並列化してみた

消費電力は1/3に削減

次のネタは仕込み中w

2013/10/14 横浜PF部第33回勉強会 79

Page 80: 自動並列化コンパイラをAndroidに適用してみた

利用したツールなど

性能評価

Syatrace システムレベルのプロファイル

Oprofile 関数レベルのプロファイル、CallGrapf

Perf 命令レベルのプロファイル

Gwave 波形表示

プラットフォーム

Nexus7 2012

ODROID-X2

2013/10/14 横浜PF部第33回勉強会 80

Page 81: 自動並列化コンパイラをAndroidに適用してみた

最後に

ET2013 産学共同パビリオンに出展します

2013.11.20(水)-22(金)

早稲田大学 理工学術院 笠原・木村研究室

ブース番号 UI-02

ETフェスタは11.21(木) 17:00-18:00

差し入れ歓迎

2013/10/14 横浜PF部第33回勉強会 81