世界を動かす技術を、日本語で。

EコアがAppleシリコンを高速にする理由

概要

Apple silicon Macの 高いパフォーマンス は、実は Efficiencyコア(Eコア) の貢献が大きい。 Eコアは バックグラウンド処理 を担当し、ユーザーアプリの快適動作に寄与。 Quality of Service(QoS) により、スレッドがPコアとEコアに適切に割り当てられる仕組み。 macOSは バックグラウンドプロセス をPコアに移さず、システム全体の効率とバッテリー寿命を維持。 Eコア数の増加により、 多くのプロセス を効率的に処理可能となった。

Apple silicon Macのパフォーマンスの秘密

  • Apple silicon Macは M1登場以来、圧倒的な速度 を実現
  • ユーザーは 画像・音声・動画編集やソフトウェア開発 でその恩恵を体感
  • 一般的に Performanceコア(Pコア) が注目されがちだが、実際は Efficiencyコア(Eコア) が裏で活躍
  • Eコアは バックグラウンドタスク (Spotlightのインデックス作成、Time Machine、XProtect Remediatorなど)を担当
  • Pコアは ユーザーアプリ用にリソースを確保 し、バックグラウンドの影響を受けにくい設計
  • Intel Macと異なり、 複数のmdworkerプロセスが高CPU率 でもアプリのパフォーマンス低下が少ない
  • 視覚的なCPU使用率の比較は 誤解を招きやすい心理的要因 (EコアはPコアの1/4程度の周波数で動作)

QoSとスレッド管理の進化

  • Appleは iPhone 7(2016年) からPコア・Eコア分離を導入
  • Armの big.LITTLEアーキテクチャ を採用し、さらに独自最適化
  • Quality of Service(QoS) により、スレッドを 優先度と役割で明確に分離
  • macOSでは OS X Yosemite(10.10) からQoSを導入し、現在は中心的役割
  • QoSは、 従来のnice優先度 よりも効率的にリソース配分を実現
  • フォアグラウンドスレッド はPコア優先、必要に応じてEコアにも割り当て
  • バックグラウンドスレッド は原則Eコア専用、Pコアには割り当てられない
    • App Tamerやtaskpolicyコマンドでの昇格も不可
  • この仕組みにより、 アプリの快適さとバッテリー寿命 を両立

ソフトウェアアーキテクチャの変化

  • 旧来の モノリシックアプリ から、 タスクごとに分割されたプロセス へ移行
  • 2,000以上のスレッド、600以上のプロセス がアイドル状態でも動作
  • Eコアで多くのプロセスを処理することで、 メインアプリのパフォーマンス向上
  • M1 Pro/Maxまでは Eコア2基 だったが、以降のMシリーズは 最低4基、多いモデルで6〜8基
  • Efficiencyコアの増加 がバックグラウンド処理能力を大幅に向上

コアごとの動作周波数とQoS

  • M4 Pro例: Pコアの高QoSスレッドは最大4,512MHz で動作
  • Eコアの低QoSスレッドは約1,050MHz (アイドルに近い)
  • Eコアで高QoSスレッドを処理時は最大2,592MHz 程度
  • EコアとPコアの周波数比は約1/4 (1,050/4,512≒0.233)
  • 他のMシリーズチップでも 同様の傾向

まとめ

  • Apple silicon Macの快適さ は、 EコアとQoS制御 によるバックグラウンド処理最適化の成果
  • 多コア化・効率的なリソース配分 が、ユーザー体験と省電力を両立
  • 従来のIntel Macの常識 が通用しない 新時代のアーキテクチャ

Hackerたちの意見

このプロセッサーは全体的に良いよ。Pコアもすごいし。去年の10月にM4のノートパソコンと高性能なWindowsデスクトップを比較するパフォーマンステストをやったんだけど、結果はMシリーズのチップが一番良かったよ。

これはおそらくWindowsのファイルシステムのベンチマークに近いね。Windowsはファイルアクセスの速さに制限があるから、ファイルシステムフィルタードライバーのせいで。もしLinux(またはWSL2、WSLファイルシステムイメージ内にいる限り)で再度試したら、かなり改善されると思うよ。

こちらはIntelの新しいPanther Lakeチップとの最近の比較だよ。

君の記事からすると、コンパイル時間のベンチマークをしてるみたいだね。私はこの分野の専門家じゃないけど、ARMのコンパイル時間とIntelを比べる意味があるとは思えないな。コンパイルには多分、いろんなトリックがあって、命令セットも違うしね。

私のM4ミニは、家の中でおそらく一番パフォーマンスが良いコンピュータだよ。しかも一番安かった。たまにゲームマシンとしても悪くないし。

ちょっと真面目な質問なんだけど、Appleシリコンが速いって話をする時、WindowsのIntelノートパソコンと比べてるの?それともMacのIntelアーキテクチャと?LinuxのIntelノートパソコンを使ってる時は、CrowdStrikeやたくさんの企業用ソフトがあっても遅くならないんだ。ブログで「速い」って言ってるのは、動画編集やAIのような重い作業のことだと思ってたんだけど、日常的な作業でも新しいMacと新しいLinuxノートパソコンの間に速度の違いがあるのかな?ありがとう。

僕にとっては、ブート速度みたいなことが重要だね。コンピュータを再起動するのにどれくらい時間がかかるか。ログアウトして、アプリを全部開いた状態で再ログインするのに。IntelのMacはこういう基本的な機能で約2倍遅い感じがしたよ。(実際のデータは持ってないけど)Intel Macはアプリを開くときにラグがあったけど、シリコンMacはすぐに反応するし、いつもレスポンスが良い。Linuxとの比較はわからないけど。

Appleシリコンはサイズあたりのワット数で非常に速いよ。驚くべきことは、ファンがなくて軽いMacBook Airが、最上級のデスクトップPCと競争できる感じがすることだね。

まず、AppleのCPUは一番速いわけじゃないよ。今のところ、速いCPUのトップ20はAMDとIntelだけの話かも。AppleのCPUはデザインや製造の選択肢のおかげで、効率的でパワフルだけどね。でも、君の質問に答えると、そうだね、Windows 11は現代のセキュリティのせいで、同じハードウェアでバニラLinuxより2〜3倍遅く感じるよ。

私はほぼ全てのプラットフォームとアーキテクチャを「日常使い」してるよ - x64、Apple Silicon、ARM Cortex、Linux/Mac/Windowsのいろんな組み合わせでね。Apple Siliconが出たときは、本当に新鮮な風が吹いた感じだった!ウェブがまたサクサクになったし、バッテリーも持ちが良かった!でも、ソフトウェアが膨張してMacBookがまた遅くなっちゃったし、RAMがパフォーマンスの大きな制約になることも多い。バッテリー寿命も今はもっと変動するしね。Intelは2020年以来、やっとAppleに追いついてきた。Panther Lakeは、シングルコア性能(バッテリー寿命も含めて)以外はかなり競争力があるよ。Panther LakeのCPUは、機能も良いし、Intel QSVはffmpegを使ってエンコードするのに便利だし、OpenVINOでローカルAIモデルを使うのもAppleのNPUを使うより簡単だよ。Intelはパフォーマンス分析のためのサンプリングやトレースツールも優れてるし、iGPUがどれだけ動いてるか(結構性能いいよ)やVRAMの使用量も見えるからね。最後に見たとき、AppleのCPU、GPU、NPUのどれでAIモデルが動いてるかを確認する方法はまだなかったよ。iGPUはシステムRAMをいろいろ設定できるけど、Appleの統一メモリとどう比較するかは分からないし、Appleはメモリ帯域幅が高くてレイテンシが低いからね。IntelがAppleに追いついたとは言わないけど、最新世代では競争力があるよ。

新しいMacのARMユーザーだよ。いいWindowsマシン(Ryzen 5?32GB)を置き換えたんだけど、古いIntelのMacとLinuxのワークステーション(6コアのRyzen 5、32GB)も持ってる。もちろん、Macは新しいんだけど、すごいよ。CPUが関係ないようなこと、例えば会社のVPNを通してリモートのSambaマウントを使うときでも、めちゃくちゃ速い! - IntelのMacよりも速いし - Windowsよりも速い - Linuxマシンに対しては改善点はあまり感じてないけど、今の仕事ではデスクトップとしてあまり使えなくなっちゃった(残念ながら)。もちろん、Debianのセットアップは好きだけど、ワークステーションの起動は遅いし、エンターテイメントボックスのスクリーンセーバー/スリープ/ウェイクアップは悪夢だよ(自分のせいだけど、よくあること!)。Macはスリープ/ウェイクアップも問題なし。Mac(最小のAir)は、モビリティの観点から見ても今までで一番いいノートパソコンだよ。すぐに起動するし、バッテリーも長持ちするし、キーボードもそこそこ良い(でも、もう少し長いキーの押し込みがあったらいいな)。

アップルが大好きで、主に個人用に使ってるけど、アップルユーザーは自分のマシンの速さを過大評価することが多いよね。数年前には「NVIDIAがアップルの統一シリコンアプローチに追いつくことはできるのか?」みたいな意見をよく見かけたけど、NVIDIAとアップルを比較すると、コストパフォーマンスではNVIDIAが圧倒的に勝ってるよ。

写真編集やコードコンパイルのような作業負荷でも、メモリ帯域幅の利点を感じることができるよ。それに、フォアグラウンドコンピュート用に予約されたパフォーマンスコアがあって、いつもの「Linuxはスワップが苦手」っていうのもあるし(これ、直ったのかな?最近Linuxマシンでスワップを有効にしてないから)、日常的な使い方に違いをもたらしているよ。

6ヶ月間Linuxを日常使いしてたけど、今はM1 Maxに戻って1ヶ月経ったよ。使いやすさやMacの便利な機能についての返信が見当たらなかったんだけど、Spotlightや写真アプリの顔認識、連絡先の同期とか、Linuxだと設定するのに時間がかかるんだよね。MacだとAppleアカウントさえあれば全部うまくいくし。もしLinuxがこういうバックグラウンドの作業を全部やらなきゃいけなかったら、今のMacみたいにスムーズに動くのかな?ちなみに、10年ぶりにLinuxを使ったんだけど、6ヶ月間ずっと使ってた。M1 Maxは、Linuxを使ってたフルタワーゲーミングPCよりも性能が上なんだよね。WindowsやLinuxも使ったことあるし、ゲーム用にWindowsも使ってた。Linuxの設定は企業のものがなくてすごく快適だったけど、PCのせいでオフィスが暑くなってた。M1はファンがほとんど回らないし、大きなDBの移行やソフトウェア開発中の重い作業でも静かなんだ。

なんか、2011年のMacBook Proが今まで使った中で一番速いノートパソコンだったんだよね。SSDを入れた後だけど。Appleシリコンのノートパソコンが何をしてるのか、時々不思議になる。

いい質問だと思う!街で「あなたのノートパソコンは速い?」って聞いたら、その人が使ってるソフトウェアの方が、ハードウェアよりも影響が大きいと思う。私のAppleシリコンのノートパソコンは、蓋を開けるだけでサクッと動くからすごく速く感じるんだ。これはCPUがすごく速く動いてるからじゃなくて、蓋を閉じたままでもバッテリーが長持ちするからなんだよね。

アイドル状態のMacが600以上のプロセスで2,000以上のスレッドを動かしてるってのはいいニュースじゃないね。 でも、そのうちの1つが暴れ出すと、Spotlightのインデックス作成がディスクスペースを少しずつ食いつぶしたり、iCloudの同期が何度も回ってアプリがDocumentsフォルダを読み込もうとするとフリーズしたり、Photosの同期が全コアを100%使ったりするから、ちょっと手に負えなくなってきてる気がする。こんなに動いてる部分が多いのに、どうやってシステムの挙動をモデル化したり予測したりできるんだろう?

もしそれが効果を発揮したら、ほぼ許容できるかも!でも、そうじゃない。Spotlightが/Applicationsフォルダをインデックスした後、command-spacebarを押して「preview.app」って入力すると、M4のノートパソコンでそのエントリーをsqliteデータベースから検索するのに約4秒かかるんだ。むかつく。

私にとってはiMessageだね。すごく頻繁に同期がずれるし、そのせいでCPUを食っちゃう。

典型的なWindowsの体験って感じだね。

SREが分散システムで扱っていることに徐々に近づいているね… 物事が完全に理解されることはないって受け入れなきゃいけないし、統計ツールを使う準備をしておくのがいいよ。エンジニアリングがうまくいけば、理解できる範囲のことだけを許可する低遅延の環境を維持できるかもしれない。

現代のmacOSアーキテクチャとその600の調整プロセス、グランドセントラルディスパッチの作業キューに対する私の不満はデバッグのしやすさだね。15年前、アプリがスピンし始めたりメールが来なくなったりしたら、Console.appを開いて、そのアプリが簡単にタグ付けできるエラーログを記録しているだろうと reasonably 信じられた。これが、神秘的なDNS解決の問題がすぐに半端なdiscoverydに結びついた理由だよ。今は、その600のプロセスと2000のスレッドが毎秒何千ものログエントリを出していて、認識できないデーモンが三重に委任された作業をしている中で、何十ものエラーが発生しているんだ。

誰かMacOSのスケジューラーやスレッドをEコアとPコアに配置するアルゴリズムについて知ってる人いる?スレッドが最後にI/Oでブロックされてたか、タイムスライスのタイムアウトでブロックされてたかを見て、I/OブロッカーをEコアに、タイムスライスブロッカーをPコアにマッピングするだけのシンプルなものなのかな?それとも、プログラマーがスレッド作成時に静的なマッピングを指定するのかな?私はMacでコードを書くことが多いけど、Clojureを使ってるから、低レベルのOSの決定は私には不透明なんだよね。

記事によると、PかEかは一般的に「バックグラウンド」プロセスかどうかで決まるみたいだね(それが何を意味するのかは別として)。多分、コード内の何らかの(文書化されていない)指定やバイナリのコンパイラへの指示が、コンパイル時にこれを決めてるのかも。

https://developer.apple.com/videos/play/tech-talks/110147/

ベースラインは静的で、低QoSのタスクはEコアに、そして高QoSのタスクはPコアに振り分けられるんだ。確か、高QoSのコアは全てのPコアが負荷がかかっているときにEコアに移動できるけど、最も低いQoSのタスク(バックグラウンド)はPコアに昇格することはないって理解してる。

Appleがxnuリポジトリに持ってるスケジューラのドキュメントをチェックしてみて。 https://github.com/apple-oss-distributions/xnu/blob/main/doc...

私のM2 MBAにはファンがないけど、今の時期のIntelシステムの大半よりも全然パフォーマンスがいいよ。あのレガシーなx86アプリは、もうほとんどの人には存在しないしね。

ヒートシンクとケースの間に1mmのサーマルパッドを置くと、CPUやGPUがすぐにスロットルしなくなるよ。少なくとも私のM3 MBAではね(実際のクリアランスを確認してね)。MacPro5,1をM2Proに交換したんだけど、同じような単純作業をするのにエネルギーをめちゃくちゃ少なく使うんだ(約15倍以上)。アイドル時は約25W対160Wだよ。

「AppleシリコンのMacを使っているなら、そのパフォーマンスに感動しているはずだ。このタイミングでこの記事が出てきたのは最高だ。正直言って、Omarchy Linuxをテストした後はあまり感動してない。全てがサクサク動くんだ。まるでDOSやWindows 3.11の時代に戻ったみたい。(まあ、そんな感じだけど)Macがどうしてああならないのか不思議だ。Appleシリコンは速いのは間違いない。ベンチマークの話じゃなくて、エミュレーションやコンパイル、他の作業負荷の下でも速い、もしくは最速だ。だから、AppleがGeekbenchだけで速いって言うのは間違いだと思う。問題はmacOSが遅いこと。理由は分からないけど、あまり改善されてない。次のmacOSでx86のサポートをやめるってことは、macOSの裏側でたくさんの作業をする時間と理由ができるってことを期待してる。特にOOMやページングの問題に関して。」

メインのMacBookの他にThinkPadも持ってるんだけど、最近KDEに切り替えたんだ。フルデスクトップ環境で、macOSよりも全てがどれだけ速くレンダリングされるかが信じられない。しかも、比較的パワーのないRyzenの統合GPUでね。120Hzの画面でウィンドウをドラッグすると、めちゃくちゃスムーズなんだけど、macOSではそうは言えない(最近のElectronの問題でひどいし)。Appleシリコンは素晴らしくて、出たときはゲームチェンジャーだった。でも、最初のM1からMacBook Airをパッシブ冷却できてるのは本当にすごい。ただ、macOSがそれを妨げてるのは確かだね。

Windows/Linuxも、Intelでバックグラウンドスレッドを特定のコアに固定できないの?そうすれば、フォアグラウンドアプリがバックグラウンドの活動で遅くならないよね?それとも、他に何か理解できてないことがあるのかな。Eコアの主な利点は、バッテリー寿命に良いように電力を少なく使うことだと思ってたんだけど。この記事では、Appleシリコンの主な利点はフォアグラウンドとバックグラウンドの作業負荷をうまく分けることだって言ってるよね。それってP/Eの区別なしでもできることじゃないの?

Linuxはもちろん、そうだよ。

そうだね、スケジューラーの仕事だよ。

両方だね。マルチスレッドは、Appleが早くから主流のマルチCPUマシンを提供していたおかげで、Macアプリでは長い間一般的だった(2000年頃)。それはOS X自体よりも前のことだし、SDKでもマルチスレッドを簡単にすることを重視してきた。対照的に、Windows/x86の世界では、IntelのCoreシリーズCPUのブームがあった2000年代後半までマルチコアマシンは一般的ではなかったけど、シングルコアのx86 CPUはその後数年残っていて、Windowsの開発文化はMacのようにマルチスレッドを完全には受け入れていないんだ。だから、Macの開発者たちはタスクの優先順位付けやQoSを採用するのがすごく簡単だった。作業はすでにスレッドにきれいに分割されていたから、どれをEコアに、どれをPコアに置くのが最適かを指定するだけだった。圧倒的に、Macの開発者たちはそうしてきた。だから、システムスケジューラーはWindowsのそれよりもずっと効果的なんだ。サードパーティの開発者たちがそれに指針を与えているからね。ユーザーの「サクサク感」に最も影響を与えるタスクはPコアに残り、Eコアは補助作業で忙しくしていて、Pコアはブロックされずにより早く、頻繁にスリープできるようになっている。

その二つの組み合わせが、両方の良いところを引き出すんだよね。AndroidのSoCは、Appleよりもずっと前から異種CPUアーキテクチャ(ARMの「big.LITTLE」)を採用していて、その結果、Linuxでもこの問題に取り組む試みがいくつかあったんだ。最新の効率的なプロセッサの使い方は、エネルギー意識型スケジューリングを使うことなんだよ。これによって、カーネルがパフォーマンスコアと効率コアを区別して、仕事を適切にスケジュールできるようになる。これで、短い負荷がPコアにかかることを避けて、要求の高いものがEコアを占有することもなくなる。これのおかげで、Pコアは余分な電力が必要ないときはスリープ状態にできて、電力を節約できる。macOSがLinuxに対してまだ持っている利点の一つは、カーネルがパフォーマンスに重要な作業とバックグラウンドの作業を区別できることなんだ。これはいろんなシステムにとって有益だけど、特に異種のシステムで光るんだ。重要でない作業が常にEコアを占有できて、Pコアはそれを必要とする負荷のために自由に使えるか、単に長くスリープさせておける。Appleは、ユーザー空間がこういう情報を下に伝えるための標準インターフェースを定義することでこの問題を解決したんだ。私の知る限り、Linuxにはそれに相当するものが今はない。技術的には、アプリケーションがスレッドを個別のコアに固定することはできるけど、どのコアがどれかを知るためには、スケジューラ内部の情報を解析しなきゃいけない。これをやってるLinuxアプリケーションは見たことがないな。

同様に、Linuxでプログラムをコアに固定することのパフォーマンスへの影響についての最新のベンチマークってあるのかな?CPUに負荷がかかるプログラムにとって、<1%なのか、それとも実際に注目すべき何かがあるのか?最も脆弱なプログラム(例えばウェブブラウザ)を専用のコアに置くことで、潜在的なセキュリティの利点があるって聞いたことがある。

ピン留めは存在するけど、面白いのは信号の質だね。macOSは多くのフレームワークやアプリから一貫した「緊急性」信号(QoS)を受け取るから、異種コアでのスケジューリングがランタイムの挙動から推測するよりもずっと正確なんだ。

macOSの特徴の一つは、machカーネルが「バウチャー」の概念を持っていて、スケジューラーがIPC境界を越えた論理的な呼び出しを理解するのを助けるところだね。だから、高優先度(ユーザー起動)のプロセスが、通常は低優先度のバックグラウンドデーモンにIPCコールをすると、高優先度のプロセスが低優先度のプロセスにバウチャーを渡すことができるんだ。このバウチャーを持っている間は、デーモンのIPC処理スレッドが高優先度で動くことができる(つまりPコアにアクセスできる)。これによって、Appleは小さくて単一責任のプロセスを設計できるけど、優先度を動的にして、通常は低優先度だけど、フォアグラウンドのユーザープロセスがその作業でブロックされているときは高優先度になるんだ。Linuxカーネルにはこれがあるかどうかは分からないけど。

確かに、その印象はひどい心理学のせいで良くないね。Eコアが100%の時、同じ100%で表示されているPコアの周波数の4分の1で動いている可能性が高い。実際には半分くらいだね。 > アイドル状態のMacが600以上のプロセスで2000以上のスレッドを動かしているのは良いニュースだよ。もちろん、それらが何か有用なことをしているならの話だけど。

asahi linuxがEコアとPコアのスケジューリングをどう管理しているのか気になるな。誰かこれについて実験した人いる? 編集: 2年前にAsahiブログでこの件についての議論があったみたいだね。[0] [0]: https://asahilinux.org/2024/01/fedora-asahi-new/

アイドル状態のMacが600以上のプロセスで2,000以上のスレッドを動かしているのは良いニュースだし、Eコアで動くほどアプリが速くなる。 これは根本的におかしいよね。無駄な作業をするより、何もしない方がいいっていうコンピュータの設計はありえないし、エネルギー消費やバッテリー寿命を考えると、特にノートパソコンでは。今のアプリが使えないリソースがあるだけかもしれないし。それに、あんまり設計が良くないからバグがあったり、戻ってきたりすることもあるし、平均的には影響が大きくないとしても、写真分析のインデックスが狂ったりしてハマることもあるよ。

OPの例だと、その作業は無駄じゃないと思うよ。もし60のプロセスで同じ作業をしているシステムがあったら、それを600のプロセスと数千のスレッドに分けた方がいいってことだよね。そうすれば、タスクをレイテンシーの感度によって細かく分類できるから。

これは根本的に意味が通らない - 実際の計算を設計する方法はない Hmm、Appleシリコンのノートパソコンって存在しないのかな?私が去年買ったのは夢だったのかな?もしかしたらそうかも。今年は混乱した年だったし。

そのプロセスやコアの中には、動かしたくないものも結構あると思うよ。それをオフにするには、ブートパーティションを変更して起動設定を無効にしないといけないから、面倒だよね。はぁ。

(...) 無駄な作業をする方が何もしないよりマシだ (...) この意見は、問題の全体像を根本的に誤解してるね。何百ものプロセスから成るワークロードがあって、その中にはマルチスレッドのものもあるけど、それを処理する必要があるんだ。それは変わらないし、消えないよ。あなたが「無駄」だと言えるプロセスは全く提案されてないし、IOを待っているプロセスは確かにあるけど、リクエストが返ってくるのを待つのは無駄じゃないからね。