第7回分
全体的な質問
パイプライン処理やスーパースカラは現在のコンピュータにも用いられているのか?
実際の制御回路の処理はパイプライン処理なのか?
ほとんど常識のように使われているみたいですね。
ノイマン型でないコンピュータにはどのようなものがあるのか?
いわゆるデータフローマシン、と呼ばれるやつがはやったころもあるのですが、
最近はどうなんでしょうね。
これらの高速化手法はいつ頃生み出されたのか?また革新的にマイクロプロセッサを高速化できたのはどの方法か?
いわゆる世界最初のスーパーコンピュータは、クレイ社のCray-1ですが、
これはパイプライン処理をとりいれた最初のコンピュータ、だそうです。
約30年前ぐらいでしょうか。
パイプライン処理は、ある意味、時間方向の並列化で、これに加えて
空間方向の並列化が、スーパースカラ等になります。
時間と空間以外はないので、これ以上の劇的な高速化は無理じゃないのかな、
というのが、一般的な見方のようです。
パイプライン処理
パイプライン処理の例がとても身近にあって驚いた。片口さんの例はとても分かりやすかった。
ぜひ生きた教材として。
パイプライン処理の欠点について、それほど欠点とは感じなかった。
分岐命令などによるパイプラインの乱れがしょっちゅうおこると、
足かせになります。
しかも分岐命令は、プログラム中に頻繁に現れるので、やっかいなのです。
p65 図4.14のスーパースカラの図の見方がよく分からなかった。
(※保留)
分岐命令を受け取ったときの処理がよく分からなかった。
Dの時点で分岐命令とわかり、Eの時点で、分岐先のアドレスを
プログラムカウンタに代入することで、分岐が起こります。
分岐命令が発生したとき、それまで発生したフェッチを捨てるのがなぜか分からなかった。捨てるのではなく待ち状態にすれば良いのでは?
待ち状態にしても、その命令は、当分の間、実行されないわけですから、
非効率的ですね。
分岐予測の方法はどんなものがあるのか?
基本的には、それまでの分岐の履歴情報に基づくアルゴリズムが多いようです。
分岐予測はデコード中に行われる処理なのか?それともデコードが完了してから予測するのか?
デコードと並行して行うべきでしょうね。
制御回路は演算器と同時に働いているのか?
基本的にはそういうことです。
レイテンシ対応で、投機的実行の取捨選択の判断基準がいまいち分からなかった。
分岐先の命令の実行を続ける、ということです。
パイプラインでの投機的実行とは具体的にどのような例があるのか?
講義中に紹介した例ぐらい、でしょうか。
並列にF, D, E を実行すればおのおのの処理時間が延びる気がするのだが。
いえ、1つの命令を実行すること自体が、F→D→Eの3ステップが必要なので、
処理時間はのびはしません。
分岐予測で、D1で分岐しない予測をして開始するfetchはF2となるのでしょうか?
そういうことになります。
MPUのアーキテクチャ
MPUとCPUの境界線とは?
本来は、コンピュータの中央処理装置がCPUで、それを集積回路で実現したものが
MPUですが、現実的には、両者の区別はあまりないようです。
命令・データのメモリを分けるとあったが、命令・データとは具体的にどの部分か?
例えばADD A, Bで、A+Bを求めるとき、ADD命令が命令、
AとBがデータ、です。
コンピュータが命令・データのメモリを判別する方法にはどのようなものがあるのか?
上記の例のように、命令と演算対象のデータ(オペランド)を見れば明らかですね。
一般にPCのメモリを増設すれば多少は高速化するのは、メモリの増設によって命令データ用のメモリを分けているからなのか?
いえ、これは、仮想記憶にディスクを使う頻度が下がる、ということの
効果の方が大きいように思います。
一般のPCのCPUは、例えばIntel x86は、命令とデータでメモリが分かれていません。
ハーバードアーキテクチャとは、メモリを2つにするのか、それとも命令データ用のバスを用意するということなのか?
両方です。
命令セット
1.命令数をぐっと減らす とは、2.命令数の改善 にもつながると思うのだが。
いえ、ある処理を行うために必要な命令数が多くなりますので、
プログラムを構成する命令数は増えます。
例えばADD A, BでA+BをBに代入する、という命令があるとすれば、この1命令で済みますが、
一般的なRISCプロセッサの命令では、メモリ(変数)間の演算命令がなく、
レジスタ間の演算命令しかないので、
(1)AをレジスタR0に代入、(2)BをレジスタR1に代入、
(3)R0+R1をR1に代入、(4)R1をBに代入、という4命令が必要になります。
多機能な命令とは具体的にどのようなものか?
例えば上記の例は比較的シンプルな例ですが、
変数を演算しながら条件判断をする、というような命令もあるようです。
CISCで単純な命令を使えるようにして命令数を減らせば、1命令あたりのクロック数も減るのか?
その発想が、いわゆるCRISCです。
RISCは以前は主流だったと考えて良いのか?
最近でも、マイコンでは、よく見かけますね。
RISCは「命令数をぐっと減らす」とあったが、正確には命令数ではなく1命令中のfetchやdecodeなどの処理数ではないのか?
いえ、扱える命令の種類を減らす、という意味です。
CISCとRISCについて、命令数を減らそうとすれば1命令あたりのクロック数は増え、逆についても同様である以上、結果として処理速度は変わらないように思うのだが。
そのあたりを、キャッシュ増量と命令デコード回路の高速化で乗り切ろうというのが
RISCの思想です。
複雑な命令をCSICまたはRISCで処理するのでは、どれほど差があるのか?
というわけで、ケースバイケースですね。
スーパースカラ・VLIW
スーパースカラは並列処理による高速化の「MPU版」とのことだが、MPU版でないものもあるのか?
MPUで使われる動的な並列化をスーパースカラと呼ぶようです。
並列の同時にできるとどう判断しているのか
命令を同時に実行できるかどうかを、どこが判断しているのか?
命令間の依存関係(特に変数に関して)を、その場でリアルタイムで、
制御回路がチェックすることになります。
VLIWを用いるとき、A+1→A, A+2→A のように依存関係があるときはどんな風に処理するのかよく分からなかった。
それはコンパイラが、別命令にわけてしまいます。
VLIWについて、あまりに命令が長いと処理に時間がかかったりはしないのか?
その分、たくさんの処理が並列に行われますので、それで処理速度を稼ごうというのが
VLIWの思想です。
VLIWでどのようにコンパイラが最適化するのか、方法を知りたいと思った。
命令間の依存関係と、使える演算器の数と種類を勘案しながら、ですね。
メモリアーキテクチャ
キャッシュのところがよく分からなかった。
「計算機アーキテクチャ」でも使っている内容だと思いますので、
復習してみてください。
メモリの種類が変わるごとに段階的に速くなっているのはなぜか?
一般に、高速なメモリほど高価なので、小容量にせざるを得ない、ということです。
感想
ピタゴラスイッチいいですよね。
DVDブックもぜひ。
計算機アーキテクチャの内容と同じものだったので理解しやすかった。
よい復習になってよかったです。
戻る