概要と特徴
スーパースカラパイプラインの基本
スーパースカラ方式のパイプラインの工程を大きく分けると、命令フェッチから命令デコード(Decode)、命令発行(Issue)までの前半と、命令を実行する後半に分けられます。前半を命令発行パイプラインと呼び、後半を命令実行パイプラインと呼びます。
命令デコーダ(Decode)から、命令実行パイプラインへ同時に送り込むことのできる命令数をイシュー(Issue)と呼び、命令実行パイプラインの本数をウェイ(Way)と呼びます。Cortex-M7の場合はどちらも2本(デュアルイシュー、デュアルウェイ)です。
Cortex-M7のパイプライン
Cortex-M7のパイプラインは64ビットで処理されます。すなわち32ビット命令が2つ同時に処理されることになります。
前半の命令の発行まではすべての命令が通るパイプラインです。プリフェッチからデコードして、命令を判別するまでのパイプライン処理です。デコード処理が2段になっていて、最初のデコードはDecodeと呼んでいますが、2つ目のデコードは発行(Issue)と呼ばれています。発行の後、2つの命令が後半へ受け渡されます。
後半の実行パイプラインでは、命令の種類によって複数の実行パイプラインに分かれます。ロード/ストア命令だとロード/ストアーパイプラインを通ります。ALUの演算命令だとALUパイプラインを通ります。ALUのパイプラインが2つ合って、同時に演算できますので、デュアルのスーパースカラパイプライン構造になっています。シフターはここに含まれます。複雑な積和演算はMACパイプラインを通ります。浮動少数点演算は浮動小数点演算パイプラインで演算されます。
Cortex-M7のスーパースカラはインオーダー発行なので、命令は基本的にプログラムの順番に従って実行されます。ほとんど全ての命令はプログラムの順番で完了しますが、浮動小数点演算は順番に依存せず完了します(アウトオブオーダーと呼ばれています)。また、デュアル発行なので、対の命令のほとんどは同時実行できます。
インオーダー発行とアウトオブオーダー発行
通常、命令は発行された順番で実行されますが、実行クロックが異なる命令が同時に発行されると、実行完了の順番が入れ替わる事態が発生します。処理がプログラムの順番通りの方式をインオーダー発行、プログラムの順番と異なる方式をアウトオブオーダー発行と呼びます。アウトオブオーダー発行の方がパフォーマンスは確実に高いですが、命令実行の管理、制御のハードウエアが複雑になります。インオーダー発行はハードウエアは簡単ですが、パフォーマンスが落ちます。
命令発行と制限
マイクロ操作(μ-Op)
スーパースカラを勉強すると「マイクロ操作」という言葉がでてきます。スーパースカラでは「マイクロ操作」で命令を実行しますので、まず「マイクロ操作」を説明します。
そもそも、RISCマイコンでは複雑な命令を取り扱わなかったので、Decodeの内部論理回路はランダム論理またはワイヤード論理で構成されてきました。CISCで採用されているひとつの命令をさらに細かいマイクロ操作で実行するような、マイクロ命令やマイクロプログラムは用いられてきませんでした。
しかし、近年ではRISCマイコンもCISCマイコンのような複雑な命令を扱うようになり、複雑な命令の処理を行う必要が出てきました。ランダム論理やワイヤード論理で複雑な命令の処理を行おうとすると、内部論理構造が複雑になり、回路効率が悪くなるので、スーパースカラ方式を採用しているRISCマイコンではマイクロ操作方式を採用するようになりました。
この方式では、デコードされた命令をさらにいくつかのマイクロ操作に分けます。このマイクロ操作のことをμ-Opと呼びます。
デコード(Decode)
Decodeでデコードされた命令は、ここで命令発行準備のためにチェックされます。そしてデコードされた命令をマイクロ操作(μ-Op)に分解します。そして次段のIssueへ受け渡します。
発行ステージ(Issue)
実行パイプラインに入る前にμ-Opによってデータ依存状態を決定します。すなわち同時発行できるかどうかをチェックします。2つの命令にまったく依存性が無い場合や、どちらのALUでも実行可能な場合は、同時発行されて同時実行されます。
イメージ図を描くと下図(a)の様になります。
しかし、2つの命令が、同時発行できない関係にあったり、一方のALUでしか実行できない場合は、同時発行同時実行ができないので、一方の命令にインターロックがかかります。すなわちμ-Opが一時的に停止され、下図(b)のように、次のサイクルで実行されることになります。例えばSIMD(Single Instruction Multiple Data)命令はひとつのALUでしか演算できませんので、同時発行はできずに、片方はインターロックされることになります。
デュアル発行の制限
発行制限
いくつかの命令はデュアル発行されません。どの命令がデュアル発行されないかは公開されていませんので、明言はできませんが、スーパースカラパイプラインの構造から次のように考えられます。
例えばアンアラインドロード(32bit境界をまたぐ場合)やアンアラインドストア(64bit境界をまたぐ場合)は、「境界におけるアンアラインドアクセスの取り扱い(第2回参照)」の章で述べたように、内部で、2回以上のアラインドアクセスに変換されて実行されるので、デュアル発行されません。SIMD命令はひとつのALUでしか演算できませんので、デュアル発行されません。
浮動少数点演算パイプラインは、1ウェイしかありませんので、 整数と浮動小数点除算フロート分割、浮動小数点平方根、倍精度浮動小数点命令はデュアル発行されません。ただし、整数パイプラインとは並列実行ができます。(実際の浮動少数点演算パイプラインは並列した2つのパイプラインに分かれていますが、ひとつが加算等の単純演算パイプライン、もうひとつが乗算、除算等の演算パイプラインで、実質は1ウェイになります。詳細は後述の「実行パイプライン(第5回参照)」の章で説明します)。
また、一般的に非汎用命令はデュアル発行されません。例えば、モード遷移の命令やデバッグ時に使う命令は、次に続く命令を異なるモードや条件で実行しなければならないので、デュアル発行されません。Cortex-M7で言うと、特権モードに移行するSVC(Supervisor Call)やデバッグ時に使われるBKPT(Break point)命令、また、PRIMASK等の特殊レジスタを扱うMRSやMSR、DMB(Data Memory Barrier)、DSB(Data Synchronization Barrier)もメモリの状態を変えますので、これらが非汎用命令にあたります。
まとめると、次の命令ではデュアル発行は行われません。
- アンアラインドロード(32bit境界をまたぐ場合)
- アンアラインドストア(64bit境界をまたぐ場合)
- 整数と浮動小数点除算フロート分割
- 浮動小数点平方根
- 全ての倍精度浮動小数点命令
- 非汎用命令 – SVC, BKPT, MRS, MSR, DMB, DSB
スーパースカラの場合に発行制限は付き物です。発行制限を少なくすれば、演算効率が上がり、パフォーマンスが改善されます。その為に、コンパイラがなるべく発行制限が起きないように、命令配列を考えてくれます。
Cortex-MシリーズはM0~M7までオブジェクトレベルで互換性があるので、下位のCortexでコンパイルした結果を、上位のCortexでそのまま実行可能ですが、やはり各Cortexに合ったコンパイラを使わないと、最高のパフォーマンスが得られません。
Cortex-M0/M0+ → M3 → M4では命令数が増えますので、再コンパイルが有効であることが明白ですが、Cortex-M4とCortex-M7では倍精度の浮動少数点命令しか違いが有りません。しかし、発行制限の観点から、Coretx-M7は、それに対応したコンパイラを使って発行制限を最小に抑えたオブジェクトを得た方が高いパフォーマンスが得られることになります。
例えば、Arm純正ツールのμVisionの最新コンパイラ(2015年11月14日現在)は、コンパイルオプションに “--cpu=Cortex-M7
” を指定することで、スーパースカラを考慮した最適化コードが生成されます。
こちらも是非
“もっと見る” Cortex-M7編
電力管理、コアデバッグ、浮動小数点ユニット
Cortex-M7もCortex-M3/M4と同じように低消費電力モードをサポートしています。基本はCortex-M3/M4と同じです。Cortex-M7にはWIC(ウェイクアップ割り込みコントローラ)を含むと3種類のスリープを持っていることになります。
AXI転送
AXI転送を行う際には、次に示す制限があります。バーストは、最大32バイト。バースト長さは、最大4転送。Strongly-orderedメモリまたはDeviceメモリの書き込みバーストの最大長は2転送です。Strongly-orderedメモリまたはDeviceメモリの読み出しは、常に1転送です。
キャッシュの初期化と有効化
Cortex-Aで採用されているユニフィケーションのポイント(Point of unification:PoU)と一貫性のポイント(Point of coherency :PoC)の考え方がCortex-M7でも採用されています。