私が見たほとんどの VLIW プロセッサは、さまざまなレイテンシの操作をサポートしています。
これらの命令をスケジュールし、操作が実行される前にオペランドが使用可能であることを確認するのは、コンパイラ次第です。VLIW プロセッサは愚かで、操作間の依存関係をチェックしません。長い命令ワードが実行されると、ワード内の各操作は単純に入力データをレジスタ ファイルから読み取り、同じサイクルの最後に、または操作に 2 ~ 3 サイクルかかる場合は後で結果を書き込みます。
これは、命令が決定論的であり、常に同じサイクル数を使用する場合にのみ機能します。私が見たすべての VLIW アーキテクチャには、一定数のサイクルを必要とする操作があり、それ以下でもそれ以上でもありません。たとえば、外部メモリのフェッチのように、時間がかかる場合は、マシン全体が単純に停止します。
ここで、レイテンシが異なる命令のスケジューリングを制限する重要な要素が 1 つあります。それは、レジスタ ファイルへのポート数です。ポートは、レジスタ ファイルと操作の実行ユニット間の接続です。VLIW プロセッサでは、各操作は発行スロットで実行され、各発行スロットにはレジスタ ファイルへの独自のポートがあります。ポートは、ハードウェアの点で高価です。ポートが多いほど、レジスタ ファイルを実装するためにより多くのシリコンが必要になります。
ここで、2 サイクル操作が、その直後にスケジュールされた 1 サイクル操作と同時に、その結果をレジスタ ファイルに書き込もうとしている次の状況を考えてみます。両方の操作が同じポートを介して同じレジスタ ファイルに書き込みたいため、競合が発生しています。繰り返しますが、これが起こらないようにするのはコンパイラの仕事です。多くの VLIW アーキテクチャでは、同じ発行スロットで実行されるオペランドのレイテンシはすべて同じです。これにより、この競合が回避されます。
あなたの質問に答えるために:
「同じ非常に長い命令に属する他の操作よりも前に、ある操作が実行を終了するとどうなりますか?」とあなたは言いました。
特別なことは何も起こりません。プロセッサは、次の非常に長い命令語を実行し続けます。
「後続の操作 (つまり、次の非常に長い命令に属する操作) は、現在の非常に長い命令の残りの操作が実行される前に実行を開始できますか?」
はい。ただし、後でレジスタ ポートの競合が発生する可能性があります。この状況を防ぐのはコンパイラ次第です。
あなたは言った:「または、非常に長い命令は、現在の非常に長い命令に属するすべての操作の完了を待ちますか?」
いいえ。プロセッサはサイクルごとに次の非常に長い命令語に移動します。例外があり、それは、たとえばキャッシュ ミスがあり、その後パイプラインが停止し、マシンが次の長い命令ワードを進めないために、通常よりも操作に時間がかかる場合です。