Schi Heil と叫ぶために

hiroakiuno's blog

big.LITTLE の制御ソフトウェア技術を整理してみよう (その3)

前々回前回からの big.LITTLE の勉強の続き。

続いて big.LITTLE MP (GTS) について。例によって

からポイントを引用すると、

 前回の記事でbig.LITTLE MPもIKSと同じCPUのオペレーティングポイントを使っていると書いたが、これは古い仕様で、現在は異なるという。ARMによると、big.LITTLE MPでは、Linux/Unixでのスケジューラへのキューである「run queue」から得られる「load average」によるCPU負荷の値を使っているという。原則的にはrun queueでの占有率が高くなり、load averageの比率が一定を越えると、そのCPUコアをLITTLEコアからbigコアへと切り替える仕組みだ。

ここで、run queue と load average について調べる。まず run queue というのは実行可能なプロセスが登録されているキューのこと。run queue は CPU ごとにある。

実行可能なプロセスはRUNキューに登録されます。Linuxカーネル2.6のRUNキューは実行優先度ごとにスロットを用意しています。

(略)

マルチプロセッサシステムでは、RUNキュー(activeキューとexpiredキューの組み)をCPUごとに用意します。CPUごとに用意したプロセススケジューラは、そのCPU用のRUNキュー上のプロセスに対して働きます。この構造により、特定のプロセスは、毎回特定のCPU上で実行されることとなり、キャッシュメモリやTLBが有効利用されます。

UNIX USER 2004年6月号「Linuxカーネル2.6解読室」より転載:プロセススケジューラの実装――プロセススケジューリング(その4) (1/2) - ITmedia エンタープライズ

次に load average は CPU 使用率とは異なるシステム負荷指標で、

Linuxロードアベレージは「ロードアベレージは過去1分、5分、15分の間の実行待ちプロセス数の平均数 = 実行したくても他のプロセスが実行中で実行できないプロセスが平均で何個ぐらい存在してるか」を示す値です。ボトルネックが CPU、メモリ、ディスク等々どこにあるかは関係なく、仕事の実行までにどれぐらい待たされているかを示す値なので、システムのスループットを計測する指標の入り口になる値です。
マルチコア時代のロードアベレージの見方 - naoyaのはてなダイアリー

とのこと。

で、big.LITTLE の記事に戻ると、

 big.LITTLE MPではrunqueueから得られるload averageによってCPU負荷の情報を得ている。big.LITTLE MP側には負荷に対するマイグレーションしきい値(migration threshold)が設定されており、それを越えるとコアを切り替える。ただし、LITTLEからbigへとアップする時のしきい値と、bigからLITTLEへとダウンする時のしきい値は異なる設定がされている。

とある。最大のポイントは IKS では「CPU 使用率」を見て「big と LITTLE のコア」をガチャンと切り替えていたのに対し、big.LITTLE MP では「load average」を見てタスクの 「big と LITTLE への割り当て」を変えていることだろう。ちなみに load average と CPU 使用率との違いは

がわかりやすい。

また big と LITTLE が頻繁に切り替わりすぎないようにヒステリシスを設けていることが上記からわかるし、

現在のbig.LITTLE MPの場合は、これまでロードしたことがない新しいスレッドをローンチする場合には、まずbigコアに割り当てる仕様となっているという。

 ただし、この場合、全てのスレッドが必ずLITTLEコアに割り当てられて立ち上がると、ムダな電力消費が生じてしまう。そこで、big.LITTLE MPではヒストリテーブルをスレッド毎に参照することで、負荷が小さいスレッドはLITTLEコアに割り当てる操作を行なっているという

という風に、初期の割り当てをどうするかや履歴を見てインテリジェントに割り当てるなどの工夫がされている。

最後に、IPA と EAS について。前々回に用語を整理していた際は、GTS -> IPA -> EAS という進化なのかと思ったが、もう少し資料を読んでみると big.LITTLE 技術としての進化は GTS -> EAS であって、IPA はその前提となる技術のようだ。少なくとも IPA は big.LITTLE に限った話ではなさそうで、熱の予測を考慮して CPU の電力を変えるという技術のようだ。Linux の mainstream にも取り込まれている。Proactive という単語が強調されているように、IPA のポイントも熱の「先読み」「予測」になっている。

で、IPA も踏まえて GTS を発展させたのが EAS みたい。EAS のポイントは、GTS の load average に加えて、IPA の熱の予測も踏まえ、また従来の DVFS も含めて、負荷/熱/電力/周波数をトータルでコントロールするために big.LITTLE を用いる仕組みということのようだ。

  • Energy Aware Scheduling
    • Integrates CPU capacity awareness, Energy model, DVFS & Idle into mainline Linux scheduler
    • Designed to support a wide range of topologies
    • Prototypes running today

https://s3-ap-southeast-1.amazonaws.com/dgfactor/arm2015/Taipei/A2_ThermalVision_v5_Techcon2_TM_v1+-+Taiwan_Thomas+Molgaard.pdf

その他、まだ全然読めていない記事や参考資料。