Alderlake i9 12900K のコアとキャッシュの構成と速度
Alderlake i9 12900Kのコアとキャッシュの構成はこんな感じになっているとされている。
まずP-coreが8個でこの子たちは1.25MBのL2キャッシュを独立して持っている。
一方、E-coreは4個をひとつのかたまりにしたのが2つで、かたまりごとに2MBの共有L2キャッシュを持っている。
そして、30MBのL3キャッシュは全コアで共有している。

Alderlakeのコア・キャッシュ構成
こうしたCPUの構成をOSがどう認識しているかは、Coreinfoというアプリを使うか、GetLogicalProcessorInformationという関数を呼ぶことで確認することができる。
今回は、自作アプリのram_speedの中でGetLogicalProcessorInformation関数で情報を取得し、整理して表示してみた。
ram_speed64.exe --cpuinfo
まず、CPU cores では論理コアと物理コアの対応関係を確認している。"P"のついているコアはP-coreなので、HTTオンで1物理コアで2論理コア、"E"のついているコアはE-coreなので、HTTオフで1物理コアで1論理コアとなっている。
CPU Cachesでは各キャッシュと論理コアの対応関係を確認できる。
・L1D/L1Iはそれぞれのコアで独立
・L2はP-coreでは独立だけど、E-coreでは4コアごとに共有されている
・L3は全コアで共有
というのがOSでもきちんと認識されていることが確認できる。
こんな感じでWindowsはP-coreから順に認識しているので、タスクマネージャ上でもP-coreが先に来る表示になっている。負荷がかかった時の傾向が異なるので、見ていて面白い。(下はx265エンコーダ中の例)
なんとなく、なるべくP-coreの2スレッド目はあまり使わないようにしているのがわかる。やはりHTTで2スレッド目を入れると全体のスループット自体は上がるけど、コア内リソースを共有することで個々のスレッドの速度は落ちるため、これを避けようとしているのだと思う。
一方で、E-coreについてはまたちょっと違った負荷のかかり方になっていて、半分ぐらい使っている感じ。

Alderlakeのコア間通信時間
ここまで紹介したように、Alderlakeはキャッシュの構成もP-core/E-coreで異なり、ちょっと変わった感じになっている。
こういうキャッシュの構成はコア間の通信にも効いてくるので、ram_speed 0.03で各物理コア間の通信時間を測った。

※P-coreはHTTがあるので、同一コア内の通信がある。E-coreにはHTTがないので、同一コア内の通信がなく空白。
P-core間の通信は比較的高速で、P-coreとE-core間の通信、それから別のかたまりのE-coreとの間の通信がそれと比べるとやや遅い感じになっている。
よくわからないのは同じかたまりに入っているE-core同士の通信で、L2キャッシュを共有しているのだから別のかたまりのE-coreとの間の通信よりは当然速かろうとと思ったら、なぜか逆に一番遅くなっている。
解せぬ。
まあ、わずかな差なのでそこまで影響はなさそう(少なくともRyzenのCCD間通信の遅さと比べればなんてことはない)だが、E-core同士の通信はちょっと遅いかもね、という感じ。
Alderlakeのキャッシュとメモリの速度
あとはAlderlakeのキャッシュとメモリの速度を図るため、いつもの自作アプリ(ram_speed)で測定してみた。
今回は下記の3パターンで測定。
・全コア(ram_speed64)
・P-coreのみ(ram_speed64 --target pcore)
・E-coreのみ(ram_speed64 --target ecore)
DDR5環境でもやってみたかったけど、DDR4環境なので仕方ない。
比較環境
まずキャッシュとメモリのレイテンシの測定で、キャッシュの構造のわかりやすいアクセスパターンから。
P-coreのL2=1.25MB, L3=30MB、それからE-coreのL2=2MB, L3=30MBが見えていると思う。11700Kと比べるとL2が増加した分(512K→1280K)、レイテンシは若干増えているのがわかると思う。一方で、L3については11700Kと比べて容量増加にもかかわらずレイテンシは削減できているように見える。
E-coreはレイテンシ長め。

次に完全ランダムアクセスのレイテンシ。
先ほどと同じで、12900KのP-coreを11700Kと比べると、L2に関してはキャッシュ量の増大もあってレイテンシがやや増加、L3については短縮傾向にあるのがわかる。(ただしメモリアクセスでは同じDDR4なのでほぼ同等)
5950Xとの比較すると、2MB~32MB前後では12900Kのほうがレイテンシが大きい。これはやはり5950Xはこのあたり巨大なキャッシュによりレイテンシをかなり抑えられているのが大きいと思う。ただし、メモリアクセスのレイテンシは微妙に12900Kのほうが小さい。
E-coreは全体的にレイテンシは大きめ。まあこのあたりは効率重視なコアなので仕方ないだろう。

シングルスレッドのメモリ・キャッシュ帯域。
まず12900K Pcoreから見ると、L1帯域が最大なのはRocketlake(11700K)。これはAVX512が唯一使えるCPUであるため。L2からは12900K Pcoreのほうが帯域が広く、そしてキャッシュ量の大きいことがわかる。L2までは5950Xよりも帯域が広い。
L3付近は11700Kよりは改善がみられるものの、相変わらずRyzen(5950X)のほうが速い。ただし、さらにサイズが大きくなってメモリアクセスの領域に入ると逆転している。12900Kのングルスレッドのメモリ帯域は前世代のRocketlakeから大幅に向上しており、コアの内部バッファ(load buffer, L1 fill bufferなど)拡張等が効いているのだと思われる。
Ecoreのほうを見るとやはりキャッシュの帯域は比較的狭い。特にL1で差が大きいのはEcoreが基本128bitでの実装で、AVX/AVX2の256bitロードも128bitx2として処理されるためだと思う。その結果L1~L2までほぼフラットに帯域が出るのは逆に面白い。
EcoreからのL3以降へのアクセス帯域はかなり控えめ。リングバスとの接続が狭いとかそういう感じ?

マルチスレッドのメモリ・キャッシュ帯域。
基本的な傾向はほぼ変わらず。
L1キャッシュ帯域は5950Xと12900Kはほぼ互角だが、全体的にみると16のPcoreを持つ5950Xのほうがキャッシュサイズも大きいこともあって広い帯域が確保できている。

最後にスレッド数を変えたときのメモリ帯域。
12900Kの1スレッドでのメモリ帯域は37.1GB/sで、11700Kの32.2GBsから大きく向上している。ただ、4スレッド前後では11700Kのほうが速度が出ているのが謎。
最終的なマルチスレッドでの帯域は最大で49GB/sぐらいで、これは11700Kや5950Xもだいたい同じなので、このあたりがDDR4-3600 2chの限界なのかもしれない。
Ecoreの1スレッドのメモリアクセス性能はやはり少し低め。また、5スレッド目を使い始めると少しまた帯域が伸びることから、2つあるEcoreのかたまりを両方使わないと十分なメモリアクセス性能が出ないみたい。やはりEcoreのブロックからリングバスとの間がちょっと狭いのかな、と感じるような結果だ。
ただ、全Ecoreを使った時のメモリ帯域は45.4GB/sと、Pcoreの49.1GB/sとさほど変わらない。マルチスレッドでのメモリアクセス性能は悪くなさそうだ。

終わりに
IntelのメインストリームCPUはNehalemからSkylakeまで長くL2=256K、L3=2MB/コアを継続してきた。
一方Zen2以降製造プロセスで優位に立ったRyzenは、IOダイにより生じるレイテンシ増加の影響を抑制する意図もあってか、高速なキャッシュを多く搭載するようになってきている。
Intelも10nmに移行してからIcelake→Tigerlake/Alderlakeとキャッシュ量を増加させていて、特に今回の12900Kの結果からはキャッシュ・メモリに関しても性能向上が図られていることが確認できた。こういったところもPcoreの非常に強力なシングルスレッド性能を下支えしているのだと思う。(まあキャッシュ量の増加はレイテンシを増加させやすいらしいので大きければいいというものでもないらしいが…)
Ecoreのみについても確認してみたが、Pcoreと比べると微妙だが、少なくとも一昔前のAtomとは全然違って、キャッシュやメモリアクセスに関してもそこそこの性能が確保できていることがわかった。こちらは効率重視なので、そこまで性能が求められるわけではないことを思えば、まあこのぐらいで十分、ということなのだと思う。
まずP-coreが8個でこの子たちは1.25MBのL2キャッシュを独立して持っている。
一方、E-coreは4個をひとつのかたまりにしたのが2つで、かたまりごとに2MBの共有L2キャッシュを持っている。
そして、30MBのL3キャッシュは全コアで共有している。

Alderlakeのコア・キャッシュ構成
こうしたCPUの構成をOSがどう認識しているかは、Coreinfoというアプリを使うか、GetLogicalProcessorInformationという関数を呼ぶことで確認することができる。
今回は、自作アプリのram_speedの中でGetLogicalProcessorInformation関数で情報を取得し、整理して表示してみた。
ram_speed64.exe --cpuinfo
まず、CPU cores では論理コアと物理コアの対応関係を確認している。"P"のついているコアはP-coreなので、HTTオンで1物理コアで2論理コア、"E"のついているコアはE-coreなので、HTTオフで1物理コアで1論理コアとなっている。
12th Gen Intel Core i9-12900K [5.00GHz] (8P+8E,16C/24T)
CPU cores
core 0 P : **----------------------
core 1 P : --**--------------------
core 2 P : ----**------------------
core 3 P : ------**----------------
core 4 P : --------**--------------
core 5 P : ----------**------------
core 6 P : ------------**----------
core 7 P : --------------**--------
core 8 E : ----------------*-------
core 9 E : -----------------*------
core 10 E : ------------------*-----
core 11 E : -------------------*----
core 12 E : --------------------*---
core 13 E : ---------------------*--
core 14 E : ----------------------*-
core 15 E : -----------------------*
CPU Cachesでは各キャッシュと論理コアの対応関係を確認できる。
・L1D/L1Iはそれぞれのコアで独立
・L2はP-coreでは独立だけど、E-coreでは4コアごとに共有されている
・L3は全コアで共有
というのがOSでもきちんと認識されていることが確認できる。
CPU caches
cache L1D : **---------------------- : 12way 48KB
cache L1I : **---------------------- : 8way 32KB
cache L1D : --**-------------------- : 12way 48KB
cache L1I : --**-------------------- : 8way 32KB
cache L1D : ----**------------------ : 12way 48KB
cache L1I : ----**------------------ : 8way 32KB
cache L1D : ------**---------------- : 12way 48KB
cache L1I : ------**---------------- : 8way 32KB
cache L1D : --------**-------------- : 12way 48KB
cache L1I : --------**-------------- : 8way 32KB
cache L1D : ----------**------------ : 12way 48KB
cache L1I : ----------**------------ : 8way 32KB
cache L1D : ------------**---------- : 12way 48KB
cache L1I : ------------**---------- : 8way 32KB
cache L1D : --------------**-------- : 12way 48KB
cache L1I : --------------**-------- : 8way 32KB
cache L1D : ----------------*------- : 8way 32KB
cache L1I : ----------------*------- : 8way 64KB
cache L1D : -----------------*------ : 8way 32KB
cache L1I : -----------------*------ : 8way 64KB
cache L1D : ------------------*----- : 8way 32KB
cache L1I : ------------------*----- : 8way 64KB
cache L1D : -------------------*---- : 8way 32KB
cache L1I : -------------------*---- : 8way 64KB
cache L1D : --------------------*--- : 8way 32KB
cache L1I : --------------------*--- : 8way 64KB
cache L1D : ---------------------*-- : 8way 32KB
cache L1I : ---------------------*-- : 8way 64KB
cache L1D : ----------------------*- : 8way 32KB
cache L1I : ----------------------*- : 8way 64KB
cache L1D : -----------------------* : 8way 32KB
cache L1I : -----------------------* : 8way 64KB
cache L2 : **---------------------- : 10way 1280KB
cache L2 : --**-------------------- : 10way 1280KB
cache L2 : ----**------------------ : 10way 1280KB
cache L2 : ------**---------------- : 10way 1280KB
cache L2 : --------**-------------- : 10way 1280KB
cache L2 : ----------**------------ : 10way 1280KB
cache L2 : ------------**---------- : 10way 1280KB
cache L2 : --------------**-------- : 10way 1280KB
cache L2 : ----------------****---- : 16way 2048KB
cache L2 : --------------------**** : 16way 2048KB
cache L3 : ************************ : 12way 30720KB
こんな感じでWindowsはP-coreから順に認識しているので、タスクマネージャ上でもP-coreが先に来る表示になっている。負荷がかかった時の傾向が異なるので、見ていて面白い。(下はx265エンコーダ中の例)
なんとなく、なるべくP-coreの2スレッド目はあまり使わないようにしているのがわかる。やはりHTTで2スレッド目を入れると全体のスループット自体は上がるけど、コア内リソースを共有することで個々のスレッドの速度は落ちるため、これを避けようとしているのだと思う。
一方で、E-coreについてはまたちょっと違った負荷のかかり方になっていて、半分ぐらい使っている感じ。

Alderlakeのコア間通信時間
ここまで紹介したように、Alderlakeはキャッシュの構成もP-core/E-coreで異なり、ちょっと変わった感じになっている。
こういうキャッシュの構成はコア間の通信にも効いてくるので、ram_speed 0.03で各物理コア間の通信時間を測った。

※P-coreはHTTがあるので、同一コア内の通信がある。E-coreにはHTTがないので、同一コア内の通信がなく空白。
P-core間の通信は比較的高速で、P-coreとE-core間の通信、それから別のかたまりのE-coreとの間の通信がそれと比べるとやや遅い感じになっている。
よくわからないのは同じかたまりに入っているE-core同士の通信で、L2キャッシュを共有しているのだから別のかたまりのE-coreとの間の通信よりは当然速かろうとと思ったら、なぜか逆に一番遅くなっている。
解せぬ。
まあ、わずかな差なのでそこまで影響はなさそう(少なくともRyzenのCCD間通信の遅さと比べればなんてことはない)だが、E-core同士の通信はちょっと遅いかもね、という感じ。
Alderlakeのキャッシュとメモリの速度
あとはAlderlakeのキャッシュとメモリの速度を図るため、いつもの自作アプリ(ram_speed)で測定してみた。
今回は下記の3パターンで測定。
・全コア(ram_speed64)
・P-coreのみ(ram_speed64 --target pcore)
・E-coreのみ(ram_speed64 --target ecore)
DDR5環境でもやってみたかったけど、DDR4環境なので仕方ない。
比較環境
CPU | i9 12900K | i7 11700K Gear1 | Ryzen9 5950X | Ryzen7 3700X | Ryzen7 1700X |
---|---|---|---|---|---|
Cores | 16C/24T | 8C/16T | 16C/32T | 8C/16T | 8C/16T |
RAM | DDR4-3600 2ch | DDR4-3600 2ch | DDR4-3600 2ch | DDR4-3600 2ch | DDR4-2666 2ch |
Timing | 16-19-19-39-1 | 18-22-22-42-2 | 19-20-20-40-1 | 18-22-22-43-1 | 16-16-16-38-1 |
まずキャッシュとメモリのレイテンシの測定で、キャッシュの構造のわかりやすいアクセスパターンから。
P-coreのL2=1.25MB, L3=30MB、それからE-coreのL2=2MB, L3=30MBが見えていると思う。11700Kと比べるとL2が増加した分(512K→1280K)、レイテンシは若干増えているのがわかると思う。一方で、L3については11700Kと比べて容量増加にもかかわらずレイテンシは削減できているように見える。
E-coreはレイテンシ長め。

次に完全ランダムアクセスのレイテンシ。
先ほどと同じで、12900KのP-coreを11700Kと比べると、L2に関してはキャッシュ量の増大もあってレイテンシがやや増加、L3については短縮傾向にあるのがわかる。(ただしメモリアクセスでは同じDDR4なのでほぼ同等)
5950Xとの比較すると、2MB~32MB前後では12900Kのほうがレイテンシが大きい。これはやはり5950Xはこのあたり巨大なキャッシュによりレイテンシをかなり抑えられているのが大きいと思う。ただし、メモリアクセスのレイテンシは微妙に12900Kのほうが小さい。
E-coreは全体的にレイテンシは大きめ。まあこのあたりは効率重視なコアなので仕方ないだろう。

シングルスレッドのメモリ・キャッシュ帯域。
まず12900K Pcoreから見ると、L1帯域が最大なのはRocketlake(11700K)。これはAVX512が唯一使えるCPUであるため。L2からは12900K Pcoreのほうが帯域が広く、そしてキャッシュ量の大きいことがわかる。L2までは5950Xよりも帯域が広い。
L3付近は11700Kよりは改善がみられるものの、相変わらずRyzen(5950X)のほうが速い。ただし、さらにサイズが大きくなってメモリアクセスの領域に入ると逆転している。12900Kのングルスレッドのメモリ帯域は前世代のRocketlakeから大幅に向上しており、コアの内部バッファ(load buffer, L1 fill bufferなど)拡張等が効いているのだと思われる。
Ecoreのほうを見るとやはりキャッシュの帯域は比較的狭い。特にL1で差が大きいのはEcoreが基本128bitでの実装で、AVX/AVX2の256bitロードも128bitx2として処理されるためだと思う。その結果L1~L2までほぼフラットに帯域が出るのは逆に面白い。
EcoreからのL3以降へのアクセス帯域はかなり控えめ。リングバスとの接続が狭いとかそういう感じ?

マルチスレッドのメモリ・キャッシュ帯域。
基本的な傾向はほぼ変わらず。
L1キャッシュ帯域は5950Xと12900Kはほぼ互角だが、全体的にみると16のPcoreを持つ5950Xのほうがキャッシュサイズも大きいこともあって広い帯域が確保できている。

最後にスレッド数を変えたときのメモリ帯域。
12900Kの1スレッドでのメモリ帯域は37.1GB/sで、11700Kの32.2GBsから大きく向上している。ただ、4スレッド前後では11700Kのほうが速度が出ているのが謎。
最終的なマルチスレッドでの帯域は最大で49GB/sぐらいで、これは11700Kや5950Xもだいたい同じなので、このあたりがDDR4-3600 2chの限界なのかもしれない。
Ecoreの1スレッドのメモリアクセス性能はやはり少し低め。また、5スレッド目を使い始めると少しまた帯域が伸びることから、2つあるEcoreのかたまりを両方使わないと十分なメモリアクセス性能が出ないみたい。やはりEcoreのブロックからリングバスとの間がちょっと狭いのかな、と感じるような結果だ。
ただ、全Ecoreを使った時のメモリ帯域は45.4GB/sと、Pcoreの49.1GB/sとさほど変わらない。マルチスレッドでのメモリアクセス性能は悪くなさそうだ。

終わりに
IntelのメインストリームCPUはNehalemからSkylakeまで長くL2=256K、L3=2MB/コアを継続してきた。
一方Zen2以降製造プロセスで優位に立ったRyzenは、IOダイにより生じるレイテンシ増加の影響を抑制する意図もあってか、高速なキャッシュを多く搭載するようになってきている。
Intelも10nmに移行してからIcelake→Tigerlake/Alderlakeとキャッシュ量を増加させていて、特に今回の12900Kの結果からはキャッシュ・メモリに関しても性能向上が図られていることが確認できた。こういったところもPcoreの非常に強力なシングルスレッド性能を下支えしているのだと思う。(まあキャッシュ量の増加はレイテンシを増加させやすいらしいので大きければいいというものでもないらしいが…)
Ecoreのみについても確認してみたが、Pcoreと比べると微妙だが、少なくとも一昔前のAtomとは全然違って、キャッシュやメモリアクセスに関してもそこそこの性能が確保できていることがわかった。こちらは効率重視なので、そこまで性能が求められるわけではないことを思えば、まあこのぐらいで十分、ということなのだと思う。
スポンサーサイト