iPhoneの速さを支えるCPU性能の源泉は、回路を構成するトランジスタの数である。CPUコアを増やしたり、コア当たりの性能を高めたりと、自由度の高さにつながる。コア数を増やすという力業で全体性能を2倍、3倍と伸ばす一方で、コア当たりの性能を細かな改良の積み重ねで伸ばしているのだ。

 コアの数というのは、ユーザーから見て分かりやすい性能指標だ。クルマのエンジンで言えばシリンダーの数で、多いほど速いというのが分かりやすい。とはいえコア数を増やすだけでは、CPUコアを同時に1つしか使わないアプリケーションの動作速度向上にはつながらない。技術者にとっては常識だが、世の中にはCPUを1つだけしか使わないアプリケーションが山ほどある。

 コア単体の性能を引き上げるための高速化手法は米アップル(Apple)に限らず、多くのArmコアが実装する。米インテル(Intel)や米アドバンスト・マイクロ・デバイセズ(AMD)のx86互換プロセッサーも同様で、コア数を増やすだけでは総合性能を高められないからだ。その理由を、まずは現在のモバイル向けCPUが直面している壁を踏まえながら解き明かしていこう。

1コアでこなす命令の数を増やす

 CPUコア単体の性能を引き上げるシンプルな手法は、動作周波数の向上だ。「命令Aを読み込む→解釈する→解釈の内容に応じてデータを加工する→加工したデータを書き出す」といった一連の繰り返しを、より高速に実行する。しかし、モバイル向けSoC(System on a Chip)では限界がある。バッテリー駆動時間の短縮や発熱の増大を招くからだ。

 そこで、CPU内部での処理の仕方を工夫する。プログラムによっては、命令Aと同時に命令Bを実行しても処理結果が変わらない場合がある。命令を逐次実行する必要はなく、「命令Aと命令Bを読み込む→同時に複数解釈する→解釈の内容に応じてデータを複数加工する→加工した複数データを書き出す」でも構わないわけだ。ここで2命令を同時に実行できれば、動作周波数を2倍にしたのと同じ効果がある。

 問題は、命令Aと命令Bの関係が「命令Aの結果を命令Bで処理する」というケースでは、依存関係があるため、同時に実行できない点だ。複数の命令を並行して実行できる場面は限られる。

 このため、現在主流のCPUは、命令を複数読み込んで実行直前までの処理(一般にフロントエンドと呼ぶ)を並行して進めてしまう。依存関係が見つかれば、実行直前まで進めた処理は破棄する。依存関係が無ければ、絶え間なく命令を実行でき、演算器の利用効率が上がる。「Superscalar(「スーパースケーラー」や「スーパースカラー」)」と呼ぶ技術だ。

スーパースカラーによるCPUの高速化
命令群に依存関係のない理想的な状態では演算器の利用効率を高められる
[画像のクリックで拡大表示]

 さらに命令の順序を結果に影響が出ない程度に入れ替える、といった工夫で、同時に実行できる命令数を増やしている。「Out-of-Order(アウトオブオーダー)」と呼ぶ技術である。

 こちらは命令でデータを加工して書き出す処理(こちらはバックエンドと呼ぶ)において、同時実行可能と判別できた命令を優先して処理する。

この先は有料会員の登録が必要です。今なら有料会員(月額プラン)が4月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら