Broadcom BCM2836Raspberry Pi2に搭載されたSoCで、ARM Cortex-A7を4コア内蔵する。ある意味、教育用コンピュータのために誕生したARMの伝統にもっとも正しく則ったチップの1つである

ARM系プラットフォームを考える 前編

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

by [2017年6月19日]

Broadcom BCM2836Raspberry Pi2に搭載されたSoCで、ARM v7系アーキテクチャに従うARM Cortex-A7を4コア内蔵する。ある意味、教育用コンピュータのために誕生したARMの伝統にもっとも正しく則ったチップの1つである

Broadcom BCM2836
Raspberry Pi2に搭載されたSoCで、ARM v7系アーキテクチャに従うARM Cortex-A7を4コア内蔵する。ある意味、教育用コンピュータのために誕生したARMの伝統にもっとも正しく則ったチップの1つである

当初は教育用コンピュータ向けのごく小規模なプロセッサとして誕生し、組み込み機器用で大きなシェアを獲得した後、今やiOS・Android搭載タブレットやスマートフォンのみならず、Intel系CPUの金城湯池であったフルセットのWindowsサポートまで射程に入れるようになったARM系プロセッサ。

近年ではその開発元であるイギリスのARM社を孫正義氏率いるソフトバンクが巨費を投じて買収したことでその名が一躍知られるようになりました。

CPUの論理回路設計から自社工場での半導体製造・パッケージング、さらには全世界を相手にした実製品の販売まで、製品の企画・開発・製造・販売・サポートとすべての部分を自社で行う業界の巨人Intelとは異なり、ARMのビジネスモデルはあくまでそのプロセッサ製品の論理回路設計から実製品製造に必要となる設計情報を提供する所までで、実際の製品を自社で製造販売することはありません。

また、ARMから受け取った回路設計をどのように応用して実製品に組み込むか、つまりカスタマイズの余地が契約にもよるものの実際に製品を作って売るメーカー側に与えられていて、契約の許す範囲内で回路設計を修正・改良したり、場合によってはその基本的な論理を元にして自社で独自のCPUコアを設計することさえ許されるという、ある意味大変に緩やかな契約※注1システムとなっているのもARM系プロセッサの特徴です。

※注1:もちろんARMの意図から外れた改変、つまりARMが定義する命令セットのソフトウェア的な互換性を損なうような、自社独自命令の搭載や基本命令セットの勝手な拡張・変更は許されませんし、自由度の高い契約ほどその代価が大きくなるようなシステムとなっていて、余程技術力と販売力の伴ったメーカーでなければおいそれと手が出せないような仕組みになっています。

実際にも、この体制の下でQualcomm、サムスン、AMD、それにNVIDIAなどがそれぞれこうした契約に従って独自に開発・設計を行い、本家ARMのリファレンス設計によるものを超える性能を発揮すると主張する高性能CPUコアを自社製品に搭載しています。

ARMがこのような体制の下で大きな成功を収めるまでには様々な紆余曲折があって、初期には商業的に決して成功とは言えないような結果に終わった搭載製品も少なくなかったのですが、ともあれ現在ではIntelのx64/x86系と呼ばれるアーキテクチャ※注2と肩を並べる、CPUアーキテクチャにおける二大勢力の一方と見なされるところまで成長を遂げてきました。

※注2:1978年発表の16ビットプロセッサであるIntel 8086に始まり、1985年発表のIntel 80386(Intel386)プロセッサで32ビットに拡張された、いわゆるx86(IA-32)系アーキテクチャに準拠するプロセッサと、Intelの競争相手であるAMD(Advanced Micro Devices)がx86系アーキテクチャを基本として素直に64ビット拡張してAMD 64の名で開発・発表し、2003年発表のOpteron(オプテロン)・Athlon 64(アスロン64)などから搭載を開始、Windowsを開発・提供しているマイクロソフト社の強い支持を受けたことでx86系のオリジネータであるIntelも渋々ながらIntel 64と称してこれをサポートしたプロセッサを作るようになってマイクロソフト社などから「x64」の名で呼ばれるようになったアーキテクチャの2系統を総称したもの。x64系プロセッサは原則x86プロセッサとしての互換動作モードを搭載しソフトウェア的にx86系プロセッサに対する上位互換性を備えているため、便宜上まとめてこのように呼ばれています。

しかし、そうした自由度の高さは、ARM自身がスマートフォンやタブレットなど向けと組み込み機器向けとで構成を若干変えたプロセッサをリファレンス設計として提供していることなどもあってか、若干実製品を自社で出していて具体的にどのような製品・アーキテクチャなのかを比較的イメージしやすいIntelやAMDのx86/x64系プロセッサとは反対に、「これがARM系プロセッサだ」という確固たるイメージの確立を難しくしている※注3様に思います。

※注3:実際、ARM系アーキテクチャのCPUの特徴を挙げよ、と言われて「低消費電力」「単位電力あたりの実効性能の高さ」といった部分は出てきても、具体的にそうした性能がどのようにして実現されてきたか、どのようなハードウェアデザインであるかを明快に説明出来る人はそれほど多くないでしょう。これはQualcommをはじめ自社オリジナルのARMアーキテクチャ準拠CPUコアを開発しているメーカー各社にも言えることですが、ARM系プロセッサではx64/x86系プロセッサ以上に肝心な部分の基本仕様がぼかされていたり、あるいは全く公表されていなかったりすることが珍しくありません。

そこで今回はそうしたARM系プロセッサの特徴について、公表されている範囲の情報を基礎として考えてみたいと思います。

ARM系アーキテクチャの基本

まずは、ARM系プロセッサの根幹をなすアーキテクチャの構造から見てみるとしましょう。

CPUでは一般に計算処理を行う際にレジスタと呼ばれるごく小容量かつ超高速のメモリを一時的な情報保持に用います。

このレジスタで一度に扱える情報量は通常、8・16・32・64ビット単位となっていて、それが世間一般で言う「○○ビットCPU」という呼び名の根拠になっています※注4

※注4:CPUでの「○○ビットCPU」という呼び名は、汎用レジスタ長が○○ビットであることが基本なのですが、これに加えてデータを外部とやりとりする外部データバスの幅がそれと同じ○○ビットであることも重要な意味を持っています。これは、○○ビット幅のデータバスでないと汎用レジスタ1本の中身を一度に転送できない(2回以上に分けてデータを分割転送する必要がある)ため、CPUの内部処理がいかに高速でも外部のメインメモリなどの読み書き速度が半減、あるいは1/4減となって充分な性能を発揮できないためです。もっとも、半導体パッケージの側から見ると外部バス幅が半分になるとある程度の性能低下と引き替えにその分だけチップパッケージを小さく、安く作れるというメリットがあって、また例えば内部32ビット、外部16ビットで命令互換のCPUを用意すれば、内外共に16ビットの既存CPU用マザーボードへ搭載が可能となって、既存基板設計の使い回しが可能となります。

そして、ARM系プロセッサの中でも32ビットCPU向けのARM v7、つまり現在も低価格スマートフォンなどで使用されているCortex-A15などのCPUコアで使用されているタイプのCPUアーキテクチャでは、計算処理で利用可能な汎用レジスタの本数が13本、汎用レジスタとスタックポインタと呼ばれるCPU動作で特別な役割を持つレジスタを兼用するレジスタが1本、リンクレジスタと呼ばれるサブルーチン呼び出し命令で条件分岐を行った場合に戻るべきアドレスを記憶・保持するためのレジスタが1本、そしてプログラムカウンタ(PC)と呼ばれる現在実行中のプログラムのメモリアドレスを保持するレジスタが1本、合計で16本の32ビット長レジスタを搭載するようになっています。

こうして、特別な役割を持つ3本を除くと、r0~r12までの13本のレジスタが汎用で自由に使用できる構成となっています。

このため、例えばA+B=Cという計算を行う場合、加算命令(ADD)を使用して

 ADD C,A,B

という記法を用いる※注5のですが、このA~Cのいずれにでもr0~r12までのレジスタを自由に割当てることができます。

※注5:一般にこの種のCPUで用いられるアセンブリ言語の記法では、命令(この場合はADD)に続けて最終的な値が格納されるレジスタ(この場合は「C」)を指定し、その後に続けて演算で使用する他のレジスタや定数、あるいは計算に用いるデータが格納されたメインメモリのアドレス(この例ではレジスタAとレジスタB)が指定されます。

つまり、

 ADD r12,r1,r5

でも

 ADD r7,r10,r0

でも、その時空いているレジスタであればどれでも入れ替えて同じ演算処理ができるように設計されています。

このように、複数のレジスタの扱いが等しく自由に入れ替えて同じ命令を同じように実行できることを「命令の直交性が高い」という言い方をするのですが、ARM v7アーキテクチャのCPUはその代表例と言える綺麗なレジスタ構成であると言えます。

古い世代からの互換性問題を引きずりつつ拡張を繰り返したx86系プロセッサ

一方、ここでARM v7系と同じく32ビットCPUであるx86のレジスタ構成を見てみると、こちらはかなり様相が異なっています。

x86の場合、汎用レジスタとしては一応EAX・ECX・EDX・EBX・ESP・EBP・ESI・EDIと8本の32ビット長レジスタが使用可能とされているのですが、実はこの系統の初代となった16ビットCPUであるIntel 8086やその祖先にあたるIntel 8080という8ビットCPUからの歴史的経緯で、16ビット互換モード(リアルモード)で動作する場合にはこれら8本は頭のEの字が取れてAX・CX・DX・BX・SP・BP・SI・DIという16ビットレジスタとして、残りの16ビットを無視して動作し、更にAX・CX・DX・BXの4本はそれぞれAH・AL、CH・CL、DH・DL、BH・BLと8ビットレジスタ2本を束ねた形としても利用可能、ただしそれぞれのレジスタには固有の役割があるという複雑な動作をします。

また、先の例で示したA+B=Cの計算の例で言うと、使用できるレジスタの本数とそれぞれで扱える機能が限られていたため、命令自体が極力少ない本数のレジスタで行えるように設計されていて、加算命令(ADD)は

 ADD A,B

という形で「AにBの値を加算してAに格納する」という動作をするようになっていてCは使わない様になっています。

さらに、どのモードでもAにEAX/AX/ALレジスタを使用しBを定数とした場合にだけ専用の命令として扱う※注6という大変繁雑なことになってしまっています。

※注6:マシン語レベルで言うと、ADD AL,(8ビット定数)とADD EAX,(32ビット定数)およびADD AX,(16ビット定数)の場合、それぞれ0x04・0x05と専用の命令コードが割当てられています。これは8ビットCPUであるIntel 8080/8085の時代からの仕様を引き継いだものですが、こうして似た様な命令にコードを安易に割当てた結果、x86系CPUでは以後の命令拡張の際に使用できる命令コード番号が不足し、後の拡張命令ほど命令コードが繁雑かつ長大な構成になるという弊害が生じてしまっています。

この辺の仕様は元々Intelのプロセッサが日本の電卓メーカーの依頼で開発がスタートしたという歴史的経緯によるもので、極力小さいプログラムと少ないレジスタで電卓を構成できるように工夫された結果実装されていたものです。

さすがに、80386SX/DX以降のプロテクトモードと呼ばれる拡張動作モードで動作する場合は、開発時点でもうCコンパイラが普通に利用される時代となっていたこともあってか、先に挙げた8本のレジスタを汎用として自由に割当て利用可能になっています。

こうした事情から、x86系プロセッサでARM系での「ADD C,A,B」と同じ動作をするには、値を代入するロード命令(LD)を使用して一旦Aの値をCへ代入し、

 LD C,A
 ADD C,B

という形で2つの命令に分けて書かねば元のAの値が保存されない(加算命令実行で元のAの値が上書きされる)ことになります。

この辺の仕様は利用実態によって一長一短なのですが、いずれにせよ一度に扱える32ビット汎用レジスタの本数が8本しかないことは、いかに1命令で使用されるレジスタの本数を少なく済ませるような工夫が凝らされているにしても、x86系の弱点※注7であることは疑いようがありません。

※注7:流石にこれはコンパイラなどでの動作最適化の際に効率が非常に悪いため、x64アーキテクチャへの64ビット拡張の際に増強され、8本追加してr0~r15の16本の汎用レジスタが使えるように改良されました。なお、ARMでもv8系アーキテクチャへの拡張、つまり64ビット化の際に増強され、64ビット長の汎用レジスタが31本利用できるようになっていますが、これはARM v7までのアーキテクチャでレジスタバンク、つまり同じ役割のレジスタを複数用意して必要に応じて切り替え使用するために用意されていた、言わば「裏のレジスタ」を通常状態でそのままアクセスできるようにしただけで、実態としてのARM系プロセッサのレジスタ本数は32ビットでも64ビットでも変化がないと言えます。

もっともこうした事情はCPUメーカー側も十分承知しており、レジスタリネーミングという技術により実際にCPUに搭載してある物理的な汎用レジスタの本数を8本よりも多くしておいて、あるプログラムから見た汎用レジスタと、別の同時に実行している他のプログラムから見た汎用レジスタを、相互に干渉しない範囲で別々の物理レジスタに割当てて別名で扱う(リネーミングする)ことで性能向上を図られているケースが少なくありません。

つまり、αというプログラムにとってのEAXレジスタと、同じ瞬間のβというプログラムにとってのEAXレジスタを実際にはそれぞれCPUに搭載された異なる物理レジスタに割当てて、別名として振る舞わせることで、プログラムのソフトウェア的な互換性を保ちつつ、並列性向上とアーキテクチャレベルでの汎用レジスタ不足による問題をある程度解決しているのです。

なお、このレジスタリネーミング技術はARM系でも使用されており、例えばARM純正のCortex-A9では命令セットレベルでプログラマが意図して扱えるr0~r15まで16本の汎用レジスタに対し、実際には何とp0~p55、つまり56本もの物理レジスタが搭載されていて、内部的に割り当て切り替えを行って利用されています。

CISCとRISC

ARM系のCPUアーキテクチャは一般にRISC(Reduced Instruction Set Computer:縮小命令セットコンピュータ)と呼ばれるもので、極力命令の種類を減らしCPUの命令を解釈するデコーダ部分の処理を簡素化して計算速度を引き上げることを重視したタイプのものです。

このRISCは、かつてIBMの研究者たちが多数のソフトウェアを調査・分析した際に、それらのプログラムで実際に使用されている命令コードの種類が恐ろしく少なく、それ以外の使用頻度の低い命令コードについてもその多用される幾つかの命令コードの組み合わせで再現できる、つまりコンピュータにおいてはごく少数の命令コードを搭載・サポートするだけでも必要なプログラムを構成できることを発見したことがきっかけとなって開発されたものです。

命令コードの種類を最小限で済ませれば、当然命令デコーダをはじめとする主要回路部の構成をシンプルにできて消費電力低減も叶いますし、同じトランジスタ数の規模であればより高度な、あるいはより高速化を実現する機能の実装が可能となります。

ソフトウェア的にはCISC系プロセッサであれば1命令あるいは2命令程度の組み合わせで表現できる処理を基本的な命令の組み合わせによる多数の命令コード群によって記述せねばならないため負担が増大し、アセンブリ言語レベルでのソースコードの可読性が極端に低下するのですが、初期のRISC系プロセッサは同時期に大きな性能向上を実現したコンパイラの最適化技術普及もあって、そうしたデメリットを上回るメリットを示したことで、まずはユーザーがソースコードを持っていて再コンパイルするのが当たり前だった、UNIX系OSを搭載するワークステーションの分野から普及しました。

これに対しx86系はアーキテクチャ的にはRISCの対義としてCISC(Complex Instruction Set Computer:複合命令セットコンピュータ)と呼ばれるタイプに属し、命令の種類が多くそれぞれの命令自体も複雑な動作に対応するものが多いことを特徴とします。

コンピュータの歴史上ではCISCが先行してRISCの概念は後から誕生したのですが、これはいわゆるマシン語で直接プログラミングを行うこともそれほど難しくないCISCに対し、RISCはその効率化を求めて考案され、またそのプログラミングにあたってCなどの高級言語を使用し、コンパイラレベルで強力に最適化をおこなうのが大前提となっていたため※注8です。

※注8:元々最適化が前提であったことから、RISC系プロセッサ向けにコンパイルされたアセンブリ言語によるプログラムソースは非常に可読性が低いというか、普通の人間の理解を超えたコードが出力されることが珍しくありません。また、RISCプロセッサではこうしたコンパイラによる最適化コードでの利用を前提とするため、コンパイル作業が効率的に行えるように搭載する汎用レジスタの本数をCISC系プロセッサよりも格段に多く設計しないと性能が出ません。ただしARM系のアーキテクチャはRISCと言っても少々特殊な部類で、ARM v7までは利用可能なリソースの少ない組み込み機器への搭載などを重視してThumb命令と呼ばれる特別な命令が用意されるなど複雑な命令体系を備えており、また手作業でのコーディングにも配慮があるなど、どちらかと言えば命令セットレベルではCISCに近い性格を備えています。

こうした事情から、CISC系のCPUはそれこそ紙のノートに手書きでバイナリコードを書いてプログラミングを行うことさえ割と普通に行われるような環境下で、それもメインメモリなどのリソースが極端に限られる状況で利用されていたのに対し、RISC系のCPUは最初からコンピュータ上、それもかなり手厚い開発支援環境の下で、またそのCPUが動作する環境ではある程度以上メインメモリなどが潤沢に与えられる状態で利用するのが前提となっていたということで、その出発点が異なっていました。

同程度の半導体製造プロセス技術で製造する限りは、ソフトウェア側の負担を無視してチップそのものの設計や製造だけを見れば、構造がより簡単で使用するトランジスタ数の少ないRISCプロセッサの方が効率が良く、しかもチップを安く作れて有利です。

実際、このような優位性を背景として、1980年代末頃から1990年代初頭にかけてIBMのPOWER、MIPSのRシリーズ、SUN MicrosystemsのSPARC、それにDECのAlphaとRISCプロセッサが大きく躍進、注目された時代がありました。

以下、後編に続きます。

タグ:
PageTopへ