この記事には複数の問題があります。改善
やノートページでの議論にご協力ください。「ハザード (コンピュータ)」はこの項目へ転送されています。プロセッサパイプラインにおけるハザードについては「パイプライン処理#パイプラインハザード」をご覧ください。
パイプライン処理(パイプラインしょり、英: pipeline processing)とは、コンピュータ等において、処理要素を直列に連結し、ある要素の出力が次の要素の入力となるようにして、並行(必ずしも並列とは限らない)に処理させるという利用技術である。要素間になんらかのバッファを置くことが多い。レイテンシの向上よりも、単位時間あたりの処理量(スループット)の向上に重点が置かれる方式である。
コンピュータ関連のパイプラインには、次のようなものがある。 ライン生産方式などパイプライン的なものは様々なところに存在する。自動車の組み立てを考えてみよう。流れ作業の一工程として、エンジンのシャーシへの設置、フードの設置、車輪の設置があり、この順番で実施されるとする。ラインの各工程には、1台の組み立て中の自動車だけがある。エンジンを設置し終えた自動車は、次にフードの設置工程に移され、エンジン設置用の機械設備は次の自動車に取り掛かることができる。最初の自動車はさらに車輪設置工程に進み、2台目の自動車はフード設置工程に進み、3台目の自動車がエンジン設置工程に進んでくる。エンジン設置に20分かかり、フード設置に5分、車輪設置に10分かかるとすると、一度に1台ずつ組み立てると3台組み立てるのに105分かかる。しかし、ライン生産方式では75分で3台の組み立てが完了する。その後も20分間隔で自動車が組み立てられていく。 ライン生産方式の例で示したように、パイプライン処理は単一のデータの処理を高速化するわけではなく、データストリームの処理をする際のシステムのスループットを向上させるだけである。 パイプラインを長くすると、レイテンシは増大し、1つの信号がパイプの先から先まで到達するのに時間がかかるようになる。 パイプライン化されたシステムでは、あるステージが前のステージのリソース(回路、処理装置、メモリなど)を再利用できないため、一般に1つずつ処理するシステムよりも多くのリソースを必要とする。さらに言えば、パイプライン処理によって1つの命令の完了にかかる時間は増大する可能性がある。 パイプライン設計では、各ステージを釣り合わせることが重要である。上述の組み立てラインの例で言えば、エンジンの工程も車輪の工程も15分で済めば、スループットはさらに向上する。レイテンシはそれでも35分だが、15分に1台の間隔で自動車を生産できるようになる。 別の設計上の配慮すべき点として、ステージ間の適切なバッファの用意がある。ステージの処理時間が不定の場合や、パイプラインの途中でデータが生成されたり破壊されたりする場合には、バッファが特に重要である。 一般的なマイクロプロセッサは、クロック同期設計であり、バッファのある同期パイプラインを使っている。この場合のステージ間のバッファを「パイプラインレジスタ」と呼び、全体がクロックによって同期されている。クロックサイクルは、パイプラインの各ステージで最長の時間がかかる部分より長く設定する。それによって、前のステージの結果がパイプラインレジスタに書き込まれてから、次のステージがそれを利用して処理することができる。 非同期パイプラインは非同期回路で使う。その場合のパイプラインレジスタは非同期に駆動される。一般にステージ間で要求メッセージと応答メッセージをやり取りして処理を進める。例えば、あるステージで処理が完了したとき、次のステージから要求メッセージが来ていたら、応答メッセージを返し、前のステージには要求メッセージを送る。あるステージが応答メッセージを受け取ったら、入力レジスタから読み込むことができ、処理を開始できる。 バッファのある非同期パイプラインを使ったマイクロプロセッサの例としてAMULETがある。 ステージ間にバッファのないパイプラインを「ウェーブパイプライン (wave pipeline)」と呼ぶ。その代わり、パイプラインの各ステージのレイテンシが釣り合うように設計されている。したがって、データはパイプライン上を波のように流れ、それぞれの波は可能な限り短く保たれる。 最大処理速度は、データを投入できる間隔で決まる。それより短い間隔でデータを投入すると、波が互いに干渉するように結果が不正になる。 以下、CPUの内部処理を説明するため、以下の略語を用いる。
命令パイプライン
プロセッサ内にあり、同じ回路で複数の命令をオーバーラップさせて実行する。回路は一般にステージに分割されており、命令デコード部、演算部、レジスタフェッチ部などがある。各ステージは1度に、ある1つの命令の処理のうち、自分が担当する部分を処理する。
グラフィックスパイプライン
コンピュータグラフィックスのうち、典型的な局所照明ベースの3次元コンピュータグラフィックスにおいて必要とされる計算は、最初の3次元幾何の処理(頂点トランスフォーム)、ラスタライズ、ピクセル単位の陰影計算および最終結果の出力(表示)までが流れ作業となる[1]。描画シーンの複雑度や画面の解像度に応じて必要な計算量が飛躍的に増大していく。特にコンピュータゲームやシミュレーション可視化などを目的としたリアルタイム描画の場合、膨大なデータ処理を短時間で高速に実行する必要があることから、CPUで実現することは難しいため、ほとんどが専用ハードウェア(GPU)によってパイプライン化されており、また一般的なマルチコアCPUを遥かに超える多数のストリームプロセッサコアで並列化されている。パーソナルコンピュータではビデオカードやオンボードグラフィックス、あるいはCPUに内蔵されたGPUが利用されるが、モバイルデバイスではGPUはSoCに統合されている。GPUは、プログラマブルシェーダーの登場によってパイプラインの一部をアプリケーションソフトウェアがカスタマイズできるようになり、のちにはグラフィックスタスクだけでなく汎用計算タスクをこなすGPGPU用のコンピュートパイプラインもサポートするようになった。さらにリアルタイムレイトレーシングのパイプラインをサポートするGPUも登場している[2]。
ソフトウェアパイプライン
スーパースカラやスーパーパイプラインにより、複雑化した命令パイプラインを有効に働かせるためには、命令を並べる順番を工夫し、ハザードによるバブルの発生を回避しなければならない。ループ展開をともなったループの最適化で特に有用で、その手法をソフトウェアパイプラインと言う。
パイプ (コンピュータ)
複数個のプロセスについて、あるプロセスからの出力を別のプロセスの入力につなぐようにし、プロセスを協調して働かせる、というもの。UNIXへの実装により、単純でありながら大いに有用であることが実証された。
概念と背景
コスト、欠点、利点
設計上の考慮
実装
バッファのある同期パイプライン
バッファのある非同期パイプライン
バッファのないパイプライン
命令パイプライン詳細は「命令パイプライン」を参照
IF (Instruction Fetch)
命令を命令キャッシュから読み出す
ID (Instruction Decode/register read)
制御信号を生成し、レジスタ・ファイルをレジスタ指定子で参照する
Size:24 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
担当:undef