[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
多くの RISC マシンでは、特定のサイクル数またないとその結果が得られない ような命令が存在する。良く見られるのは、メモリからデータをロード する命令である。多くのマシンでは、ロード命令の後、あまり早くロード されるデータを参照すると、パイプラインがストールする。
さらに、最近の多くのマイクロプロセッサは、複数の機能ユニット、普通は 一個の整数向けのユニットと一個の浮動小数点ユニットを持っており、 そのため、必要とされる結果が用意できていないときに良くパイプラインが ストールする。
この節では、ある命令の実行から、その結果が使えるようになるまでにどれだけの 時間が経過する必要があるかを指定する方法を説明する。 また、ある命令の実行することにより、機能ユニットの競合にのために、 同種の命令の実行を遅らせることがあるのはどういう場合かを指定する方法に ついても説明する。
この節で説明する指定方法のために、マシンを機能ユニットに分割し、 各機能ユニットは特定の種類の命令を first-in-first-out 順に 実行するものとする。 各サイクル毎に一つの命令を受付、続く命令でその結果が利用できる (フォワーディングによることが多い)機能ユニットについては、 指定を行う必要がない。 古典的な RISC マイクロプロセッサは、通常機能ユニットは一つしかなく、 それを‘メモリ’ と呼ぶことが出来る。最近のスーパースカラ・プロセッサ は、浮動小数点演算用の機能ユニットを複数持つことが多い。少なくとも、 一個の浮動小数点加算器と乗算器を持つのが普通である。
ある insn のクラスによるある機能ユニットの使用方法は、
define_function_unit
式で指定される。それは以下のようになる。
(define_function_unit name multiplicity simultaneity test ready-delay issue-delay [conflict-list]) |
name は、機能ユニット名を指定する文字列である。
multiplicity は整数であり、プロセッサの持つ同等のユニット数を 指定する。二個以上のユニットが指定された場合は、各ユニットは 独立にスケジュールされる。 本当に独立なユニット数を指定すべきである。パイプライン化されたユニットは 一個のユニットとして指定すべきである。(一個の命令クラスに対し 複数の機能ユニットがあり、それらが真に独立しており、パイプライン化 されていない機種の良く知られている例としては、CDC 6600 の二つの 乗算ユニットと二つの増分ユニットがあるのみである。)
simultaneity は、各機能ユニットの実態で同時に実行できる命令の 最大数か、機能ユニットがパイプライン化されていて制限がないのであれば ゼロを指定する。
機能ユニット name を参照している、全ての
define_function_unit
の定義は、multiplicity と
simultaneity について同じ名前と値を持たなければならない。
test は属性テストであり、この定義において記述しようとしている
insn を選択する。一個の insn は、複数の機能ユニットを使っても良く、
一個の機能ユニットは複数の define_function_unit
で指定されて
いても良いということに注意して欲しい。
ready-delay はある整数であり、ストールなしで命令の結果が 使えるようになるまでのサイクル数を指定する。
issue-delay はある整数であり、test 式に一致した命令が この機能ユニットを使い始めてから、後続の命令が使い始められるまでの サイクル数を指定する。コストが N だと N-1 サイクルの遅延を 表す。後続の命令は、以前の命令がより大きな値の ready-delay を 持っている場合にも遅延する可能性がある。このブロックの効果は、 simultaneity、ready-delay、issue-delay、 conflict-list といった項から計算される。 普通のパイプライン化されていない機能ユニットについては、 simultaneity は 1 であり、このユニットは、実行している命令の ready-delay サイクルの間ブロックされる。より小さな値の issue-delay は無視される。
conflict-list はオプションのリストであり、この機能ユニットの 衝突の詳細なコストを与える。指定されていると、条件のテスト式の リストになっており、その式は、name で実行されるように選ばれた insn に適用される。その insn の後に、既に name で実行中の test にマッチする特定の insn が続く。 リストのそれぞれの insn に対し、issue-delay が 衝突のコストを指定する。リストに無い insn については、コストはゼロである。 指定されていない場合は、conflict-list は、 機能ユニットを使う全ての命令がデフォルトになる。
このベクトルが使われる典型的な場合としては、 浮動小数点機能ユニットが単精度演算か倍精度演算のどちらかは パイプライン化できるが両方は出来ない場合や、メモリユニットが ロード命令はパイプライン化できるがストア命令はできない場合等がある。
例として古典的な RISC マシンを考えてみよう。ロード命令の結果は 二サイクルの間利用できず(一個の「遅延」命令が必要)、ロード命令は 同時には一個しか実行できないとする。これは以下のように指定できる。
(define_function_unit "memory" 1 1 (eq_attr "type" "load") 2 0) |
浮動小数点機能ユニットが単精度か倍精度のどちらかはパイプライン処理できるが、 両方はできないという場合、以下のように指定することができる。
(define_function_unit "fp" 1 0 (eq_attr "type" "sp_fp") 4 4 [(eq_attr "type" "dp_fp")]) (define_function_unit "fp" 1 0 (eq_attr "type" "dp_fp") 4 4 [(eq_attr "type" "sp_fp")]) |
注意: スケジューラは、機能ユニットの衝突を避け、
define_function_unit
の全ての指定を使おうとする。
我々は最近、これらの指定では、
複数のパイプラインユニットを使う命令を持つ、いくつかの新しめの
「スーパスカラ」プロセッサをモデル化できないということに気が付いた。
これらの命令は、第二の機能ユニットがそれらの命令を実行するのに使われている
間に潜在的な衝突を起こす可能性があり、その衝突を表現する方法がないのである。
このようなプロセッサの機能ユニットの衝突の仕組みの例や、その表現方法に
ついて提案があれば、知らせて欲しい。
This document was generated
using texi2html 1.78.