◆消費電力測定(グラフ129~139)

さて最後のテストは消費電力測定である。実は今回、「Intel 7」を利用した初製品という事もあるので、色々細かくデータを取りたかったのだが、BIOS Setupでの操作に色々制約がある(すぐにフリーズしてブートしなくなる:CMOSリセットで元に戻るので致命的ではないのだが)ということで、標準状態でのテストのみとなっている。またP-Coreのみ/E-Coreのみでの消費電力測定も、そんなわけで行えていない。

ということでまずグラフ129がSandraのDhrystone/Whetstone実施中、グラフ130がCineBench R23(All CPUとOne CPUの両方)、グラフ131がProcyon 2.0のOffice Productivity、グラフ132が(これはIntel系だけだが)LinpackでSize/LDA=60000の実施、グラフ133がTMPGEnc Vide Mastering Works 7で4streamのX.265エンコードの最初の240秒、グラフ134が3DMark FireStrike、グラフ135がF1 2021の2Kでのベンチマーク、グラフ136がMetro Exodus Enhanced Editionの、やはり2Kでのベンチマークの実効消費電力変動を示したものである。グラフ137がそれぞれの平均消費電力(と一部ピーク時消費電力)、それと待機時の消費電力をまとめたもの、グラフ138が個々の消費電力と待機時との差をまとめたものである。

  • グラフ129

  • グラフ130

  • グラフ131

  • グラフ132

  • グラフ133

  • グラフ134

  • グラフ135

  • グラフ136

  • グラフ137

  • グラフ138

Dhrystone/Whetstone、なぜかAlder Lakeの2製品ではベンチマーク中に4回ほど消費電力が下がるタイミングがあるので、平均値はそこを外す形で計測しているが、とりあえずピークで360W近く、平均でもDhrystoneで311W、Whetstoneで282Wと飛びぬけて多い。さすがPL1tauが条件次第では∞に続くだけのことはある。Rocket Lakeの時も随分大きいと思ったが、Core i9-12900Kはこれを余裕で上回っている。これはCineBenchもそうで、All CPUの場合、353.4W。Ryzen 9 5950Xの234.3Wはもとより、Core i9-11900Kの300.3Wと比べても十分に高い。あるいはProcyonにおけるピークの消費電力は345.6W。LINPACKでは379.9Wとなっており、GPU負荷が殆どない、CPUだけを高負荷で利用するようなシーンで、400W近い消費電力を覚悟する必要がある。GPUを抜きにして、CPUの利用だけで400W程度を想定しないといけないというのは、なかなかすさまじい数字である。

ただ、必ずしも「常に消費電力が高い」という訳ではない。例えばProcyonにしても、一連のシナリオを終わらせるまでの平均消費電力で言えば131.7Wで、むしろRyzen 5000シリーズよりむしろ少ない程度だ。あるいはCineBenchにしても、One CPUでの消費電力は124.3Wとそれほど高くない。

この傾向がもっと顕著なのは、GPUを使うシーンだ。3DMark FireStrike Demo、F1 2021、Metroの3つとも、Ryzen 9 5950Xの方がCore i9-12900Kを上回っている(その差は50W前後)から、Ryzen 5000シリーズの方が省電力とも単純には言いにくい。

要するに、CPUの負荷がそこそこのケースにおいては、Alder LakeはRocket Lakeよりも省電力に動く。Procyonの結果などその最たる例であり、スコアは他のどのCPUよりも高いのに、平均消費電力は134.1Wとかなり低い。つまり、負荷がそれほど掛からないような使い方をする限りにおいて、Alder Lakeは非常に優秀な性能/消費電力比を示す。その一方で、高負荷を掛けたときの消費電力は半端ない。そういう、ジキルとハイド的な二面性を持った製品と理解する必要がある。

実際、CineBenchの場合を例に、電力効率を計算してみたのが表2である。CineBenchのSingle CPU/Multi CPUのScoreとそれぞれの稼働中の平均消費電力/平均消費電力差から、Score/W(消費電力1WあたりのScore)を算出したものだ。当然数字が大きいほど良い訳であるが、実際にBest(水色枠)を示したのはMulti CPUだとRyzen 9 5950X、Single CPUだとAlder Lakeという格好になっており、例えば実効消費電力差でみるとCore i9-12900Kの効率はRyzen 9 5950Xの6割程度(95.45 vs 154.36)でしかない。ということは、Ryzen 9 5950Xと同じスコアを出そうとすると、必要な電力は1.62倍近くに増える事になる。それは消費電力が増える訳である。

  • ■表2

実はこの特性、Intelの資料にもそれとなく記されている。こちらのスライドだが、250W動作のCore i9-11900Kと65WのCore i9-12900Kが同等の性能であり、125Wに増やすと30%アップ、241Wに増やすと50%アップとされる。ということは65WにおけるCore i9-12900Kの性能/消費電力比を1とした場合、125W動作だと効率は0.676、241W動作だと効率は0.405まで落ちる計算になる。勿論アーキテクチャ側の問題もあるにせよ、Intel 7はまるで登場した直後の14nmプロセスによく似ている気がしてならない。つまり低めの消費電力(≒低めの動作周波数)で使う分には非常に良い特性だが、ちょっとそこから消費電力を上げていってもなかなか性能が上がらない(というか、動作周波数をちょっと上げると、急速に消費電力が増える)というキャラクタだ。

この特性をグラフにプロットすると、グラフ139の様になる。破線は近似曲線だし、サンプル数が少ないからあくまでも目安でしかないが、できれば100W位に消費電力を絞って使う方が幸せになれそうな気がする。

  • グラフ139

考察と総評 - 性能はかなり良い、しかし課題も少し

取り急ぎAlder Lakeの2製品の評価をお届けした。確かに性能は悪くないというか、かなり良いと思う。

Core i9-12900Kはさておきとしても、Core i5-12600Kは恐ろしく魅力的な製品になっている。Core i5-11600Kを大幅に上回る性能で、それでありながら消費電力は殆どのケースでCore i5-11600Kと同等とそれ以下である。競合製品であるRyzen 5 5600Xを圧倒的にしのぐ性能になっており、逆にRyzen 5 5600Xの競争力低下が心配になるレベルである。

Core i5-12600Kの優秀さの理由の一つは、TDPこそ125W枠ながら、PL2が150Wと低めに抑えられており、それもあって無理に性能を引き出すべく消費電力を増やしたりしないため、性能/消費電力比が比較的良いバランスに収まっていることだろう。先の表2で見ても、実効消費電力絶対値ベースではMulti CPUで2番手、実効消費電力差ベースでもSingle CPUでトップ、Multi CPUで3番手に着けている。秋葉原での予想価格も39,000円前後だそうで、お求めやすい価格に収まっている。非常に魅力的と言わざるを得ない。

これと比べてしまうとCore i9-12900Kは負荷が低い時には悪くないのだが、負荷が高くなると途端に燃費の悪いプロセッサに化ける感じがある。そんな訳で、現実問題として定格で運用する限りの最低でも240mm、現実的には360mmラジエタークラスの簡易水冷クーラーで常用する方が良いだろう。絶対性能は悪くないだけに、「PL2をもっと下げられれば魅力的な製品になるだろうに」と、個人的にはちょっと惜しいという気持ちになった。

加えると、それこそCineBenchやPOV-Ray、PCMark 10/Procyonなどの"ほぼCPU性能で決まる"シチュエーションではきちんとその性能の高さが確認できたが、3DMarkや殆どのゲームでは、Intelの説明(例えばこれ)に反して、その性能を確認できなかった。いや別に性能が低いということはないのだが、高くもなかったとしか言いようもない。

そしてAlder Lakeの扱いを現時点で難しくしているのは、まだHybrid Architectureの実装が粗削りな部分が見える事だ。これはCPU側とOS側、両方の問題である。そもそもAlder Lakeの場合、「あるThreadを強制的にP-CoreなりE-Coreで動かす」事を外部から直接制御する仕組みはない。Task ManagerのProcessor Affinityの設定を使って、「E-CoreなりP-Coreに一切割り当てない」という間接的な制御は可能だが、直接的な設定は不可能である。

実はこのあたり、冒頭のPhoto02のキャプションで触れた"Game Dev Guide for Alder Lake Performance Hybrid Architecture"に記されているのだが、これはゲーム開発者向けに、どんな風にThreadから制御を行うべきかをまとめた文章である。この中で、ソフトウェア側から明示的にThreadをどちらのプロセッサで動かすかを支持するための「ヒント」として提供されるAPIとして

  • SetThreadPriority(スレッドの優先度の設定:THREAD_MODE_BACKGROUND_BEGIN/THREAD_MODE_BACKGROUND_END/THREAD_PRIORITY_ABOVE_NORMAL/THREAD_PRIORITY_HIGHEST/THREAD_PRIORITY_TIME_CRITICALREALTIME_PRIORITY_CLASS)
  • SetThreadInformation(メモリ及び消費電力の優先度に関する設定)
  • SetThreadSelectedCPUSets(利用したいコアの指定)

が提供されているとするが、ただAlder LakeのThread DirectorはこのAPIで指示された設定を「参考にしながら」、どのThreadをどのコアのThread poolに登録するかを決定するので、必ずしも指定されたThread poolに登録されるという保証は(少なくとも今のところは)無い様だ。そしてこれらの指定が無い場合、Threadの振る舞いをThread Directorが適当に推定して割り振る格好だが、この推定が必ずしも正確とは限らない、というのはSandraのProcessor Testで特に1Tの場合にCore i9-12900KがE-Coreばかり割り当てられている様に見える事を見ればわかりやすい。

話が厄介なのは、big.LITTLEの場合は「あるThreadの負荷が上がったら、それがLITTLEコアで動作している場合には途中からbigコアにThreadを移し替える」「あるThreadの負荷が下がったら、それがbigコアで動作している場合には途中からLITTLEコアにThreadを移し替える」という処理があるので、仮に最初のThreadのコアへの割り当てが不適切だった場合、途中からこれがダイナミックに是正できるが、現時点でのThread Directorの説明を聞いている限り、少なくともダイナミックにP-CoreとE-Coreの間をThreadが行き来するというよりは、ThreadがIdleあるいはInactiveになって、そこから再び活動を始めるときに割り当てを変える、という形になっている様に聞こえる。煩雑にActive/Idleを繰り返すThreadであればこれでもいいのだろうが、SandraのBenchmarkの様に一連の処理が終わるまで走り続けるThreadには今一つそぐわない気がする。

この辺りがちゃんと動くようになるためには、アプリケーションがこうしたThreadの設定を持たないといけないのだが、それにはまだ時間が掛かるだろう。ちなみにArmがbig.LITTLEを発表した時に、Android上で動くアプリケーションにもやはり同じ問題が発生しており、これはアプリケーションが長い時間をかけてbig.LITTLE対応を進めていったことで解決している。Armの場合、殆どのMobile向けSoCが一斉にbig.LITTLE対応に走ったからアプリケーション開発者としても早期に対応する動機付けがあった訳だが、さてx64の世界ではどの程度かかるだろう?

という訳で、現状のAlder Lake、特にCore i9-12900Kはまだ色々とこなれてない部分が目立つのは事実だ。Golden Coveコアの性能の高さは認められるが、Hybrid Architectureに起因する実装の不備とか、PL2駆動時の性能/消費電力比の悪さなどはちょっとネガティブなポイントである。さらに今回はプラットフォームが丸ごと刷新になったので、CPUだけでなくマザーボードとCPUクーラー、場合によってはメモリも買い替えることが必要になる。昨今のパーツ不足と相まって、フルセットの入手にはそれなりのコストが掛かる訳で、場合によっては「こんなに出費したのに、性能差があまり感じられない」なんてケースもあり得る。その意味でも、今回は軽いアップグレードと思うのではなく、色々覚悟をして臨む必要があるだろう。