雷撃の記憶

非常に不親切な備忘録

【Zen 3】スレッド数の多いAMDのCPUで、特定のコアに処理を偏らせないようにする。

■この記事は誰向けなのか?

・Zen 3で、CCDが2つ積まれているCPUを使っている人(5900X、5900XT、5950X)
他の環境は持ってないのでわかりませんが、スケジューラの仕組みは似たようなものだと思います。

・主な用途が対人ゲームではない
CCDまたぎが多発するようになるので、遅延が増えます。

・特定のコアばかり負荷が集中して困っている人

・周波数を固定して運用している人

・Curve Optimizerではなく電圧オフセットでZen 3を動かしている人

■結論

UEFI
AMD CBS/NBIO Common Options/SMU Common Options/
にある
・CPPC
・CPPC Preferred Cores
を無効にすると、特定のコアに対するスケジューリングが解除される。

 

-----以下、個人的な推測とメモの羅列-----

■環境

OS:Windows 11 23H2

CPU:Ryzen 9 5900XT
電圧オフセット-0.06875V、PBO無効、CPB無効、SMT無効(16コア16スレッド)、コア倍率42.00(4.2GHz動作)

MB:ASUS ROG STRIX X570-F

RAM:DDR4-3200 64GB

 

■Zen 3のスケジューリングの仕様

Zen 3は、能力の高いコアの情報が製造段階で内部に書き込まれており、Windowsはそれを元にタスクの割り振りを決める。
以下の優先順位でタスクが割り振られていると考えられる。

・CCDが0である
taskmgrとにらめっこしていると分かるが、CCD1には負荷の大きなタスクが割り振られにくい
・CCD0のうち、内部に書き込まれたCPPCのデータで優秀なコア
これはHWiNFO64のCPU情報などで確認できる

・CCDが1である

・CCD1のうち、内部に書き込まれたCPPCのデータで優秀なコア

私の5900XTの情報
CPPCが有効の場合は「コア・パフォーマンス・オーダー(CPPC)」という項目が出てくる
CPPCの表記がないものはWindows内部でのコア優先順位

加えて、デフォルトではCore Performance Boostが有効である。
この機能は「特定のコアに負荷が集中していて、電力と発熱量に余裕がある場合、そのコアのクロックを上げて処理効率を上げる」というものである。

これら2つの仕様が合わさり、特に優秀なコアに負荷を集中させるというのが基本思想のようだ。

■周波数固定との相性の悪さ

おそらく、このスケジューラの仕様は動的なオーバークロックであるCPBと、動的な電圧調整であるPBO2のCurve Optimizerの使用を前提としたものである。
優秀なコアほど低電圧・低発熱で動かせるため、そういったコアにシングルスレッド性能を追求させ、ゲームなどのパフォーマンスを向上させる狙いがあるのだろう。

しかし、筆者のように周波数を固定している場合、全てのコアの動作周波数は同じなので、ただただ処理の割り振りが偏るだけで、まるでメリットを享受出来ない。

故に、冒頭のようにCPPCを無効にしたのである。

■CPPCを無効にしたことによる負荷の変化

以下は、FL Studio 2024において、同じプロジェクトファイルを再生した時のtaskmgrのCPUグラフを示したものである。
VPS Avenger 2やFabFilter Pro-L2といったCPU負荷の大きいプラグインが同時に動作している区間を1分間ループで再生し続け、最後にスクリーンショットを保存した。

CPPC有効

CPPC無効

CCD0を優先する傾向はどうしても変わらないようだが、CCD内部での処理は随分平坦になったように見える。特にCCD1は負荷が明らかに均等になった。
また、従来では処理落ちが頻発して半ばベンチマークテストの様相を呈していたが、Avengerの波形合成の計算がCCD0内で分散されるようになったお陰なのか、動作が改善された。

■終わりに

Core Performance Boostが有効だと瞬間的に1.45V近い電圧が掛かることもあり、心臓に悪いので周波数固定と電圧オフセットで運用していたのだが、こういった落とし穴があることに気づくまで時間が掛かった。

また、スケジューラに関する日本語の文献もほとんど無かったので、ここに備忘録として記しておくことにした。

周波数固定でZen 3を使っている方にこの記事が届けば幸いである。