CpuTopologyRebuildで13900KFのコア構成を調整する

前回アップグレードしたCore i9-13900KFは、その後もmacOS Ventura 13.0で順調に稼働してます。

この記事へのコメントで、CpuTopologyRebuildというkextを作者の方から教えて頂きました。物理コアとハイパースレッド (HT) の構成をmacOSに伝えるkextです。Alder Lake-Sのために作られて、Raptor Lake-Sでは未検証とのことでしたが、試したところ正しく動作しました。13900K, KFは、Pコア8, HT 8, Eコア16の全32スレッド構成 (8P16E32T) ですが、これを

  • 物理コア24, HT 8、全32スレッド (24C32T) または、
  • 物理コア8, HT 24、全32スレッド (8C32T)

に見せることが可能でした。ベンチマークテストの結果、マルチコアのスコアはどの構成でも大差はありませんが、シングルコアのスコアは物理コア8 (8C32T) と設定した場合が高性能でした。

CpuTopologyRebuild.kext

今回試したkextは、以下のCpuTopologyRebuild.kextです。

Core i9-13900は、Pコア8, HT 8, Eコア16の構成です。macOSがサポートしているインテルCPUには、PコアとEコアが混在するモデルはありません。なので、均一の物理コアとHTの組み合わせとして認識させることになります。OpenCoreそのままで使用すると、全部が物理コアとして扱われて、

  • 物理コア32、全スレッド32 (32C32T)

としてmacOSから見えるようになります。ちょっと乱暴な気はしますが、性能もそこそこ良く、特に問題は発生していませんでした。これに対して、CpuTopologyRebuild.kextを使うと、

  • 物理コア24, 全スレッド32 (24C32T)、または、
  • 物理コア8, 全スレッド32 (8C32T)

のようにmacOSに見せることができました。このkextを有効にすると物理コアが24になり、さらにboot argに-ctrsmtを追加すると物理コアが8コアになります。以下に13900K, KFのコア構成とkextの設定を表で示します。

物理コア 全スレッド kext boot arg
32 32 なし なし
24 32 あり なし
8 32 あり -ctrsmt

コア数を確認する

Geekbench 5の表示で確認すると、確かにコアの構成が変わってます。以下はそれぞれ、32コア、24コア、8コアに設定した場合の表示です。

さらに、sysctl -a | grep cpuした結果を、diffで比較しました。<で始まる行がkextなしで、>で始まる行がkextあり(-ctrsmtオプション付き)の項目です。OpenCoreデフォルトだと32コアなところが、このkextで8コアになっていることがわかります。

< hw.perflevel0.physicalcpu: 32
< hw.perflevel0.physicalcpu_max: 32 
> hw.perflevel0.physicalcpu: 8
> hw.perflevel0.physicalcpu_max: 8
< hw.perflevel0.cpusperl2: 1 
> hw.perflevel0.cpusperl2: 2
< hw.physicalcpu: 32
< hw.physicalcpu_max: 32 
> hw.physicalcpu: 8
> hw.physicalcpu_max: 8

Geekbench 5の比較

Geekbench 5のスコアを比較します。数回実施した平均値です。参考に、GeekbenchのサイトにあるM1 Ultraのスコアも加えました。13900は、M1 Ultraにはシングルで勝っているものの、マルチでは負けてます。

コア構成の比較では、マルチの差は1%以下で誤差に近いです。シングルの差は4%くらいあって、8C > 32C > 24Cの順番で、8Cが一番良いです。

Cnebench R23の比較

Cinebench R23でもベンチマークしました。マルチは数回の平均、シングルは2回の平均です。これもM1 Ultraと比較しましたが、こちらはシングル、マルチとも13900がM1 Ultraよりも高速でした。Intel CPUが得意とするベンチマークのようです。

コア構成の比較では、Geekbench 5と同様の傾向が見られました。マルチは32C > 8C > 24Cで、シングルは8C > 32C > 24Cの順番でした。マルチの差は、毎回の測定のばらつきよりも小さいので、誤差範囲かと思います。それでもGeekbenchと同様の傾向だったので、何か意味があるかもしれません。シングルもGeekbenchと同じ傾向でした。これも8Cが一番良い性能でした。

動作の観察

CpuTopologyRebuildの作者の方も考察されてますが、それと同じ結果が得られました。シングルコアの性能は、8C > 32C > 24Cの順に高性能でした。

アクティビティモニターで、Cinebenchシングルスコア測定中のCPUの負荷を観察しました。32個のスレッドの使用状況が棒グラフで表示されます。

まずは32Cの場合の様子です。シングルスコアのベンチマークなので、一度には一つのコアしか使われていないと思いますが、一定時間累積しての表示なのか、複数の棒グラフが反応してました。それを見ると、全部のコアが区別なく使用されているようです。

次は、24Cの場合の様子です。左半分の16本がPコアで、一つおきに本体とそのHTが表示されていると思われます。棒グラフを見ると、そのHTが選択から除外されている様子がわかります。PコアとEコア(おそらく右半分の16本)はあまり区別なく選択されてます。

最後は8Cの場合の様子です。Pコアの物理コア部分のみが選択されてます。右半分のEコアは選択から外れてました。

32Cのシングルコアベンチマークでは、PコアのHTが選択されることもあるので、スコアが下がるのではと予想してました。しかし24Cより好成績でした。想像ですが、HTが選択されても、対応する物理コアが動いていなければ、物理コアと同等の性能が出せるのかもしれません。その結果、作者の方の分析通り、Pコアが選択される確率の高い32Cの方が24Cよりも好成績になったのかと思われます。

ちなみに、マルチコアのベンチマーク時は、どのコア設定でも大差ありませんでした。CPU使用状況を見ると、ほぼどのスレッドもフルに稼働しています。重い作業をさせるベンチマークテストでは、スレッド優先順位が適切に設定されていても、結局は全てのスレッド総出で使用されるので、差が出ないのかと思いました。

まとめ

13900KFのコア数設定を調整するCpuTopologyRebuild.kextを使ってみました。物理コアとハイパースレッド (HT) の数をmacOSに適切に伝えるためのkextです。ベンチマークテストで比較した結果、argで-ctrsmtをつけてこのkextを使い、物理コア8に設定することで、より良い性能を得られました。素晴らしいkextを作っていただきありがとうございます。