87726f76bf22892ff6eb07d800b85f90-150x150

グーグル、アップルを巻き込んだスマホ大変革が2015年に起こる根拠(2/7)

  • このエントリーをはてなブックマークに追加

by [2013年8月07日]


第1回目では半導体製造プロセスの縮小(シュリンク)によるメリットとデメリット、そしてその対策について見てきました。第2回目では論理設計レベルでのCPUの高速化技術を取り上げます。

第1回 ~半導体はシュリンクで高速処理と低消費電力を目指す~ はこちら
第3回 ~速度向上の壁~ はこちら
第4回 ~ 速度が出せないなら物量で解決だ~ はこちら
第5回 ~64ビット化で大容量メモリを~ はこちら
第6回 ~来たるべきプロセッサ~ はこちら
第7回 ~未来のプロセッサのもたらすもの~ はこちら

プロセッサの高速化は微細化だけで成り立っているわけではない

Qualcomm Snapdragon 800
現行のQualcomm製統合プロセッサ(SoC)のシリーズラインナップ中最上位に位置するハイエンドプロセッサ。メモリインターフェイスの2ch化による帯域性能の大幅向上をはじめ、Snapdragon S4 Proを基にしつつ各部の強化により非常に重装備かつ高性能なプロセッサとなっている。

さて、前回説明したようなリーク電流(※1)対策をきちんと施した上で20nmプロセスで半導体を製造した場合、例えば最新のQualcomm Snapdragon 800は、プロセッサとしての処理能力よりも低消費電力性能を優先するモバイル機器用プロセッサでありながら、最大3GHz前後の動作クロック周波数(※2)で動作することが見こまれています。

ハイエンドARM系(※3)統合プロセッサ(SoC)の製造で現在広く利用されている28nmプロセスの場合、TSMCのモバイル機器向けで最も速度を出しやすい28nmHPmプロセスを用いていることが公表されているSnapdragon 800でさえ、2.3GHz動作が上限とされていますから、20nmプロセスへの移行でおよそ0.7GHzもの動作クロック周波数の引き上げが期待できる、ということなのです。

しかし、実はこれは単純に製造プロセスのシュリンクだけで出てきた数字ではありません。

プロセッサの設計においては、同じ製造プロセス世代でもチューンの相違で得られる処理速度に差があり、またプロセッサそのものの回路構成の違いによる性能差もあるため、例えばSnapdragonシリーズでも前世代のハイエンドであったSnapdragon S4 Proのマイナーチェンジバージョンであり低消費電力重視の28nmLPプロセスを用いて製造されるSnapdragon 600が最高1.9GHz、Snapdragon 800が前述のとおり最高2.3GHz、と約20パーセントもの差が生じています。

そのため単純化のため倍率が同じと仮定すると、Snapdragon 600を20nmプロセスで製造した場合の最高速度は(冷却の問題を無視すれば)およそ2.5GHz前後と推定され、Snapdragon 800との間に0.5GHzもの速度差が生じることになります。つまり、単純に製造プロセスをシュリンクしただけでは高クロック動作は得られず、プロセッサの設計レベルでも何らかの高速化を実現するための技術が必要だ、ということになります。

そのため現在のプロセッサでは、より高いクロック周波数で動作させるため、多段パイプライン処理(※4)の並列化によるスーパースケーラ(※5)、分岐予測(※6)、それに投機実行(※7)といった技術を組み合わせて、高速化のための回路的な工夫が凝らされています。

  • (※1) リーク電流:トランジスタの内部で漏れ出している、動作とは無関係の電流。トランジスタの動作が高速になればなるほど、また、半導体の微細化が進めば進むほどリーク電流は大きくなるため、LSI(集積回路)の総消費電力のうち大きな比率を占めるようになってきた。
  • (※2) 動作周波数(クロック周波数):回路が処理の歩調をあわせるために用いる信号のことを「クロック」という。このクロックが、一秒間に何回発生するかを示す値を「動作周波数」という。動作周波数の値が高ければ高いほど、同一時間内に、それだけ多くの処理がこなせるということである。一秒間にクロックが1000個ある場合、動作周波数は1kHzと表示。
  • (※3) ARM系(CPU): ARMホールディングが知的財産(IP)として提供する、CPUやメモリーコントローラといった回路の設計図に基付いて製造されたCPUのこと。高性能、低消費電力が特徴で、組込み用マイコンから普及が始まり、スマートフォンやタブレット、サーバへ利用範囲が広がっていった。代表的なARM系(CPU)として、「Apple A5」などがある。
  • (※4) パイプライン:マイクロプロセッサの命令実行をいくつかの段階に分割し、それぞれの段階で独立した命令を実行できるように工夫した技術のこと。これは、マイクロプロセッサにおける各処理を分割することで、動作周波数の上昇を意図している。
  • (※5) 分岐予測:命令が分岐するかどうかをあらかじめ予測。分岐失敗な場合、分岐先の命令をパイプラインに流し込むようにする。
  • (※6) 投機実行:プログラムが途中で条件分岐しているときに、分岐予測に従い、分岐予想先の命令をあらかじめ実行しておくこと。

    高速化技術の色々

    まずパイプラインというのは、プロセッサ内部での演算処理を各ステップごとに細分化して、工場のベルトコンベアーのように順番に処理・実行してゆくことで、見かけ上の処理速度を引き上げる技術です。

    現在一般に広く用いられているプロセッサ各種では、プロセッサが与えられたプログラムを実行する際には、命令を取り込む「フェッチ」、取り込んだ命令を解釈する「デコード」、命令された演算処理を行う「演算実行」、演算の際に必要なデータをメモリから読み込む「メモリ参照」、演算結果を出力する「結果出力」、といったステップで処理が進むのですが、こうした命令を逐次的に、つまり何も考えず順番に実行し、結果出力が終わったら次の命令のフェッチを行う、といった動作を行ったた場合、各ステップを処理する際に他のステップの処理に関わる回路が完全に遊んでしまう、という問題があります。

    パイプライン処理

    パイプライン動作を行わない、逐次処理動作を行うプロセッサの動作概念図
    命令1の各ステージを順番に実行し処理が終わってから命令2の各ステージ実行に移る、という逐次的な動作を行う。このため、各命令の処理はオーバーラップせず前後関係の矛盾も生じないが、常にいずれか1ステージの処理しか行わないため、処理速度が遅くなる。

    パイプライン処理はこの問題を解決するために考案された技術で、命令の内部処理を細分化して各区分相互の干渉をなくし、例えば「フェッチ」→「デコード1」→「デコード2」→「演算実行」→「メモリ参照」→「結果出力」という6段構成のパイプラインであれば、1番目の命令の「メモリ参照」が終われば2番目の命令の「メモリ参照」処理を行い、2番目の命令の処理が終わって空いた「演算実行」は3番目の命令のものを実行する、という風に順繰りに処理を連ねて実行することで、見かけ上1つの命令を実行するのにかかる時間をおおむねパイプラインの内部処理のステージ数(段数)で割った値(※厳密には各ステージでの処理内容により、そのステージの処理が完了するまでに必要な時間が変動します)に減らして高速化を実現するものです。

    わかりやすく言えば、工場などで用いられているベルトコンベアに近いイメージとなります。

    ベルトコンベアを用いた工程では、両脇に工員なり工作機械なりが並んでいて、ベルトコンベア上を流れて行く製品を順番に加工・組み立てして行くことで工程全体の作業効率を向上させている訳ですが、CPUのパイプラインで行われているのも、これに近い各ステージの同時並行処理なのです。

    6ステージ構成のパイプラインの動作模式図
    命令1から順番に、各ステージごとに小刻みに複数の命令をオーバーラップさせて実行してゆくことで、6つのステージを処理する各演算ユニットを遊ばせず全体としてのプロセッサの処理速度を引き上げる。

    このパイプラインの特徴として、それを構成するステージ数が多くなればなるほど、パイプラインが多段化すればするほど、見かけ上の1命令あたりの実行速度が高速化する=高クロック周波数での動作が容易となります。

    もっとも、このパイプラインでは処理内容の相違から各ステージの処理を完了するまでの所要時間を揃えるのが難しく、時に前後でその計算結果に依存関係のある命令同士の間で処理の順番が前後してしまうことがあり、それが後述する様々なハザードと呼ばれる不具合の原因の一つとなっています。

    馬鹿正直に命令一つ一つについて全ステージを一巡りしてから次の命令の処理に移行する、逐次処理しか行われていなかった時代のプロセッサでは、1つの命令を1クロック(単位時間を動作クロック周波数で割った時間)で実行完了するのは至難で、特に計算の煩雑な除算命令(※「余り」の処理など、加減算や乗算にはない特別な処理が必要な除算はリレー式電子計算機の頃からコンピュータにとって鬼門で、ビットシフト演算など他に代替手段があるためわざわざ追加する必要性の薄い乗算命令と合わせて、乗除算命令を持たないプロセッサも珍しくありません)を中心に数十クロックもの長大な時間をかけて実行する(※つまり、それだけの間プロセッサ内部の各機構が遊んでしまう)命令すら珍しくなかったのですが、このパイプライン処理の導入により、1命令=1クロック以内での実行が比較的容易に実現できるようになりました。

    また、内部処理ユニットを増やし多段パイプラインを複数搭載することで、1クロックあたりの命令実行時間をさらに短縮するスーパースケーラ技術(※7)もこのパイプライン技術を基礎として誕生、これによってプロセッサ内部で複数のパイプラインを用いて並列でプログラムの命令を処理することで、プロセッサ全体の大幅な高速化が実現しました。

  • (※7) スーパースケーラ(スーパースカラ):プロセッサのなかに、命令処理を実行する回路(パイプライン)を複数持つことで、複数の命令処理を同時に実行する仕組み。非スーパースケーラの場合は、命令処理を実行する回路が1系統しかない。そのため、一度に1つの命令処理を実行するしかない。これでは、複数の命令処理を実行するためには時間を要する。一方、スーパースケーラの場合は、命令処理を実行する回路を複数系統持つため、複数の命令処理を同時にできる。結果として、短時間で多くの命令処理が可能。
  • パイプラインを拡張して生まれたスーパースケーラ技術

    6ステージ構成のパイプラインを2本組み合わせたスーパースケーラプロセッサの動作模式図
    プログラムに書かれた命令をどのパイプラインに充填するか、を処理するリザベーションステーションと呼ばれる管理ユニットの付加が必要となるが、スーパースケーラ技術を利用すれば、通常のパイプライン技術以上の処理速度向上が期待できる。ただし、メモリの読み書きが本来想定された時系列に従わない(複数のパイプラインを同時実行することから、処理時間の相違により本来の時系列とは異なる並びで計算結果が出力される)場合があるため、ハザードの発生可能性が高くなる。

    このスーパースケーラ技術は、複数のパイプラインをプロセッサ内に搭載して並列動作させる、というその基本コンセプトからもわかるように、1クロックで複数命令を同時実行可能とする(※この同時に実行される命令の数を同時命令発行数(issue)と呼びます)ために考案された技術です。

    ただし、各パイプラインで内部処理ユニットが共用されていた場合、競合(コンフリクト)による処理待ちが発生するため、性能を十分に発揮させるためにはそれぞれのパイプラインで利用される内部処理ユニットを可能な限り独立・並列化させる必要があります。

    また、この技術を用いた場合、各パイプライン間でメモリ操作などが競合するハザードが発生する可能性が1本だけの多段パイプラインよりも大きくなります。そのため、リザベーションステーションと呼ばれる、各パイプラインへ実行されるべき命令を、なるべくハザードが発生しないように効率よく割り振るための管理ユニットが必要となり、CPUの構造が複雑化・肥大化するという問題もあります。

    超多段パイプラインのメリットとデメリット

    インテル Xeonプロセッサ(Socket 604)
    インテルが開発したNetBurstアーキテクチャ(※8)と呼ばれる20段以上の超多段パイプラインを搭載するx86系プロセッサの一つ。130nmプロセスあるいは90nmプロセスで製造され、Socket 604と呼ばれる専用のCPUソケットを備えたサーバやワークステーションなどに搭載して利用された。

    ちなみに、Cortex-A15やSnapdragon S4シリーズなどのARM系各種プロセッサや一般的なパソコン用CPUでは、パイプラインの段数は10段から16段程度が一般的(※整数演算の場合。浮動小数点演算やマルチメディア拡張命令など別ユニットを呼び出して処理を行う命令の場合、これより更に段数が増えます)なのですが、多段化で先鞭をつけたインテルのPentium 4や初期のXeonに代表される「NetBurst」アーキテクチャのプロセッサでは、初期のもので20段、後期のものでは31段(※いずれも公称値。初期のものは実際にはもう少し段数が多かったようです)、という極端に多段化されたパイプラインを2本ずつ備え、「スーパーパイプライン処理」(※9)を謳いました。

    この超多段パイプライン処理により、NetBurstアーキテクチャによるプロセッサは、当時の一般的な130nmプロセスあるいは90nmプロセスで製造された他社製プロセッサでは130nmプロセスで最終的に2.4GHz、90nmプロセスでかなり無理をしてさえ3.2GHz程度までしか動作クロック周波数を引き上げられなかったのに対し、130nmプロセスで最大3.4GHz、90nmプロセスでは最大3.8GHz(※前述のとおり、これは他の要因によって制限された結果であり、本来は4GHz以上、理論計算上では5GHz動作すら狙えるものでした)という、驚異的な動作クロック周波数を実現していました。

    AMD Opteron(Socket 940)
    AMDが開発した、K8アーキテクチャ準拠のサーバ・ワークステーション用CPU。メモリコントローラをCPUに直接内蔵することでメモリアクセス性能を高め、さらに3本相当のパイプラインを備えて当初は比較的低クロック周波数での動作(2GHz前後)であったにもかかわらず、同世代かつ1.5倍近い高クロック周波数動作のNetBurstアーキテクチャ版Xeonと互角以上の高性能を発揮した。なお、最初のAMD64 64ビット命令セット対応プロセッサである。

    もっとも、このNetBurstアークテクチャは同時代の競合プロセッサ、例えばAMDのK8アーキテクチャ(実質3本のパイプラインを備え、低いクロック周波数でも高い演算処理能力を発揮しました)と比較して、「実際にはパイプラインがスカスカで動作クロック周波数の割に速くない」、あるいは「大幅に動作クロック周波数が低いK8アーキテクチャ準拠のプロセッサに実効性能で劣る」という散々な評価がなされていました。

  • (※8) NetBurstマイクロアーキテクチャ: Intelの8世代目のx86系として開発されたCPUの基本設計。IntelのPentium 4(2000年)やPentium Dといったプロセッサに採用された。命令解釈をするフロントエンドと、命令処理するバックエンドを完全分離。このことにより、CPUの機能拡張への対応、および高クロック化が容易となった。しかし、プロセスの微細化に伴い、高消費電力、高発熱といった問題が顕在化。2006年以降、これらの問題を改善したCoreマイクロアーキテクチャに切り換えられた。
  • (※9) スーパーパイプライン:最近のマイクロプロセッサは、パイプラインを細分化。処理の高速化に役立てている。パイプラインの段数が多い(深い)アーキテクチャ(設計)を「スーパーパイプライン」という。
  • 複数パイプラインの利用効率を向上させるアウトオブオーダー命令実行

    さて、パイプラインを複数備えるスーパースケーラプロセッサの場合、それぞれのパイプラインが全て等価な機能を備えていない場合があります。

    具体的に言うと、パイプラインをA・Bの2本備えたスーパースケーラプロセッサがあったとすると、パイプラインAは整数演算に加え、浮動小数点演算ユニットを呼び出すことで浮動小数点演算を実行できるが、パイプラインBは整数しか計算できない、といった制約がついていることが結構あるのです。

    2本の整数演算パイプラインの一方からのみ浮動小数点演算ユニット(FPU:右上)を呼び出せる構造のスーパースケーラプロセッサの模式図
    この構成の場合、浮動小数点演算命令は必ずFPUにつながっている上の整数演算パイプラインAに投入されねばならず、FPUを利用する命令が連続すると、インオーダー命令実行の場合、下の整数演算パイプラインBが利用されず完全に遊んでしまう。

    これは、プロセッサで利用できるトランジスタ数と得られる実効性能を天秤にかけて、最小限のトランジスタ数で最大の性能を得られるような設計を行った結果、そうなってしまうケースが大半ですが、それゆえにパイプライン処理において効率低下の問題が生じることがあります。

    具体的には、上図のような2本の整数演算パイプラインの一方のみに浮動小数点演算ユニットが接続された構成のプロセッサにおいて、プログラムの中で浮動小数点演算命令が連続した後に整数演算命令が連続するような命令の並びになっていた場合、やってきた命令を順番に実行する(※こうした順序どおりに命令を実行することをインオーダー(in-order)命令実行といいます)と、整数演算パイプラインBで実行できる整数演算命令が後に控えていることがわかっているにもかかわらず、浮動小数点演算命令の利用できる整数演算パイプラインAばかりを利用して浮動小数点演算命令の使えない整数演算パイプラインBが完全に遊んでしまいます。

    これでは何のためにスーパースケーラ技術を導入したのかわかりません。

    そこで、計算結果が相互に依存しない=実行する順番を変えても影響がないことをチェックの上で、連続する浮動小数点演算命令の後に続く加減算命令を、序列無視で整数演算パイプラインBに投入し、整数演算パイプラインAに投入された浮動小数点演算命令と並列処理させてしまうことでパイプラインの利用効率を上げよう、というアイデアが出されました。

    これをアウトオブオーダー(Out of Order)(※10)命令実行処理といい、プロセッサレベルでハードウェア的に実行する場合は、そのコードが空いているパイプラインで使えるかどうかのチェックを行った上で、依存関係の無い命令の並びを入れ替えて、極力全てのパイプラインを遊ばせないような命令の割り振りを行うようになっています。

    このアウトオブオーダー命令実行処理は、プログラム内での命令の並べ替え、という一つ間違えれば計算処理結果に重大な影響を及ぼす処理であるため、その並べ替えの処理を行うディスパッチユニット(Dispatch Unit)の回路規模が複雑・肥大化することが避けられません。

  • (※10) アウトオブオーダー(実行):プログラムに記述された命令の順番を問わずに、処理に必要なデータがそろった命令から実行する仕組みのこと。
  • ソフトウェア側からのアプローチによるアウトオブオーダー命令実行

    そのため、それを避けるために、ソフトウェア開発で用いるコンパイラ(※11)と呼ばれるプログラムコードの変換を行うソフトにおいて、「最適化」と称してこのアウトオブオーダー命令実行が行われるよう事前に命令の並びを入れ替えてしまう、といった処理を行うことで、このディスパッチユニットの搭載と、それによるハードウェア的なアウトオブオーダー命令実行処理機能の実装を省略してしまうケースもあります。

    この方式を採用した場合、プロセッサの簡素化は実現されますが、その一方でそうした「最適化」が行われていないソフトウェア資産が存在した場合、それらのアプリを実行した場合の性能低下が著しい、という問題があります。

  • (※11) コンバイラ: 人間がプログラミング言語で記述したソフトウェアの設計図(ソースコード)を、コンピュータが実行可能な形式であるオブジェクトコードに変換するソフトウェア
  • アウトオブオーダー処理の省略によるメリットと弊害

    インテルの悲願である同社製Atomプロセッサ搭載スマートフォンの成功を目指すには、チップサイズ縮小のために初代Atom設計時に切り捨てたアウトオブオーダー命令実行処理機能の搭載が性能確保の観点から、事実上不可欠である。それゆえ、この機能の搭載によるチップサイズ増大を相殺しチップサイズを小さいままに保つため、「Silvermont」(※12)アーキテクチャに基づく次世代Atomプロセッサはインテル最新の22nmプロセスで製造されることとなる。

    実は、インテルのAtomプロセッサは初代モデルから最近のモデルまで2世代にわたってこのハードウェア的なアウトオブオーダー命令実行処理機能が省略されており、驚くほどのチップサイズの縮小とそれによる低消費電力化と引き替えに、同程度のクロック周波数で動作する他のプロセッサと比較して明らかに性能が低くなっていました。

    もっとも、さすがにスマートフォン市場への進出を考えると、競合であるQualcommのSnapdragonシリーズやCortex-A15といったARM系プロセッサ(※いずれも複数の多段パイプラインを内蔵し、スーパースケーラおよびアウトオブオーダー命令実行をサポートします)の性能がどんどん向上している現状では、さすがのインテルもいくら低消費電力でもそのような低性能なプロセッサでは市場シェアを勝ち取れない、と悟ったらしく、今後Atomプロセッサでも「Silvermont(※12)」と呼ばれる第3世代のアーキテクチャを採用した製品(※このアーキテクチャによるスマートフォン・タブレット向けAtomプロセッサのコードネームは「Merrifield」と呼ばれています)からアウトオブオーダー命令実行処理機能がハードウェアとして搭載されることと、それによる性能向上が大きいことが予告されています。

  • (※12) Silvermont:インテルが2013年半に後投入を予定している22nmプロセスルールのCPUコア。従来は2つまでだったCPUコアが、最大8つまでに拡張。また、実行ユニットは従来製品までのインオーダー(実行)から、現在一般的なCPUで採用されているアウトオブオーダー型に変更。大幅な性能強化により、ピーク性能は最大で現行機種の3倍になるという。また、マイクロアーキテクチャレベルの低消費電力を実現させ、プロセッサコアの消費電力も現行世代に比べ5分の1になるという。
  • (以下、第3回 「速度向上の壁」に続く)

    コメントは受け付けていません。

    PageTopへ