「IA-64」の版間の差分

m
IA-64アーキテクチャ固有ではない一般的なVLIWの説明部分を削除
m編集の要約なし
m (IA-64アーキテクチャ固有ではない一般的なVLIWの説明部分を削除)
== アーキテクチャ ==
{{Main|EPICアーキテクチャ}}
主流となっている[[アウト・オブ・オーダー実行]]設計では、複雑なデコーダシステムが[[命令パイプライン|パイプライン]]に入ってきた命令を調べ、並行して実行できる命令を選んで実行していく。
<syntaxhighlight lang="pascal">
A := B + C;
D := F + G;
</syntaxhighlight>
例えば上記の2行のコードは互いに影響しないので同時に実行できる。したがってこれらはふたつの実行ユニットにそれぞれ渡されて並行して実行される。[[命令レベルの並列性]]を引き出すことが最近のCPUで性能を向上させる基本である。
 
コードが並行して実行できるかどうかを予測することは難しい。多くの場合、ある命令が別のある命令に依存しているかどうかは様々な条件に左右される。先にあげた例が次のようになっていたらどうだろうか。
<syntaxhighlight lang="pascal">
A := B + C;
IF A = 5 THEN D := F + G;
</syntaxhighlight>
こうなると計算自体は依存していないのだが、ふたつめの加算結果を<tt>D</tt>に格納するかどうかはひとつめの計算結果に依存する。
<!--この例が、典型的なプリディケーションが適用できる状況である事が問題である-->
 
このような場合、CPUは一般的には結果を推量する。例えば、<tt>IF</tt>が90%の確率で成立する場合、ふたつめの加算処理は別の実行ユニットに渡されて実行される。ところがその推量が間違っていた場合、ふたつめの加算をなかったことにしなければならず、大きな性能低下を招く。最近のCPUの性能向上は推量ロジックがいかに高確率で推量するかにかかっているが、改善は徐々に始まったところである。
 
IA-64は[[コンパイラ]]にその仕事を任せている。プログラムをCPUが実行する前にコンパイラがコードを調査してCPUが実行時にするような判断を行う。どのパスを通るかを決めたら、コンパイラは並行して実行できる命令を集め、ひとつの大きな命令に入れる。そして、それを並べてプログラムを作成する。
これを'''[[VLIW]]'''"very long instruction word"(非常に長い命令語)という。
 
CPUからコンパイラにこの仕事を移管することは、いくつかの利点がある。第一にコンパイラはコードを時間をかけて調べることが出来る。これはとにかく高速に実行しなければならないCPUにはない利点である。したがってコンパイラの方がチップで実行する場合よりも予測精度を高められる。第二に予測回路は非常に複雑であり、これをコンパイラに移管することで回路を大きく削減できる。CPUは調べて推量する必要がないので、命令を分割して各実行ユニットに渡してやればよい。第三にコンパイラで推量をするのは一回限りなので、CPUで実行するたびに推量するより効率的である。
 
欠点としては、プログラムの実際の動きはコード生成時に完全に予測できるとは限らないということが挙げられる。実際の動きは入力されるデータの内容に大きく左右される。アウト・オブ・オーダー実行ロジックを持つ主流のCPUは実行時に実際のデータに基づいて決定できるのに対して、コンパイラは入力データを推量することしかできない。したがって、コンパイラがCPUよりも予測を失敗する可能性がある。つまりVLIWの性能はコンパイラの性能に大きく依存する。VLIWはマイクロプロセッサのハードウェアの複雑さを低減する代わりにコンパイラの複雑さを要求するものである。
 
=== レジスタ ===