Core Parking (保留) とは何か?

 最近のハイパースレディング(HT)の効率がどの位なのかを検証したくて色々試していた時の事、不可解な現象を発見した。(実際には不可解ではなく、不理解だったというオチ)

 HTの効率は状況によって大きく左右されるため、自分が利用する唯一高負荷なアプリ「x264.exe」でその効果を確認する。普通に考えれば、HTのON/OFFで同じエコード処理を実行して違いを確認するのだが、再起動が面倒なだ~とか考えているうちに名案が浮かんだ。(実際には名案ではなく迷案だったというオチ)

start /AFFINITY 0x01 x264.exe .... 1Core-1Thred HTなし
start /AFFINITY 0x05 x264.exe .... 2Core-2Thred HTなし
start /AFFINITY 0x03 x264.exe .... 1Core-2Thred HTあり

 これで近似値になるんじゃね? そうすれば、他プロセスの負荷は別コアに分散されたりして都合良いんじゃね? という事で実測を開始する。が、結果のばらつきが大きかったり、論理的に矛盾した速度だったり、まったく実験にならなかった。そのうち、以下の事に気付いた。(簡略化のために2Core-4Thredの例で)

・アイドル状態では、CPU1,3が「保留」になっている(正確には可能性が高い)
・その状態から/AFFINITY 0x0Aで保留中のCPUのみを選択してx264.exeを実行する
・するとCPU1の保留が解除されるものの、CPU3は「保留」のまま
・保留が解除される事もあるが、すぐに「保留」に戻ったりする

 負荷をかけているのに保留ってどうゆう事よ? 保留が解除された時には利用率が100%近くになるので、ちゃんと負荷がかかっているはずだし・・・。一晩考えた結果、保留CPUの数は全体のCPU負荷で決定されるが、プロセス単位のAFFINITYなんて気にしてないんじゃないかと仮定してみた。ならば、その保留中のCPUに固定したプロセスを起動すれば「保留」が解除できるはず。

start /AFFINITY 0x08 notepad.exe .... CPU3が保留中

 保留が解除されないんですけど・・・。でもメモ帳はちゃんと動作してるし、タスクマネージャの関係の設定でもちゃんとCPU3でのみ動作するようになってるし・・・。

 知ってる人から見れば、こいつ馬鹿じゃないのか? って事になるかもしれないが、正解はここにあった。

 要するに「保留」とは、CPUが停止している状態ではなく、可能な限りスケジュールの対象から外すための単なる目印だという事だ。その結果としてCPUはIdleになり通常は省電力状態になるが、必要があればスケジュールされる事もありえるし、スケジュールされた時に保留フラグが解除される事はない。

まとめ:

(1) CPUの保留状態とは、CPUが停止しているのではなく、スケジュールから除外するための単なる目印
(2) 保留状態のCPUでも、スケジュールされる事があり、その時でも保留状態のまま
(3) 保留CPUの数はシステム全体の負荷から決定される

 つまり保留状態をコントロールしないとテストを進められないという事が判明した。原因が判明したのは良いが、元々の目的は達成できず、ただ時間だけが消費されたという事実、いや知識は増えたんだから良いか? それが役に立つかどうかは・・・だけれども。

この記事へのコメント

この記事へのトラックバック