이신플러스의 달콤쌉싸름한 낙원

반응형

パイプライン処理

シングルサイクルCPUは、簡単で理解しやすいですがいろいろ問題点があります。
まず、全ての処理を1サイクルで実行するため、クリティカルパスが長くなります。全
ての命令が最長の命令遅延にあわせる必要があるので、動作周波数を上げること
が難しいです。これを解決する最も簡単で良く使われる方法はパイプライン化です。


싱글 사이클 CPU는 간단하고 이해하기 쉽지만 여러가지 문제점이 있습니다.
우선 모든 처리를 1사이클로 수행하기, 크리티컬이 길어집니다.
모든 명령이 최장 명령 지연에 맞춰야 하므로 동작 주파수를 올리는 것
힘들어요.이를 해결하는 가장 간단하고 많이 쓰는 방법은 파이프 라인화입니다.

パイプライン処理を実現するためには、まずクリティカルパスをできるだけたくさんの
段階に分けます。ここでは、命令読み出し(Instruction Fetch: IF)、命令でコードとレジ
スタファイル読み出し(Instruction Decode: ID)、ALUでの演算実行(Execution: EX)、
結果の書き込み(WB:Write Back)の4段階に分けます。このそれぞれの段階をパイ
プラインのステージと呼びます。

파이프 라인 처리를 실현하기 위해서는 우선 핵심 경로를 가급적 많은
단계로 나눕니다. 여기서는 명령 출력(Instruction Fetch:IF)명령에서 코드와 계산대
스타화일 읽기(Instruction Decode:ID), ALU 연산 수행(Execution:EX)
결과 글(WB:Write Back) 4단계로 나눕니다. 이 각각의 단계를 파이
프라인 스테이지라고 부릅니다.

それぞれの段階をステージと呼び、ある命令の一つのステージの実行が終わったら、
すぐに次の命令に対して同じステージで実行を始めてしまいます。そうすると、図に
示すように、命令1がWBの時に命令2がEX、命令3がID、命令4がIFを実行するよう
になります。すなわち、同時に4つの命令がずれながら実行されます。これをパイプ
ライン処理と呼びます。パイプライン処理では、1クロックに1命令ずつ終了します。
すなわちCPIは1です。一方、クリティカルパスは分割されているので、1サイクルアー
キテクチャに比べずっと短くなります。この方式は、常に全てのステージが動いてい
るので、各ステージは自分の資源を占有しなければなりません。このため、命令メモ
リとデータメモリを分離して同時に読み出せなければトラブル(構造ハザード)を生じ
ますし、レジスタファイルも常に2つのデータを読み出して、1つのデータを書き込む
ことができなければなりません。

각각의 단계를 스테이지라고 부르며 어떤 명령 하나 스테이지의 실행이 끝나면
바로 다음 명령에 대해서 똑같은 무대에서 실행을 시작합니다. 그렇게 하면 그림
같이 명령 1 WB 명령 2 EX명령 3 ID명령 4 IF 실행하도록
입니다. , 동시에 4개 명령이 어긋나면서 실행됩니다. 이것을 파이프
라인 처리라고 부릅니다. 파이프 라인 처리에서는 1클록에 1명령씩 종료합니다.
CPI 1입니다. 한편, 크리티컬 패스는 분할되어 있으므로, 1사이클소
키테 쿠차에 비해계속 짧아집니다. 이 방식은 항상 모든 스테이지가 움직이고 있다
므로 각 스테이지는 자신 자원을 점유해야 합니다. 이 때문에, 명령 메모
와 데이터 메모리를 분리하여 동시에 읽어 내지 못하 트러블(구조 해저드)를 낳다
고, 레지스터 파일도 항상 2개의 데이터를 읽어 내, 1개 데이터를 쓴다
수 있어야 합니다.

パイプラインのスループットは、もっとも長いステージの時間によって決まります。こ
のため、なるべく同じ長さになるように分割するのが正しいです。理想的に均等に切
れれば、ステージ数(深さともいいます)をdとすると性能はd倍になります。また、一
番長いステージを少しでも短く出来るのならば、できるだけたくさんのステージに
切った方がいいです。ちなみに律速になるステージでなければ切っても意味がなく、
ステージ間のデータ受け渡しのための損失のみを受けてしまいます。


파이프 라인의 산출량 가장 긴 스테이지의 시간에 의하여 결정됩니다. 아이
때문에 되도록 같은 길이가 되도록 분할하는 것이 옳습니다. 이상적으로 골고루
, 스테이지 (깊이라고도 합니다) d라고 성능은 d배가 됩니다. 또 한
차례 무대를 조금이라도 짧게 된다면 가급적 많은 스테이지
자른 편이 좋습니다. 덧붙여서 조절이 될 스테이지에서 으면 끊고 의미가 없고
스테이지 데이터 교환을 위한 손실만을 받게 됩니다.


パイプライン処理はd個の命令をずらして実行することで、理想的にはd倍の性能向
上を得られます。一方、プロセッサをn台同時に実行して性能を上げるマルチコア方
式もn個プロセッサがあれば、理想的にはn倍の性能向上が得られます。しかし、パ
イプライン処理では、各ステージが自分に必要な資源だけを持てばよいのに対して
並列処理は全プロセッサが全資源を持つ必要があります。すなわち、パイプライン
処理の方がはるかにコストが安いのです。このため、例えば工場でも生産効率を上
げようとすればまず流れ作業のベルトコンベアを構築し、生産が追いつかなくなると
ラインを複数化します。これがマルチコア方式に当たります。


파이프 라인 처리는 d개 명령을 비틀어 실행함으로써 이상적으로는 d배 성능 카이
위를 얻을 수 있습니다. 한편, 프로세서를 n대 동시에 실행하고 성능을 올리는 멀티 코어 방법
n개 프로세서가 있으면 이상적으로는 n배의 성능 향상이 이루어집니다. 그러나
이프 라인 처리에서는 스테이지가 자신에게 필요한 자원 가지면 좋은 에 대해서
병렬 처리는 모든 프로세서가 모든 자원을 가질 필요가 있습니다. , 파이프 라인
처리가 훨씬 비용이 쌉니다. 이 때문에, 예를 들면 공장에서도 생산 효율을
계속 좋다고 하면 우선 일관 작업 벨트 컨베이어를 구축하고 생산이 못 따라갈 것
라인을 복수화합니다.이것이 멀티 코어 방식에 해당합니다.

では先ほどのPOCOのパイプラインの役割を簡単に説明しましょう。IFは命令フェッチ
で、命令メモリから命令を取ってきて命令レジスタirに入れます。次にIDは命令デ
コードで、ir中の命令コードに従って制御信号を発生するとともに、レジスタファイル
からデータを読み出して、これをrega, regbに入れます。EXは命令実行で、IDで生成
された信号に従って、演算を行うか、メモリに対してデータを読み書きします。最後
はWBでは、計算結果あるいはメモリから読んで来た出たデータをレジスタファイル
に書き込みます。それぞれのステージ間にはパイプラインレジスタがあります。これ
は、データの流と制御信号の足並みをそろえる必要があるためです。

에서는 아까 POCO 파이프 라인 역할을 간단히 설명하겠습니다. IF 명령 페치
그래서 명령 메모리로부터 명령을 받아 보고 명령 레지스터 ir에 넣습니다. 다음 ID 명령
코드에서 ir 명령 코드에 따르면 제어 신호를 발생하는 동시, 레지스터 파일
에서 데이터를 읽어 내고 이를 rega, regb에 넣습니다. EX 명령 실행에서 ID로 생성
된 신호에 따라, 연산을 하거나 메모리에 대해서 데이터를 읽고 쓰겠습니다. 마지막
WB에서는 계산 결과 혹은 메모리로부터 읽어 왔다 나온 데이터를 레지스터 파일
기입합니다. 각각의 스테이지 간에는 파이프 라인 레지스터가 있습니다.
는 데이터의 유통 제어 신호 보조를 맞출 필요가 있기 때문입니다.


POCOのパイプラインの基本構成を図に示します。まだ分岐命令は実装されておら
ず、PCは毎回1増えます。演習用のコードの実行の様子をシミュレーションしながら
信号線をたどってみましょう。pipeというディレクトリの中のプログラムをシミュレー
ションしてきます。パイプラインのステージ間で情報を一時記憶しておくレジスタをパ
イプラインレジスタと呼びます。パイプラインレジスタは複数のステージで同じ情報を
記憶するため、名前の区別をする必要があります。ここでは、そのレジスタにデータ
を書き込むステージの名前を後ろに付けるルールにしています。例えばディスティ
ネーションレジスタ番号を入れておくrdは、IDとEXの間のものをrd_id、EXとWBの間
のものをrd_exと呼んでいます。


POCO 파이프 라인 기본 구성을 그림 나타냅니다. 아직 갈림 명령은 실장 되어 있으며
않고 PC는 매번 1증가합니다. 연습용 코드의 실행 모습을 시뮬레이션 하면서
신호선을 더듬어 봅시다. pipe라는 디렉토리 프로그램을 시뮬레ー
하지요. 파이프 라인 스테이지 간 정보를 일시 기억할 레지스터를
이프 라인 레지스터라고 부릅니다. 파이프 라인 레지스터는 복수 무대에서 같은 정보를
기억하기 때문에 이름 구별을 할 필요가 있습니다. 여기서는 그 레지스터에 데이터
쓰는 스테이지의 이름을 뒤에 붙인 룰로 하고 있습니다. 예를 들어 는 스티
네이션 레지스터 번호를 넣어 두고 rd ID EX사이 rd_id, EX WB사이
것을 rd_ex라고 부르고 있습니다.

この図はp1kai/example.asmをシミュレーションした際の4クロック目(pc:0002)に対応
します。最初に読み出された命令であるLDIが実行を行い、cregに0が入ります。次
の命令であるLDI r1,#1はIDステージ中にあり、ir中の命令コードに従ってイミーディエ
イトの値(1)をbregに入れ、ディスティネーションレジスタの番号をrd_idに入れ、ALU
の操作としてTHBをcom_idに入れます。IFでは次の命令のLDI r2,#2をフェッチしてい
ます。

이 그림은 p1kai/example.asm 시뮬레이션했을 때 4클록째(pc:0002)에 대응
합니다. 처음 판매 명령 LDI가 실행하고 creg 0이 들어갑니다. 다음
명령 LDI r1,#1 ID스테이지 중이고 ir 명령 코드에 따르이미ー디에
이토 (1) breg에 넣어 는 스티 네이션 레지스터 번호를 rd_id에 넣어 ALU
조작으로 THB com_id에 넣습니다. IF에서는 다음의 명령 LDI r2,#2 페치 하고 있다
니다.

次のクロックの様子です。最初の命令はWBステージに居て、結果をレジスタファイ
ルに書き込みます。書き込むべきレジスタの番号はrd_exに入っており、書き込む
データとあしなみをそろえてWBステージまで送られてきた様子がわかります。

다음의 클럭의 모습입니다. 처음 명령은 WB무대에 머물며 결과를 레지스터 화이
기입합니다. 써야 하는 레지스터 번호는 rd_ex에 들어갔고, 쓰는
데이터와 보조를 맞추어 WB무대까지 보내온 모습으로 나타납니다.


その次のクロックです。今までと違ってLD命令がIDステージに入っています。この命
令はレジスタファイルからレジスタを読み出し、bregに入れます。


다음의 클럭입니다. 지금까지와는 달리 LD명령이 ID스테이지에 듭니다. 목숨
영은 레지스터 파일에서 레지스터를 읽어 내 breg에 넣습니다.


さらに次のクロックです。LD命令はEXステージで読み出したレジスタの内容を使って データメモリを読み出します。読んだデータはdregに入れます。ADD命令はIDステー ジで、演算に用いるレジスタを読み出し、areg, bregに入れています。行う演算の種 類はfunctからcom_idに送られます。線香するLDI命令はWBステージで書き込みを 行っています。

다음 블록이에요. LD명령은 EX스테이지에서 읽어 낸 레지스터 내용을 쓰고데이터 메모리를 읽어 냅니다. 읽은 데이터는 dreg에 넣습니다. ADD명령은 ID스테이 에서 연산에 사용되는 레지스터를 읽어 내 areg, breg에 넣고 있습니다. 행하는 연산 종류 종류는 funct에서 com_id 보냅니다.분향하는 LDI명령은 WB무대에서 글을 고 있습니다.



さらに次のクロックです。ADD命令はALUで実行されますが、前のクロックでIDステー ジで全てのお膳立ては済んでいるので、単に演算結果をcregに書き込むだけです。

다음 블록이에요.ADD명령은 ALU에서 실행는데 예전 클락으로 ID스테이에서 모든 준비는 끝나는 것이므로 단순히 연산 결과를 creg에 글 뿐입니다.

では、ここで各ステージの演算を見積もりましょう。例えばIFはメモりの遅延+レジス タへ格納のためのセットアップ時間で2.2nsecになります。他のステージの遅延を見 積もりましょう。最も長いステージの遅延がクリティカルパスになりますのでこれで動 作周波数がわかります。
그럼 여기서 각 스테이지의 연산을 죠. 예를 들면 IF 기록 지연+레지스 에 격납하기 위한 준비 시긴에서 2.2nsec입니다. 다른 스테이지의 지연을  쌓이죠.가장 긴 스테이지의 지연이 크리티컬이 되기 때문에 이것으로   주파수가 나타납니다.

パイプラインは調子良く流れれば1クロックに1命令が終了します。しかし、場合に よってはこれがうまく行かないことがあります。パイプラインがうまく流れなくなる危 険、障害のことをパイプラインハザードと呼びます。ハザードには、資源の競合によ る構造ハザード、データの依存性により生じるデータハザード、分岐命令が原因の コントロールハザードの三つがあります。ハザードによりパイプラインがうまく流れな くなって性能が低下する現象をパイプラインストールと呼びます。
파이프 라인은 컨디션 좋은 흐르면 1클록에 1명령이 종료합니다. 그러나 경우에 따라서는 이것이  지 않는 것이 있습니다. 파이프가  흐르지 않게 된 위험. 장애 파이프 라인 해이라고 부릅니다. 해이에는 자원의 경합으로의 구조 해이, 데이터 의존성에 생기는 데이터 해이, 분기 명령이 원인 컨트롤해이 세가지가 있습니다.해이에 의한 파이프가  흐르 고 성능이 저하되는 현상을 파이프 라인 스톨이라고 부릅니다.

まず、最初に構造ハザードを紹介しましょう。構造ハザードは資源の共有によって生 じます。今回のPOCOのパイプラインはそれぞれのステージがそれぞれの資源を占 有しているために性能は低下しません。しかし、このため命令メモリとデータメモリは 分離して持たなければなりません。
우선 처음 구조 해이를 소개하겠습니다. 구조 해이는 자원 공유에 의해서생십니다. 이번 POCO의 파이프 라인은 각각의 스테이지가 각각의 자원을 자리가지고 있기 때문 성능은 저하하지 않습니다.그러나 이 때문에 명령 메모리와데이터 메모리는 분리해서 가져야겠습니다.



コストの関係上これが許されず、命令とデータを共用したメモリを用いる場合はどう でしょう?マルチサイクル版のようにアドレスにマルチプレクサを付けて共用メモリを 実現することができます。

비용 관계상 이것이 용납되지 않으며 명령과 데이터를 공유할 메모리를 사용한다면 어떨까요?멀티 사이클판처럼 주소로 다중화기를 달고 공용 메모리를 실현할 수 있습니다.


しかし、この場合、データメモリを読み書きするLDやST命令の実行時には、命令 フェッチができなくなってしまいます。すなわち、2クロック後の命令が図のようにIFが できないので、止めなければなりません。このような状態を水の流れの中にはいっ た泡に例えて、バブルと呼びます。バブルにより命令2の終了は通常よりも1クロック 遅れることになります。これがストールです。 ストールの影響はCPIの増加となって表れます。これを見積もるには、理想のCPIにス トールの確率×ストールのダメージを足してやります。ここではストールの確率はメ モリアクセス命令の生じる確率で、ストールのダメージは1サイクルです。したがって このストールによるCPIが25%増加することが分かります。

그러나 이 경우 데이터 메모리를 읽는 LD ST명령의 실행 시에는 명령 페치가 안 됩니다. 즉 2클락 후의 명령이 그림과 같이 IF를 할 수 없어서 끊어야 합니다. 이런 상태를 물의 흐름 속에는 한 거품에 비유해서 거품이라고 부릅니다. 거품으로 인한 명령 2종료는 평소보다 1클록 늦게 됩니다. 이것이 스톨입니다. 스톨의 영향은 CPI의 증가로 나타납니다. 이를 잡에는 이상의 CPI에 스 토르의 확률×스톨의 타격을 실어 줍니다. 여기에서는 스톨의 확률은 메 모리 접속 명령이 생기는 확률로, 스톨의 데미지는 1사이클입니다.그래서 이 스톨에 의한 CPI25%증가할 수 있습니다.

構造ハザードは、資源を複製により解決可能です。すなわち、設計者がコストと性能 のトレードオフを考えて決めます。この場合はメモリを共有化するコスト減を取るか、 CPIが延びてしまうことを考えてやめるかを考える必要があるのです。 ちなみにメモリを複製するのは大変ですが、チップ内のキャッシュメモリを複製する のは楽なので、普通のプロセッサをキャッシュを分離して持たせることによりこの問 題を回避しています。
구조 해이 자원을 복제에 의한 해결 가능합니다. , 설계자가 비용과 성능트레이드 오프를 생각하여 결정하겠습니다.이 경우는 메모리를 공유화하는 비용 감소를 취하거나 CPI 늘어나는 것을 생각하고 그만둘지 생각할 필요가 있습니다. 덧붙여서 메모리를 복제하는 건 힘들지만,   캐시 메모리를 복제하는 것은 즐거운 것, 보통 프로세서를 현금 분리하고 갖게 하는 것으로  문제를 회피하고 있습니다.

次にデータハザードを紹介します。データハザードは、直前の命令の結果がレジス タファイルに書き込まないうちに、後続の命令がこれを読みだすことにより起きます。 相互に依存する命令を部分的に同時に実行しようとするために生じてしまい、パイ プライン処理の本質的な問題点といえます。RAW、WAR、WAWの三つのハザードが 考えられますが、POCOではRAWハザードだけが生じます。他のハザードについては 後に説明します。
그런 다음 데이터 해이를 소개합니다. 데이터 해이는 직전 명령 결과가 레지스  파일 지 않아 후속 명령이 이것을 읽기 시작함으로써 일어납니다.서로 의존하는 명령을 부분적으로 동시에 실행하려고 하기 때문 생긴다, 파이프라인 처리 본질적인 문제점이라고 할 수 있습니다. RAW, WAR, WAW 세개 해이가 생각할 수 있지만, POCO에서는 RAW해이 생깁니다.다른 해이에 대해서는 나중에 설명합니다.

では、前回の演習のディレクトリでtest.asmのプログラムを実行してみましょう。この プログラムはLDI r0、#0で、r0に0を入れて、これを使ってLD r1,(r0)でメモリの0番地 を読み出そうとしています。ところが、LDI r0,#0がr0に0を書くのはWBステージの終 わりです。しかしLD命令はLDIがまだEXステージに居るときにレジスタファイルを読み 出してしまいま
그럼 지난번 훈련 디렉토리에서 test.asm 프로그램을 실행하고 봅시다. 이 프로그램은 LDI r0,#0으로 r0 0을 넣어 이것을 쓰고 LD r1,(r0)에서 메모리0번지를 읽어 내려고 합니다. 그런데 LDI r0,#0 r0 0 쓰는 것은 WB무대 마지막답지 않습니다.그러나 LD명령은 LDI 아직 EX스테이지에 있을 때레지스터 파일을 읽어 내어 버려습니다

同じようにLDIの次の次の命令であるADDIも、LDIがWBで書き込み終わる前に、読み 出しを行うため、古いデータを読んでしまいます。
똑같이 LDI 다음 다음의 명령이다 ADDI LDI WB로 글을 끝나기도 전에읽기 국물을 하기 때문에 예전 데이터를 어 버립니다.

では、どのようにしてこの問題を回避できるでしょうか?先行した命令とこの結果を 使う命令の間の間隔を広くしてやればいいのです。NOP、つまり何もやらない命令を 二つ入れれば、LDI命令の結果が書き込まれてからLD命令が値を読み出すことがで きます。この図に対応するプログラムnop2.asmを実行してみましょう。きちんと動い ていることはわかりますが、非常に時間が掛かります。
그럼 어떻게 이 문제를 회피할 수 있을까요? 앞선 명령과 이 결과를 사용 명령사이 간격을 넓게 면 됩니다. NOP, 즉 아무것도 하지 않는 명령을 두개 넣으면, LDI명령 결과가 올라와 LD명령이 값을 읽을에서 옵니다. 이 그림에대응하는 프로그램 nop2.asm 실행하고 봅시다.제대로 움직이고 있는 것은 알겠지만 매우 시간이 걸립니다.

では先の構造ハザードと同じく、CPIがどの程度伸びるかを見積もりましょう。理想の CPIを1とします。ストールの確率は、ある命令の結果を後続の命令が利用する確率 ですが、これは結構高いです。というのは多くの場合、ある命令は、次の命令で使う データを作るために実行されるからです。ここでは0.8とします。ストールのダメージ はNOP2個分なんで、CPIは2.6になってしまうことになります。これではパイプライン 処理の性能向上が台無しです。
에서는  구조 해이와 마찬가지로 CPI 어느 정도 늘까 죠. 이상 CPI 1로 합니다. 스톨 확률은 어느 명령 결과를 후속 명령이 이용할 확률이지만 이것은  높습니다.라는 것은 많은 경우  명령은 다음 명령에서 사용데이터를 만들기 위해서 실행되기 때문입니다. 여기에서는 0.8로 합니다. 스톨 타격 NOP2개 분량이니 CPI 2.6이 되어 버리게 됩니다.이래서는 파이프 라인 처리 성능 향상이 엉망이에요.

NOPを入れずにデータハザードを解決するためには、レジスタに書き込む前でも、用 意のできた値を横流ししてやれば良いです。これをフォワーディングと呼びます。こ の例は、レジスタファイルにフォワーディングを付ける方法を示しています。この方 法では、先行命令が、今書き込みつつある値を、IDステージにある命令が使う場合、 つまり書き込むレジスタ番号と読み出すレジスタ番号が一致して書き込み信号 rwe_ex=1になっている場合は、書き込む値をそのまま読み出すデータと入れ替えて areg, bregに入れてしまいます。この例ではaregの値が入れ替わります。これはWB ステージからIDステージへのフォワーディングです。

NOP 지 않고 데이터 해이를 해결하기 위해서는 레지스터 전이라도  있는 값을 빼돌리 하면 좋습니다. 이것을 포워딩이라 부릅니다.  예는 레지스터 파일 포워딩을 붙이는 방법 나타내고 있습니다. 이쪽 법은 선행 명령 지금  있는 값 ID스테이지에 있는 명령이 사용할 경우, 즉  레지스터 번호와 판매 레지스터 번호가 일치해서 작성 신호 rwe_ex=1이 되어 있는 경우는, 쓰는 값을 그대로 판매 데이터와 교체하 areg, breg에 넣어 버립니다.이 예에서는 areg 값이 바뀝니다.이는 WB무대에서 ID단계로 포워딩입니다.


次は同じ方法をEXスレー時とIDステージ間でも行ってみましょう。EXステージで計算 の結果は出ているので、この計算したてのデータを、レジスタファイルから読み出し た値と入れ替えて、areg, bregに入れてやります。条件はやはりレジスタ番号が一致 して、rwe_1=1になることです。このためにareg, bregの入力にマルチプレクサをつけ ます。p2kaiの下のpocop.vはこの図と同じフォワーディング回路を使っています。 p1kaiの下では動かなかったtest.asmが動作することを確認しましょう。

다음 똑같은 방법으로 EX스레 때와 ID스테이지 간에도 가 봅시다. EX스테이지에서 계산 결과가 나오 있으므로 이 계산하 데이터를 레지스터 파일에서판독 값으로 교체하고 areg, breg에 넣어 줍니다. 조건은 역시 레지스터 번호가일치 하고 rwe_1=1입니다. 이 때문에 areg, breg의 입력에 다중화기를 켭니다.p2kai아래 pocop.v 이 그림과 같은 포워딩 회로를 이용하고 있습니다.p1kai아래는 움직이지 않았다 test.asm가 동작하는 것 확인합시다.


フォワーディングはrd,rsの両方に対して行う必要があります。これは、aポート側に フォワーディングを行った例です。

포워딩 rd, rs양쪽에 대해서 실시할 필요가 있습니다.이는 a포트  포워딩한 예입니다.



もう一つ、ALUの入力にマルチプレクサを付けた例を示します。どちらの方法でも フォワーディングを行うことができます。

또 하나, ALU의 입력에 다중 절환을 붙인 예를 나타냅니다.어떤 방식이든지 포워딩을 할 수 있습니다.

今回取り扱ったハザードは、先行する命令が答えを書く前に読んでしまうことから Read After Write(書いた後に読む)のがうまく行ってないという意味でRAWハザード と呼びます。RAWハザードは命令間に普通の依存性があるときに生じるため最も本 質的なハザードです。これに対してWARハザードは読む前に書いてしまうことによる ハザードで、POCOではWBが最終ステージなので起きることはありませんが、早い 段階で書くパイプラインでは発生します。このハザードは、実はレジスタの名前を変 える(リネーミング)によって解決が付きます。WAWハザードはレジスタに関してはあ まり一般的なハザードではなく、もちろんPOCOでは発生しません。同じ問題はI/Oで も出てきましたので、覚えてらっしゃる方もおいでかと思います。
이번에 다룬 해이는 선행하는 명령이 답을 쓰기 전에 는 것을 Read AfterWrite( 쓴 후에 본다) 하지 않는다는 의미에서 RAW해이라고 부릅니다. RAW해이는 명령 사이에 보통 의존성이 있을 때 생기기 때문 가장  질적 해입니다. 이에 대해서 WAR해이는 읽기 전에  버림으로써 해저드로, POCO에서는 WB 최종 무대이기 때문에 일어나는 것은 없지만 조기 단계에서 쓰는 파이프 라인으로는 발생합니다.  해이는 사실 레지스터 이름을 이상할 수(리()에 의해서 해결이 붙습니다. WAW해이는 레지스터에 관해서는  마리 일반적인해이가 아니라 물론 POCO에서는 발생하지 않습니다.같은 문제는 I/O에서도 나오고 왔으므로, 기억하시는  올까 합니다.

前回まで構造ハザード、データハザードを紹介しました。三つ目がコントロールハ ザードです。これは分岐命令が原因です。元々パイプラインは次に実行する命令が 分かっているから流れるのであって、分岐命令があって次に実行する命令がどちら になるかが分からない場合にストールが起きるのは当然と言えます。
전회까지 구조 해이, 데이터 해이를 소개했습니다. 세번째가 통제  자드입니다. 이는 분기 명령이 원인입니다.원래 파이프 라인은 다음에 실행할 명령이 알고 있기 때문에 흐르는 것이며, 분기 명령이 있어서 다음에 실행할 명령이 어느 쪽이 될지 모르는 경우 스톨 일어나는 것은 당연하다고 말할 수 있습니다.

実を言うと、今まで分岐命令をパイプラインに組み込んでいませんでした。PCは毎ク ロック1づつ増やしていったため、パイプラインはスムーズに流れたわけです。しか し、実際にはそうは行きません。ではALUで飛び先を計算するとどうなるでしょう?こ の場合、飛び先が決まるのには3クロック掛かってしまいます。
사실 지금까지 분기 명령을 파이프 라인에 포함시키지 않았습니다. PC는 매  1 늘리 파이프 라인은 매끄럽게 흐르는 것입니다. 밖에 하지 실제로는그럴 수 없습니다. 그럼 ALU에서 비비선을 계산하면 어떻게 될까요? 경우 비비선 정해지는데 3클럭 걸립니다.

次の命令を取ってこれるのは、飛び先のアドレスが決まった次のサイクルからに なってしまいます。この場合は3クロック分バブルが入ってしまい、ストールのダメー ジは3クロックになります。分岐命令がフェッチされる確率はプログラムに大きく依存 しますが、それなりの割合になることが多いです。Branch,JMP,JALの割合を合わせて 25%と考えると、理想CPIの1が1.75になります。これは相当大きなダメージであ ると言えます。
다음 명령을 가져오는 것은 비비선 주소가 정해진 다음 사이클로가 되어 버립니다. 이 경우는 3클록분 거품이 끼어 버리고 스톨의 다 이미지 3클락이 됩니다. 분기 명령이 페치 할 확률은 프로그램에 크게 의존하지만 나름대로 비율이 되는 것 많습니다. Branch, JMP, JAL 비율을 맞추어 25%로 생각하면 이상 CPI 1 1.75입니다.이는 상당히 큰 타격에서  있다고 말할 수 있습니다.

ダメージを減らすためには、分岐命令が成立するかどうか、成立する場合どこに飛 ぶかを早めに判別する必要があります。命令がirに入った後、すなわちIDステージ で分岐命令かどうかは分かります。このステージでレジスタファイルからレジスタが 読み出され、分岐の条件がチェックされます。ir中にある飛び先をIFステージに送っ て加算を行い、分岐が成立する場合にはpcの内容を更新します。

타격을 줄이기 위해서는 분기 명령 성립하는지, 통과될 경우 어디 토비 브카 빨리 판별할 필요가 있습니다. 명령이 ir에 들어간 뒤, 즉 ID스테이지에서분기 명령인지는 알 수 있습니다. 이 단계에서 레지스터 파일에서 레지스터가 분기 조건이 체크됩니다.ir에 있는 비비선 IF무대 보내 가산을갖고 분기가 성립하는 경우에는 pc 내용을 업데이트합니다.

分岐命令は、レジスタの内容で分岐するかどうかを判定します。このレジスタは直前 の命令で更新される可能性があります。データハザードを避けるためには、直前の 演算結果をフォワーディングする部分について判定が必要になります。この判定の 結果で飛び先をpcに書き込むかどうかが決まるので、かなり長大なパスができてし まいます。これが、この方法の問題点です。

분기 명령은 레지스터 내용에서 분기되는지 여부를 판정합니다.  레지스터는 직전 명령으로 갱신될 가능성이 있습니다. 데이터 해이를 피하려면 직전연산 결과를 포워딩하는 부분에 대해서 판정이 필요합니다.  판정 결과 비비선 pc 여부 결정 때문에, 상당히 장대한 패스가 가능하 뿌립니다.이것이 이 방법의 문제점입니다.

先のスライドの方法を使っても、分岐命令はIDステージで実行されることになるため、 分岐命令の直後の命令は実行していいのかどうか分かりません。真面目にこれに 対処するためには分岐命令の後に1クロックストールさせて、次の命令を1クロック 遅らせてフェッチする必要があります。このようにすると、CPIが1から1.25に増えま す。分岐命令の判定をこれ以上早く行なうことができないことを考えると、この性能 低下は避けられないように思います。しかし、単純な方法が二つ考えられます。

 슬라이드 방법을 사용해도 분기 명령 ID스테이지에서 실행되기 때문에 분기 명령 직후 명령은 실행하고 좋을지 어떨지 모릅니다. 진지하게 이에대처하기 위해서는 갈림 명령  1클록 스톨 하고 다음 명령을 1클록 늦추고페치 할 필요가 있습니다. 이렇게 하 CPI 1부터 1.25로 늘어나습니다. 분기명령 처분을 더 이상 빨리 할 수 없음을 생각하면 이 성능 하락이 불가피한 것 같습니다.그러나 단순한 방법이 두가지 생각됩니다.


一つの方法はpredict not-takenと呼び、分岐命令が成立した場合は1クロック待た す一方、分岐しなければフェッチした命令を捨てないで流してやる方法です。この方 法を使うと、ストールするのは分岐命令が成立する場合のみになります。では、分 岐が成立する確率はどの程度になるでしょう?実はこれは結構高く、ここでは7割と 見積もりました。なぜ高いかと言うと、コンピュータはループを繰り返し実行しますが、 ループにつき1回かならずアドレスが後方に戻っているはずだからです。したがって この方法の効果はイマイチと言えます。

하나 방법은 predict not-taken이라 부르며 분기 명령이 성립 경우 1클록기다립니다 한편 분기하지 않으면 페치 한 명령 버리지 않 흘리고 방법입니다. 이쪽 법을 사용하면, 스톨 하는 것은 분기 명령이 통과될 경우에만 됩니다. 그럼  거리가 성립할 확률은 어느 정도 이지?사실 이것은 상당히 높은, 여기에서는 7할로 잡았습니다.  높으냐고  컴퓨터는 루프를 반복 실행합니다만, 루프에 대해1회  주소가 후방으로 돌아가고 있을 것이기 때문입니다.그래서 이 방법 효과는 별로입니다.

もう一つの方法は遅延分岐と言って、成立しようがしまいが、次の命令をパイプライ ンに入れて実行してしまう方法です。すなわち、分岐命令の直後の命令(これを分 岐スロット内の命令と呼びます)は必ず実行されます。このことは言葉を変えると、 分岐は1命令分効き目が遅いと考えることができます。このためこの方法を遅延分 岐と呼びます。分岐スロットに有効な命令を入れてやることで、オーバーヘッドはなく なります。命令の順番を入れ替えて遅延スロットに有効な命令を入れることをパイプ ラインスケジューリングと呼びます。どうしても埋まらない場合はNOP命令で埋めて やります。
또 하나의 방법은 지연 분기다며 통과되든 말든 다음 명령을 파이 플라이 에 넣어 실행하는 방법입니다. 즉, 분기 명령 직후 명령(이것을 분-슬롯 내의 명령이라고 부릅니다)은 반드시 실행됩니다.  것은 말 바꾸면 분기 1명령부분 효과가 느리다고 생각할 수 있습니다. 이 때문에 이 방법을 지연 정도 거리라고 부릅니다. 분기 슬롯에 유효한 명령을 넣어 줌으로써 오버 헤드 없습니다. 명령의 순서를 바꿔 지연 슬롯에 유효한 명령을 넣는 것을 파이프 라인 스케줄링이라고 부릅니다.아무래도 채워지지 않으면 NOP명령으로 묻어 줍니다.

2番地の内容と3番地の内容の掛け算を行なうプログラムで遅延スロットの埋め方 を説明しましょう。元のプログラムは左のようにBNZの後にはNOPを入れます。NOP はバブルと同じなので、このプログラムはループ1回につき1クロック分オーバー ヘッドが掛かることが分かります。ところがここにADD r3,r1を移動したらどうなるで しょう。一見右のプログラムにおいてADD r3,r1はループの外に出ているようですが、 BNZは遅延分岐なので、直後のADD命令は必ず実行されます。結果として右と左の プログラムは同じ結果を出力します。しかし、ループ内にNOPが入らない右のプログ ラムの方がループを回る回数に相当するクロック数分速いことになります。p3kaiの 下の例題プログラムを使ってちゃんと答えが出ることを確認しましょう。
2번지 내용과 3번지 내용 곱셈을 하는 프로그램에서 지연 슬롯 는 방법을 설명하겠습니다. 원래의 프로그램은 다음과 같이 BNZ 에는 NOP넣습니다. NOP은 거품과 같아서 이 프로그램은 루프 1회에 1클록  오버 헤드가 걸릴 수 있습니다. 그런데 여기 ADD r3, r1을 이동한다면 어떻게 되 초등. 언뜻 오른쪽 프로그램에서 ADD r3, r1 루프 밖으로 나가고 있는데,BNZ 지연 분기이므로 직후 ADD명령은 반드시 실행됩니다. 결과적으로 오른쪽과 왼쪽 프로그램은 같은 결과를 출력합니다. 그러나 루프  NOP이 안 들어가오른쪽 뿌로구 램이 루프를 도는 횟수에 해당하는 클락 몇분 빠르게 됩니다.p3kai아래의 예제 프로그램을 사용하여 제대로 이 나오기를 확인합시다.


반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading