[0027] 本開示は、単一命令複数データ(SIMD)処理システムにおけるレジュームチェック動作を選択的にアクティブ化するための技法を対象とする。特に、本開示の技法は、非アクティブ化されたスレッドの再アクティブ化を管理するレジュームチェック動作が、命令ごとに選択的に有効または無効にされることを可能にし得る。本開示の技法は、非アクティブ化されたスレッドの再アクティブ化を管理するためにレジュームチェック動作を利用するSIMDシステムの電力消費を低減し、および/またはそれの性能を改善するために使用され得る。
[0028] SIMD処理システムでは、すべてのスレッドが、単一のプログラムカウンタを含む単一の制御フローユニットによって制御され得る。これは、プログラムのための複数の実行スレッドが、並列に複数の処理要素上で同期的に実行することを可能にし、それによって、動作の同じセットが複数のデータに対して実施される必要があるプログラムのためのスループットを増加させ得る。しかしながら、各スレッドが異なるデータに対して動作するので、SIMD処理システムの命令セットアーキテクチャ(ISA:instruction set architecture)が条件付き分岐命令をサポートする場合、分岐条件は、システム中で実行しているスレッドのうちのいくつかについて満たされ、システム中で実行している他のスレッドについて満たされないことがあることが可能である。そのような分岐命令は、ダイバージェント分岐命令と呼ばれることがある。ダイバージェント分岐命令が行われる場合、アクティブスレッドのうちのいくつかについて実行されるようにスケジュールされる次命令は、アクティブスレッドのうちの他のスレッドについて実行されるようにスケジュールされる次命令とは異なり得る。これは、スレッドのすべてを同期的なロックステップ(lockstep)方式で実行することが可能であるとは限らないSIMD処理システムを生じ得る。
[0029] ダイバージェント分岐命令に対処するための1つの手法は、残りのアクティブスレッドが同じ次命令を実行するためにすべて同期させられるように、分岐条件を満たしたかまたはそれを満たさなかったかのいずれかのスレッドのすべてを非アクティブ化することに関与する。スレッドが所与の命令サイクル中に非アクティブ化されたとき、スレッドはその命令サイクル中に命令を実行しない。従って、残りのスレッドは、ロックステップ方式で実行し続け得る。そのような非アクティブ化されたスレッドの再アクティブ化を制御するために、処理システム中で実行している各スレッドにレジュームカウンタを割り振ることと、非アクティブ化されている各スレッドのためのレジュームカウンタを、該当するスレッドが再アクティブ化されるべきであるプログラムカウンタ値を示す値にセットすることと、あらゆる命令の実行より前にレジュームチェック動作を自動的に実施することとに関与するレジュームカウンタベースの手法が使用され得る。あらゆる命令についてレジュームチェック動作を自動的に実施する1つの欠点は、レジュームチェック動作が、動作が実施されるたびにかなりの電力量を消費し得、SIMD処理システム中で命令を処理するのにかかる時間に著しく寄与し得るということである。
[0030] 本開示によれば、レジュームチェック動作が命令ごとに選択的に有効または無効にされることを可能にするための技法について説明する。レジュームチェック動作は、SIMD処理システムにおけるプログラムの適切な実行のためにプログラム中のあらゆる命令について必ずしも実施される必要があるとは限らないことがある。例えば、プログラム中のいくつかの命令について、コンパイラは、プログラムの実行中にスレッド再アクティブ化がそのような命令において行われる必要がないであろうと判断することが可能であり得る。従って、本開示の技法に従ってレジュームチェック動作が命令ごとに選択的に有効および無効にされることを可能にすることによって、レジュームチェック動作は、スレッド再アクティブ化が行われる必要がないであろうと判断されたそのような命令について無効にされ得る。このようにして、本開示の技法は、プログラム中の各命令についてレジュームチェック動作が自動的に実施される処理システムと比較して、SIMD処理システムの電力消費を低減し、および/またはそれの性能を高めるために使用され得る。
[0031] 本開示のいくつかの態様によれば、命令についてレジュームチェックが実施されるべきであるかどうかを示す、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にするように構成されたプロセッサについて説明する。命令が、命令についてレジュームチェック動作が実施されるべきであることを示す場合、プロセッサは、命令を実行するために使用される命令サイクル中にレジュームチェック動作を実施し得る。同様に、命令が、命令についてレジュームチェック動作が実施されるべきでないことを示す場合、プロセッサは、命令を実行するために使用される命令サイクル中にレジュームチェック動作を実施し得ない。
[0032] レジュームチェック動作は、例えば、複数のレジュームカウンタ値の各々を現在処理されている命令に関連付けられたプログラムカウンタ値と比較することを含む動作であり得る。レジュームカウンタ値の各々は、プロセッサ上で実行している複数のスレッドの該当する1つに関連付けられ得る。非アクティブ化されたスレッドのためのレジュームカウンタ値が現在プログラムカウンタ値に等しい場合、スレッドは再アクティブ化され得る。さもなければ、非アクティブ化されたスレッドのためのレジュームカウンタ値が現在プログラムカウンタ値に等しくない場合、スレッドは非アクティブ化されたままであり得る。レジュームチェック動作を実施するより前にすでにアクティブであったスレッドは、レジュームチェック動作を実施した後にアクティブなままであり得る。
[0033] 本開示の追加の態様によれば、レジュームチェック動作が命令ごとに選択的に有効または無効にされることを可能にする命令セットアーキテクチャ(ISA)について説明する。例えば、ISAは、該当する命令が(例えば、命令に関連付けられた命令サイクル中に)実行されるとき、レジュームチェック動作が実施されるべきであるかどうかを指定する情報フィールドを命令の各々が有する1つまたは複数の命令を含み得る。いくつかの例で、情報フィールドは、命令についてレジュームチェックが実施されるべきであるかどうかに応じてセットされるかまたはリセットされるかのいずれかであるシングルビットであり得る。
[0034] 本開示のさらなる態様によれば、特定のコンパイルされた命令についてレジュームチェックが実施されるべきであるかどうかを示す情報を含むコンパイルされた命令を生成するように構成されたコンパイラについて説明する。いくつかの例で、コンパイラは、プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとしてプログラムの1つまたは複数の命令を選択し得る。1つまたは複数の命令を選択したことに応答して、コンパイラは、プログラムのためのコンパイルドコードが選択された1つまたは複数の命令を含むように、および選択された1つまたは複数の命令が、選択された1つまたは複数の命令についてレジュームチェック動作が実施されるべきであることを示す情報を含むように、コンパイルドコードを生成し得る。
[0035] 1つの具体的な例として、コンパイラは、命令が順方向分岐命令のターゲット命令、順方向ジャンプ命令のターゲット命令である場合、および命令が逆方向分岐命令の後の次連続命令である場合、レジュームチェック動作が実施されるべきである命令であるものとして命令を選択し得る。この特定の例で、順方向分岐命令または順方向ジャンプ命令のターゲット命令であるものとして、あるいは逆方向分岐命令の後の次連続命令であるものとして識別されなかった他の命令の場合、コンパイラは、プログラムの実行中に非アクティブ化されたスレッドがそのような命令において再アクティブ化される必要がないことになるので、そのような命令についてレジュームチェック動作が実施される必要がないと判断し得る。そのような命令についてレジュームチェック動作を実施しないことは、あらゆる命令についてレジュームチェック動作が実施されるシステムと比較して、SIMDシステムの電力消費を低減し、および/またはそれの性能を改善し得る。
[0036] ダイバージェントスレッドを管理するための他の技法は、同期トークンとダイバージェンストークンとを記憶するためにスタックを使用することを含み得る。例えば、ダイバージェンスを可能にする分岐命令が行われるたびに、同期トークンが、分岐命令が最初に遭遇されたときアクティブであったスレッドを示すスタック上にプッシュされ得る。分岐命令がダイバージェント分岐命令である場合、システムは、分岐を取らなかったスレッドを示すスタックと、分岐を取らなかったスレッドのための次命令に対応するプログラムカウンタ値との上にダイバージェンストークンをプッシュし得る。スタックからダイバージェンストークンをポップ(すなわち、プル)オフするようにシステムに命令するソフトウェア命令中のフラグが遭遇されるまで、システムは、分岐を取った残りのスレッドを実行し続け得る。スタックからダイバージェンストークンをポップオフしたことに応答して、システムは、続いて、分岐を取ったスレッドを非アクティブ化し、分岐を取らなかったスレッドを再アクティブ化および実行し得る。スタックから同期トークンをポップオフするようにシステムに命令するソフトウェア命令中の別のフラグが遭遇されるまで、システムは、分岐を取らなかった残りのスレッドを実行し続け得る。スタックから同期トークンをポップオフしたことに応答して、システムは、続いて、ダイバージェント分岐命令が最初に遭遇されたときとスレッド状態が同じになるようにスレッドを再アクティブ化し得る。
[0037] しかしながら、この手法の1つの欠点は、システムが扱うことができるネストダイバージェント分岐の数がスタックのサイズに基づいて制限されるということである。ネストダイバージェント分岐は、別のダイバージェント分岐命令の取られた経路または取られなかった経路のいずれかの実行中に行われるダイバージェント分岐を指すことがある。すなわち、ネストダイバージェント分岐は、1つまたは複数のスレッドが、前に行われたダイバージェント分岐命令によりすでに非アクティブ化されており、そのようなスレッドがまだ再アクティブ化しなかったとき、行われるダイバージェント分岐である。
[0038] 上記で説明したダイバージェントスレッドを再アクティブ化するためのスタックベースの手法とは対照的に、本開示で説明するレジュームカウンタベースの手法は、スタックとは対照的に、非アクティブ化されたスレッドの再アクティブ化を制御するためにレジュームカウンタの有限セットを使用し得る。従って、そのような手法が扱うことができるネストダイバージェント分岐の数は概念的に無限であり、スタックのサイズに基づいて制限されない。その上、本開示の技法に従ってレジュームチェック動作が選択的に有効および無効にされることを可能にすることによって、プログラム中の各命令についてレジュームチェック動作が自動的に実施される処理システムと比較して、処理システムの電力消費が低減され得、および/または処理システムの性能が高められ得る。
[0039] 図1は、本開示の選択的レジュームチェックアクティブ化技法を実装するために使用され得る例示的な処理システム10を示すブロック図である。処理システム10は、プログラムのための命令を並列に実行するように構成される。処理システム10は、制御ユニット12と、処理要素14A〜14D(まとめて「処理要素14」)と、命令ストア16と、データストア18と、通信経路20、22、24、26A〜26Dとを含む。通信経路26A〜26Dは、まとめて「通信経路26」と呼ばれることがある。
[0040] いくつかの例では、制御ユニット12および処理要素14が、プログラマブルプロセッサまたはプログラマブルプロセッサの一部を形成するハードウェア構成要素であり得る。例えば、制御ユニット12と処理要素14はグラフィックス処理ユニット(GPU)またはGPUの一部を一緒に形成し得る。
[0041] 処理システム10は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、タブレットコンピューティングデバイス、ビデオゲームプラットフォームまたはコンソール、ワイヤレス通信デバイス(例えば、いわゆるスマートフォン、携帯電話、セルラー電話、衛星電話、および/または携帯電話ハンドセットなど)、固定電話、インターネット電話、ポータブルビデオゲームデバイスまたは携帯情報端末(PDA)などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、グラフィカルデータを処理および/または表示する他のタイプのデバイス、あるいは計算を実施する任意のタイプのデバイスにおいて実装され得る。
[0042] いくつかの例では、処理システム10が、処理要素14を使用してプログラムのための複数の実行スレッドを実行するように構成された単一命令複数データ(SIMD)処理システムであり得る。そのようなSIMDシステムでは、処理要素14が、異なるデータ項目に関して一度に単一の命令を一緒に処理し得る。プログラムは、プログラムに関連付けられたスレッドのすべてが実行を完了した後、リタイアし得る。
[0043] 制御ユニット12は、命令ストア16に記憶されたプログラムのための命令を実行するように処理システム10を制御するように構成される。プログラムの1つまたは複数の命令の各々について、制御ユニット12は、通信経路20を介して命令ストア16から命令を取り出し、命令を処理し、処理システム10によって処理されるべき次命令を判断し得る。
[0044] いくつかの例では、制御ユニット12が、命令に関連付けられた動作を処理要素14のうちの1つまたは複数上で実行させることによって命令を処理し得る。例えば、制御ユニット12によって取り出された命令は、その命令によって指定されたデータ項目に関する算術演算を実施するように処理システム10に命令する算術命令であり得、制御ユニット12は、処理要素14のうちの1つまたは複数に、指定されたデータ項目に対して算術演算を実施させ得る。さらなる例では、制御ユニット12が、処理要素14上で動作を実施させることなしに命令を処理し得る。例えば、命令は、必ずしも処理要素14によって動作が実施されるように要求するとは限らないジャンプ命令であり得る。
[0045] 制御ユニット12は、通信経路22を介して処理要素14に命令を与えることによって、動作を処理要素14のうちの1つまたは複数上で実施させ得る。命令は、処理要素14によって実施されるべき動作を指定し得る。処理要素14に与えられる命令は、命令ストア16から取り出される命令と同じであるか、またはそれとは異なり得る。いくつかの例で、制御ユニット12は、それの上で動作が実施されるべきである処理要素14の特定のサブセットをアクティブ化することと、それの上で動作が実施されるべきでない処理要素14の別のサブセットを非アクティブ化することとの一方または両方によって、処理要素14の特定のサブセット上で動作を実施させ得る。
[0046] 制御ユニット12は、通信経路22を介して処理要素14の各々に該当のアクティブ化および/または非アクティブ化信号を与えることによって、処理要素14をアクティブ化および/または非アクティブ化し得る。いくつかの例で、アクティブ化および/または非アクティブ化信号は、処理要素14によって実施されるべき動作を指定する、制御ユニット12によって処理要素14に与えられる命令中に含まれ得る。さらなる例で、アクティブ化および/または非アクティブ化信号は、制御ユニット12によって処理要素14に与えられる命令とは別個であり得る。
[0047] 制御ユニット12は、処理要素14を使用してプログラムのための複数の実行スレッドを実行し得る。処理要素14の各々は、複数のスレッドの該当する1つについてプログラムの命令を処理するように構成され得る。例えば、制御ユニット12は、スレッドの処理のために処理要素14の個々の1つに実行スレッドの各々を割り当て得る。プログラムのための異なる実行スレッドは、データ項目のセット中の異なるデータ項目に関して命令の同じセットを実行し得る。例えば、処理要素14Aは、複数のデータ項目中のデータ項目の第1のサブセットに関して命令ストア16に記憶されたプログラムのための第1の実行スレッドを実行し得、処理要素14Bは、複数のデータ項目中のデータ項目の第2のサブセットに関して命令ストア16に記憶されたプログラムのための第2の実行スレッドを実行し得る。第1の実行スレッドは第2の実行スレッドとは異なり得、データ項目の第1のサブセットはデータ項目の第2のサブセットとは異なり得る。
[0048] いくつかの例で、制御ユニット12は、複数の実行スレッド中の個々のスレッドをアクティブ化および非アクティブ化し得る。制御ユニット12がスレッドを非アクティブ化するとき、制御ユニット12はまた、スレッドを実行するために割り当てられた処理要素14A〜14Dを非アクティブ化および/または無効にし得る。同様に、制御ユニット12がスレッドをアクティブ化するとき、制御ユニット12はまた、スレッドを実行するために割り当てられた処理要素14A〜14Dをアクティブ化し得る。制御ユニット12は、本開示において後でさらに詳細に説明するようにダイバージェント分岐条件の扱いを支援するために、1つまたは複数のスレッドの様々な組合せをアクティブ化および非アクティブ化し得る。
[0049] 本明細書で使用するアクティブスレッドは、アクティブ化され、プログラムの命令を実行するように現在構成されているスレッドを指すことがある。非アクティブスレッドは、非アクティブ化され、プログラムの命令を実行しないように現在構成されているスレッドを指すことがある。所与の命令処理サイクル中に処理システム10中で複数のスレッドが実行している場合、アクティブスレッドの各々は、該当するアクティブスレッドに関連付けられたデータに関してその命令処理サイクル中にグローバルプログラムカウンタレジスタによって識別されるプログラムの命令を処理するように構成され得る。同じ命令処理サイクル中に、非アクティブスレッドの各々は、プログラムの命令を処理しないように構成され得る。命令を実行するようにアクティブスレッドを構成するために、制御ユニット12は、例えば、アクティブスレッドに関連付けられる処理要素14を命令処理サイクル中にアクティブ化させ得る。同様に、命令を実行しないように非アクティブスレッドを構成するために、制御ユニット12は、非アクティブスレッドに割り当てられた処理要素14を命令処理サイクル中に非アクティブ化させ得る。
[0050] いくつかの例で、命令処理サイクルは、プログラムカウンタの連続ロード間の時間間隔を指すことがある。例えば、命令処理サイクルは、第1の命令に関連付けられた第1の値がプログラムカウンタにロードされるときと、第2の命令に関連付けられた第2の値がプログラムカウンタにロードされるときとの間の時間を指すことがある。第2の命令は、第1の命令の直後にシステムによって処理される命令であり得る。第1の値と第2の値とは同じ値または異なる値であり得、第1の命令と第2の命令とは同じ命令または異なる命令であり得る。いくつかの例で、命令処理サイクルは、プログラムカウンタの連続同期ロード間の時間間隔を指すことがある。プログラムカウンタの同期ロードは、いくつかの例では、クロック信号によってトリガされるロードを指すことがある。命令処理サイクルは、本明細書で、代替的に命令サイクルまたは処理サイクルと呼ぶことがある。
[0051] 次命令の処理より前のいつかに、制御ユニット12は、処理システム10によって処理されるべき次命令を判断し得る。制御ユニット12が処理されるべき次命令を判断する方法は、直近に実行された命令が連続命令であるのか制御フロー命令であるのかに応じて異なる。直近に実行された命令が連続命令である(すなわち、制御フロー命令でない)場合、制御ユニット12は、処理システム10によって処理されるべき次命令が、命令ストア16に記憶された次連続命令に対応すると判断し得る。例えば、命令ストア16はプログラムのための命令を順序付きシーケンスで記憶し得、次連続命令は、命令の順序付きシーケンスで直近に実行された命令の直後に行われる命令であり得る。
[0052] 直近に実行された命令が制御フロー命令である場合、制御ユニット12は、制御フロー命令中で指定された情報に基づいて処理システム10によって処理されるべき次命令を判断し得る。例えば、制御フロー命令は無条件制御フロー命令(例えば、無条件分岐命令またはジャンプ命令)であり得、その場合、制御ユニット12は、処理システム10によって処理されるべき次命令が、制御フロー命令によって識別されるターゲット命令であると判断し得る。別の例として、制御フロー命令は条件付き制御フロー命令(例えば、条件付き分岐命令)であり得、その場合、制御ユニット12は、制御フロー命令によって識別されるターゲット命令、または命令ストア16に記憶された次連続命令のうちの1つを、命令ストア16からの処理すべき次命令として選択し得る。
[0053] 本明細書で使用する制御フロー命令は、次連続命令を無条件に選択すること以外の技法に基づいて実行すべき次命令を判断するように制御ユニット12に指示する命令を指すことがある。制御フロー命令は、命令ストア16に記憶されたターゲット命令を指定し得る。例えば、制御フロー命令は、命令ストア16に記憶されたターゲット命令に対応するターゲットプログラムカウンタ値を示す値を含み得る。別の例として、制御フロー命令は、スタックストレージ構造からリターンアドレスをポップするように制御ユニット12に指示することによって、ターゲット命令を指定し得る。リターンアドレスは、命令ストア16に記憶されたターゲット命令に対応し得る。ターゲット命令は、いくつかの例で、命令ストア16に記憶された次連続命令とは異なり得る。高レベルプログラムコードは、例えば、ifステートメント、switchステートメント、doステートメント、forステートメント、whileステートメント、continueステートメント、breakステートメント、およびgotoステートメントなど、制御フローステートメントを含み得る。コンパイラは、高レベル制御フローステートメントを低レベル制御フロー命令、例えば、機械レベル制御フロー命令に変換し得る。
[0054] 制御フロー命令でない命令は、本明細書では連続命令と呼ぶことがある。連続命令は、制御ユニット12が、実行すべき次命令であるものとして次連続命令を必ず選択する命令を指すことがある。連続命令は、いくつかの例で、ターゲット命令を識別する情報を含まないことがある。
[0055] 制御フロー命令の場合、ターゲット命令を識別する情報は、命令ストア16に記憶されたターゲット命令を示す値であり得る。いくつかの例で、ターゲット命令を示す値は、命令ストア16に記憶されたターゲット命令に対応する命令アドレスを示す値であり得る。命令アドレスを示す値は、場合によっては、命令ストア16に記憶されたターゲット命令のアドレスであり得る。さらなる場合で、命令アドレスを示す値は、ターゲット命令のアドレスを計算するために使用される値であり得る。さらなる例で、命令アドレスを示す値は、ターゲット命令に対応するターゲットプログラムカウンタ値を示す値であり得る。ターゲットプログラムカウンタ値を示す値は、場合によっては、ターゲット命令に対応するターゲットプログラムカウンタ値であり得る。さらなる場合で、ターゲットプログラムカウンタ値を示す値は、ターゲットプログラムカウンタ値を計算するために使用される値であり得る。ターゲット命令に対応するターゲットプログラムカウンタ値は、いくつかの例で、命令ストア16に記憶されたターゲット命令のアドレスに等しくなり得る。
[0056] 制御フロー命令は、順方向制御フロー命令または逆方向制御フロー命令であり得る。制御フロー命令が順方向であるのか逆方向であるのかのプロパティは、制御フロー命令の方向と呼ばれることがある。順方向制御フロー命令は、ターゲット命令が、命令ストア16に記憶された命令の順序付きシーケンスで制御フロー命令の後に行われる、制御フロー命令であり得る。逆方向制御フロー命令は、ターゲット命令が、命令ストア16に記憶された命令の順序付きシーケンスで次連続命令より前に行われる、制御フロー命令であり得る。次連続命令は、命令の順序付きシーケンスで制御フロー命令の直後に行われ得る。
[0057] 制御フロー命令は、条件付き制御フロー命令または無条件制御フロー命令であり得る。条件付き制御フロー命令は、制御フロー命令に関連付けられたターゲット命令にジャンプするための条件を指定する情報を含む。条件付き制御フロー命令を処理するとき、制御ユニット12が、条件が満たされると判断した場合、制御ユニット12は、処理されるべき次命令がターゲット命令であると判断し得る。一方、制御ユニット12が、条件が満たされないと判断した場合、制御ユニット12は、処理されるべき次命令が命令ストア16に記憶された次連続命令であると判断し得る。無条件制御フロー命令は、制御フロー命令に関連付けられたターゲット命令にジャンプするための条件を指定する情報を含まない。無条件制御フロー命令を処理するとき、制御ユニット12は、処理すべき次命令が制御フロー命令によって識別されるターゲット命令であると無条件に判断し得る。言い換えれば、そのような場合における判断は、無条件制御フロー命令自体において指定される条件を条件としない。
[0058] 条件付き制御フロー命令の例は条件付き分岐命令を含む。本開示における総称語である分岐命令の使用は、一般に、分岐命令が無条件分岐命令として特に指定されない限り、条件付き分岐命令を指す。無条件制御フロー命令の例としてはジャンプ命令がある。
[0059] 条件付き分岐命令は、1つまたは複数のデータ項目値に関して指定される条件を含み得る。例えば、1つのタイプの条件は、処理システム10中で実行している各アクティブスレッドについて、第1のデータ項目値を第2のデータ項目値と比較する比較条件であり得る。データ項目値を比較することは、例えば、第1のデータ項目値が第2のデータ項目値よりも大きいのか、それよりも小さいのか、それ以下であるのか、それ以上であるのか、それに等しいのか、またはそれに等しくないのかを判断することを含み得る。別のタイプの条件は、処理システム10中で実行している各アクティブスレッドについてのデータ項目値がゼロに等しいのかゼロに等しくないのかを判断するゼロチェック条件であり得る。
[0060] 処理要素14の各々は、異なるデータ項目に対して動作するので、条件を評価した結果は、処理システム10中で実行している各アクティブスレッドについて異なり得る。処理システム10中で実行しているアクティブスレッドのすべてが分岐条件を満たすか、または処理システム10中で実行しているアクティブスレッドのすべてが分岐条件を満たさないかのいずれかの場合、一様な分岐条件が発生し、分岐命令のための分岐ダイバージェンスは一様であると言われる。一方、処理システム10中で実行しているアクティブスレッドのうちの少なくとも1つが分岐条件を満たし、処理システム10中で実行しているアクティブスレッドのうちの少なくとも1つが分岐条件を満たさない場合、ダイバージェント分岐条件が発生し、分岐命令のための分岐ダイバージェンスは、ダイバージェントであると言われる。
[0061] 処理システム10中で実行しているスレッドは、同じ命令をロックステップ方式で実行し得る。言い換えれば、処理要素14の各々は、処理サイクル中にすべてのアクティブスレッドについて同じ命令を一緒に実行し得る。しかしながら、ダイバージェント分岐条件が発生したとき、その分岐条件を満たしたスレッドは、分岐条件を満たさなかったスレッドによって実行されるようにスケジュールされた次命令とは異なる次命令を実行するようにスケジュールされ得る。これは、処理システム10中のスレッドが単一の命令をロックステップ方式で実行することを妨害し得る。
[0062] ダイバージェント分岐命令に対処するために、制御ユニット12は、いくつかの例では、残りのアクティブスレッドがすべて同じ次命令を実行するように同期させられるように、分岐条件を満たしたかまたはそれを満たさなかったかのいずれかのスレッドの1つのサブセットを非アクティブ化し得る。非アクティブ化されたスレッドの再アクティブ化を制御するために、制御ユニット12は、処理システム中で実行している各スレッドにレジュームカウンタを割り振ることと、非アクティブ化されている各スレッドのためのレジュームカウンタを、該当するスレッドが再アクティブ化されるようにスケジュールされるプログラムカウンタ値を示す値にセットすることと、スレッドを再アクティブ化するためにプログラム中の様々なチェックポイントにおいてレジュームチェック動作を実施することとに関与するレジュームカウンタベースの手法を使用し得る。
[0063] 所与の命令サイクル中に、レジュームチェック動作は、所与の命令サイクルについて現在プログラムカウンタ値において再アクティブ化されるようにスケジュールされた、非アクティブ化されたスレッドをアクティブ化し得る。レジュームチェック動作は、1つまたは複数のスレッドに関連付けられた1つまたは複数のレジュームカウンタ値に基づいて、1つまたは複数のスレッドが、現在プログラムカウンタ値において再アクティブ化されるようにスケジュールされるかどうかを判断し得る。例えば、レジュームチェック動作は、複数のレジュームカウンタ値の各々を現在プログラムカウンタ値と比較し、複数のレジュームカウンタ値の各々について、該当するレジュームカウンタ値が現在プログラムカウンタ値に等しい場合、該当するレジュームカウンタ値に対応するスレッドをアクティブ化し得る。
[0064] レジュームカウンタ値の各々は、処理システム10上で実行している複数のスレッドの各々に関連付けられ得、スレッドが非アクティブである場合、スレッドがアクティブ化されるようにスケジュールされるプログラムカウンタ値を示し得る。いくつかの例で、レジュームカウンタ値の各々は、該当するレジュームカウンタ値に対応するスレッドがアクティブである場合、デフォルト値に等しい。デフォルト値は、プログラムのアドレス範囲よりも大きい値に対応し得る。例えば、デフォルト値は、最大レジスタ値(すなわち、レジュームカウンタストレージスロットまたはレジュームカウンタレジスタ中で表され得る最も大きい値である値)であり得る。
[0065] 本開示によれば、制御ユニット12は、レジュームチェック動作の性能を命令ごとに選択的に有効および無効にするように構成され得る。例えば、制御ユニット12は、制御ユニット12によって命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む命令を実行することと、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にすることとを行うように構成され得る。レジュームチェック動作は、複数のレジュームカウンタ値の各々を命令に関連付けられたプログラムカウンタ値と比較することと、複数のレジュームカウンタ値の各々について、該当するレジュームカウンタ値がプログラムカウンタ値に等しい場合、該当するレジュームカウンタ値に関連付けられた複数のスレッドの該当する1つをアクティブ化することとを含む動作であり得る。
[0066] レジュームチェック動作を選択的に有効または無効にするために、制御ユニット12は、いくつかの例で、命令サイクル中に命令を実行することと、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきであることを示すかどうかを判断することと、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、命令サイクルについてレジュームチェック動作を有効にすることと、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、命令サイクルについてレジュームチェック動作を無効にすることとを行うように構成され得る。
[0067] いくつかの例で、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報は、命令中に情報フィールドを含み得る。場合によっては、情報フィールドは、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す1ビットフラグであり得る。さらなる例で、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報は動作コード(例えば、オペコード)を含み得る。例えば、動作コードのあるサブセットは、レジュームチェック動作が実施されるべきである動作を指定し得、動作コードの別のサブセットは、レジュームチェック動作が実施されるべきでない動作を指定し得る。
[0068] さらなる例で、命令は、レジュームチェック動作が実施されるべきであるかどうかに加えて、処理システム10によって実施されるべき主動作を指定し得る。そのような例で、レジュームチェック動作は、主動作を実施するより前に実施され得る。このようにして、主動作は、レジュームチェック動作の一部として再アクティブ化されるスレッドについて実施され得る。場合によっては、レジュームチェック動作および主動作は、同じ命令サイクルの一部として実施され得る。
[0069] レジュームチェック動作は、いくつかの例で、動作が実施されるたびにかなりの電力量を消費し得、処理システム10中で命令を処理するのにかかる時間に著しく寄与し得る、複数の比較演算の性能に関与し得る。本開示の技法に従ってレジュームチェック動作が選択的に有効および無効にされることを可能にすることによって、レジュームチェック動作は、スレッド再アクティブ化が行われる必要がないであろうと判断された命令について無効にされ得る。従って、レジュームチェック動作の数は、あらゆる命令についてレジュームチェック動作を実施するシステム中で行われることになるレジュームチェック動作の数と比較して低減され得る。このようにして、本開示の技法は、プログラム中の各命令についてレジュームチェック動作が自動的に実施される処理システムと比較して、処理システムの電力消費を低減し、および/またはそれの性能を高めるために使用され得る。
[0070] スレッド再アクティブ化のための上記で説明したレジュームカウンタベースの手法を使用するときに、適切な制御フローが維持されることを保証するために、制御ユニット12は「最小値アドレス第1(least-valued address first)」スレッド処理順序を使用し得る。概して、「最小値アドレス第1」スレッド処理順序は、より低い値のアドレスにおける命令を処理するようにスケジュールされたスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドより前に実行される処理順序を指すことがある。そのような処理順序は、制御フローが、最初にそのようなスレッドを再アクティブ化することなく非アクティブスレッドのためのレジュームポイントを越えてジャンプするのを防ぎ得る。言い換えれば、そのような処理順序は、すべてのスレッドがアクティブになり、最後のプログラムステートメントが実行を完了した時間までには処理を完了していることになることを保証し得る。
[0071] 「最小値アドレス第1」スレッド処理順序は、分岐命令の方向(すなわち、順方向または逆方向)に基づいて、ダイバージェント分岐命令に応答してどのスレッドが非アクティブ化されるかを区別し得る。例えば、ダイバージェント逆方向分岐命令の場合、制御ユニット12は、分岐条件が満たされないスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令の後に行われる次連続命令に関連付けられた値にセットし、分岐命令によって指定されたターゲット命令に関連付けられた値をプログラムカウンタにロードし、続いて分岐条件が満たされるスレッドを実行し得る。ダイバージェント順方向分岐命令の場合、制御ユニット12は、分岐条件が満たされるスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令によって指定されたターゲット命令に関連付けられた値にセットし、分岐命令の後に行われる次連続命令に関連付けられた値をプログラムカウンタにロードし、続いて分岐条件が満たされないスレッドを実行し得る。このようにしてスレッドを非アクティブ化することは、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドより前に実行すること(すなわち、「最小値アドレス第1」スレッド処理順序)を保証する。
[0072] 制御ユニット12は、通信経路20を介して命令ストア16に通信可能に結合され、通信経路22を介して処理要素14に通信可能に結合され、通信経路24を介してデータストア18に通信可能に結合される。制御ユニット12は、通信経路20を使用して、命令ストア16に読取り命令を送り得る。読取り命令は、命令がそこから取り出されるべきである命令ストア16中の命令アドレスを指定し得る。制御ユニット12は、読取り命令を送ったことに応答して、命令ストア16から1つまたは複数のプログラム命令を受信し得る。制御ユニット12は、通信経路22を使用して、命令を処理要素14に与え、いくつかの例で、処理要素14からデータ(例えば、分岐条件を評価するための比較命令の結果)を受信し得る。いくつかの例で、制御ユニット12は、通信経路24を使用して、(例えば、分岐条件を評価するために)データストア18から直接データ項目値を取り出し得る。図1は、通信経路24を含むものとして処理システム10を示しているが、他の例で、処理システム10は通信経路24を含まないことがある。
[0073] 処理要素14の各々は、命令ストア16に記憶されたプログラムのための命令を処理する際に処理システム10を支援するための演算を実施するように構成され得る。いくつかの例で、処理要素14の各々は、演算の同じセットを実施するように構成され得る。例えば、処理要素14の各々は、同じ命令セットアーキテクチャ(ISA)を実装し得る。追加の例で、処理要素14の各々は算術論理ユニット(ALU:arithmetic logic unit)であり得る。さらなる例で、処理システム10はベクトルプロセッサ(例えば、GPUベクトルプロセッサ)であり得、処理要素14の各々はベクトルプロセッサ内の処理要素であり得る。追加の例で、処理システム10はSIMD実行ユニットであり得、処理要素14の各々はSIMD実行ユニット内のSIMD処理要素であり得る。
[0074] 処理要素14によって実行される演算は、算術演算、論理演算、比較演算などを含み得る。算術演算は、例えば、加算演算、減算演算、乗算演算、除算演算などの演算を含み得る。算術演算はまた、例えば、整数算術演算および/または浮動小数点算術演算を含み得る。論理演算は、例えば、ビット単位AND演算、ビット単位OR演算、ビット単位XOR演算などの演算を含み得る。比較演算は、例えば、大なり演算、小なり演算、ゼロに等しい演算、ゼロに等しくない演算などの演算を含み得る。大なり演算および小なり演算は、第1のデータ項目が第2のデータ項目よりも大きいのか、それよりも小さいのかを判断し得る。ゼロに等しい演算およびゼロに等しくない演算は、データ項目がゼロに等しいのか、ゼロに等しくないのかを判断し得る。演算のために使用されるオペランドは、データストア18中に含まれているレジスタに記憶され得る。
[0075] 処理要素14の各々は、通信経路22を介して制御ユニット12から命令を受信したことに応答して演算を実施するように構成され得る。いくつかの例で、処理要素14の各々は、他の処理要素14とは無関係にアクティブ化および/または非アクティブ化されるように構成され得る。そのような例で、処理要素14の各々は、該当する処理要素14A〜14Dがアクティブ化されるとき制御ユニット12から命令を受信したことに応答して命令によって指定された演算を実施し、該当する処理要素14A〜14Dが非アクティブ化される(すなわち、アクティブ化されない)とき制御ユニット12から命令を受信したことに応答して演算を実施しないことがある。
[0076] 処理要素14A〜14Dの各々は、該当する通信経路26A〜26Dを介してデータストア18に通信可能に結合され得る。処理要素14は、通信経路26を介して、データストア18からデータを取り出し、データストア18にデータを記憶するように構成され得る。データストア18から取り出されたデータは、いくつかの例で、処理要素14によって実行される演算のためのオペランドであり得る。データストア18に記憶されたデータは、いくつかの例で、処理要素14によって実行される演算の結果であり得る。
[0077] 命令ストア16は、処理システム10が実行するためのプログラムを記憶するように構成される。プログラムは命令の順序付きシーケンスとして記憶され得る。いくつかの例で、各命令は一意の命令アドレスによってアドレス指定され得る。そのような例で、命令のシーケンス中で後の命令についての命令アドレスは、命令のシーケンス中で前の命令についての命令アドレスよりも大きい。そのような例で、命令のシーケンス中で後の命令に関連付けられたプログラムカウンタ値は、いくつかの例で、命令のシーケンス中で前の命令に関連付けられたプログラムカウンタ値よりも大きくなり得る。プログラム命令は、いくつかの例で、機械レベル命令であり得る。すなわち、そのような例で、命令は、処理システム10のISAに対応するフォーマットであり得る。命令ストア16は、通信経路20を介して制御ユニット12から読取り命令を受信することと、読取り命令を受信したことに応答して、通信経路20を介して、読取り命令中で指定された命令アドレスに対応する命令を制御ユニット12に与えることとを行うように構成され得る。読取り命令は、命令ストア16中で命令がそこから取り出されるべきである命令アドレスを指定し得る。
[0078] 命令ストア16は、任意のタイプのメモリ、キャッシュまたはそれらの組合せであり得る。命令ストア16がキャッシュであるとき、命令ストア16は、処理システム10の外部のプログラムメモリに記憶されたプログラムをキャッシュし得る。命令ストア16は処理システム10内にあるものとして示されているが、他の例で、命令ストア16は処理システム10の外部にあり得る。
[0079] データストア18は、処理要素14によって使用されるデータ項目を記憶するように構成される。いくつかの例で、データストア18は複数のレジスタを備え、レジスタの各々は、処理システム10によって演算される複数のデータ項目内に該当するデータ項目を記憶するように構成され得る。データストア18は、データストア18のレジスタとメモリまたはキャッシュ(図示せず)との間でデータを転送するように構成された1つまたは複数の通信経路(図示せず)に結合され得る。
[0080] 図1は、処理要素14によって使用されるデータを記憶するための単一のデータストア18を示しているが、他の例で、処理システム10は、処理要素14の各々について別個の専用データストアを含み得る。図1は、例示のために4つの処理要素14を有する処理システム10を示している。他の例で、処理システム10は、同じまたは異なる構成で同じまたは異なる数の処理要素14を有し得る。
[0081] 図2は、本開示による、図1の例示的な処理システム10中の制御ユニット12をより詳細に示すブロック図である。制御ユニット12は、プログラムカウンタ28と、フェッチモジュール30と、復号モジュール32と、制御フローモジュール34とを含む。制御フローモジュール34は、本明細書で、代替的に制御フローユニットと呼ぶことがある。
[0082] プログラムカウンタ28は、プログラムカウンタ値を記憶するように構成される。いくつかの例で、プログラムカウンタ28は、例えば、プログラムカウンタレジスタなどのハードウェアレジスタであり得る。プログラムカウンタ値は、命令ストア16に記憶された命令を示し得る。プログラムカウンタ値は、場合によっては、命令ストア16に記憶された命令の命令アドレスに等しくなり得る。さらなる場合で、プログラムカウンタ値は、命令ストア16に記憶された命令の命令アドレスを計算するために使用され得る。例えば、プログラムカウンタ値は、命令アドレスを生成するためにオフセット値に加算され得る。プログラムカウンタ28は、処理要素14のすべてについて単一のプログラムカウンタとして使用され得るので、プログラムカウンタ28は、本明細書では「グローバルプログラムカウンタ」または「グローバルプログラムカウンタレジスタ」と呼ぶことがある。
[0083] フェッチモジュール30は、プログラムカウンタ28に記憶されたプログラムカウンタ値に基づいて命令ストア16から命令をフェッチする(例えば、取り出す)ように構成される。例えば、フェッチモジュール30は、プログラムカウンタ28に記憶されたプログラムカウンタ値によって識別される命令アドレスから命令をフェッチし得る。フェッチモジュール30は、さらなる処理のために、フェッチされた命令を復号モジュール32に与え得る。
[0084] 復号モジュール32は、フェッチモジュール30から受信した命令を復号するように構成される。命令を復号することは、命令が処理要素14によって処理され得る命令のタイプであるかどうかを判断することに関与し得る。命令が、処理要素14によって処理され得る命令のタイプである場合、復号モジュール32は、命令を処理要素14のうちの1つまたは複数の上で実行させ得る。いくつかの例で、復号モジュール32は、命令を処理要素14のすべての上で実行させ得る。他の例で、復号モジュール32は、命令を処理要素14のすべてよりも少ないものの上で実行させ得る。命令を処理要素14のうちの1つまたは複数の上で実行させることは、場合によっては、実行のための処理要素14のうちの1つまたは複数に命令を発行することを含み得る。例えば、復号モジュール32は、処理のためのアクティブスレッドに対応するすべての処理要素14に連続命令を発行し得る。命令が、処理要素14によって処理され得る命令のタイプでない場合、制御ユニット12は、処理のために処理要素14のいずれかに命令を発行することなしに命令を処理し得る。例えば、命令は、処理要素14による処理を必要としないタイプの制御フロー命令であり得、その場合、制御ユニット12は、処理要素14のいずれかに命令を発行することなしに命令を処理し得る。
[0085] いずれの場合も、復号モジュール32は、さらなる処理のために制御フローモジュール34に制御情報をフォワーディングし得る。いくつかの例で、制御情報は命令自体であり得る。さらなる例で、制御情報は、例えば、命令が制御フロー命令であるのか連続命令であるのかを示す情報、命令が制御フロー命令である場合、命令が分岐命令であるのかジャンプ命令であるのかを示す情報、命令が分岐命令またはジャンプ命令である場合、分岐命令またはジャンプ命令が、順方向分岐命令またはジャンプ命令であるのか逆方向分岐命令またはジャンプ命令であるのかを示す情報、および命令が分岐命令である場合、分岐条件を指定する情報を含み得る。
[0086] 処理要素14によって処理され得るタイプである命令は、算術命令と論理命令とを含み得る。算術命令は、処理要素14に算術演算を実施するように命令する命令を指すことがあり、論理命令は、処理要素14に論理演算を実施するように命令する命令を指すことがある。いくつかの例で、制御フロー命令は、処理要素14によって処理され得るタイプの命令であり得る(例えば、制御フロー命令は、処理要素14によって評価される分岐条件を含み得る)。処理要素14によって処理され得るタイプでない命令は、分岐条件が制御ユニット12によって評価される制御フロー命令、および/または分岐条件を有しない制御フロー命令を含み得る。
[0087] 制御フローモジュール34は、制御ユニット12によって処理されるべき次命令に関連付けられたプログラムカウンタ値を判断し、プログラムカウンタ値をプログラムカウンタ28にロードし得る。前にフェッチされた命令が連続命令である場合、制御フローモジュール34は、プログラムカウンタ28にロードすべき、次連続命令を示すプログラムカウンタ値を選択し得る。前にフェッチされた命令が分岐命令またはジャンプ命令である場合、制御フローモジュール34は、いくつかの例で、制御フロー命令によって識別されるターゲット命令に関連付けられたターゲットプログラムカウンタ値、またはプログラムカウンタ28にロードすべき、次連続命令を示すプログラムカウンタ値のうちの1つを選択し得る。
[0088] いくつかの例で、制御フローモジュール34は、プログラムカウンタ28にロードすべき新しいプログラムカウンタ値を選択するために最小レジュームカウンタ(MINRC:minimum resume counter)を利用し得る。MINRC値は、レジュームカウンタ値のセットからの最も小さいレジュームカウンタ値を示し得る。場合によっては、レジュームカウンタ値のセットは、システム中で実行しているすべてのスレッドのためのレジュームカウンタ値を含み得る。さらなる場合で、レジュームカウンタ値のセットは、現在実行中の処理モジュールの実行が開始されたとき、アクティブであったすべてのスレッドのためのレジュームカウンタ値を含み得る。現在実行中の処理モジュールは、例えば、主要なプログラムモジュールまたはサブルーチンプログラムモジュールであり得る。MINRCが使用される例で、制御フローモジュール34は、制御フロー命令によって指定されたターゲット命令に関連付けられたターゲットプログラムカウンタ値、次連続命令を示すプログラムカウンタ値、または次の命令サイクルを実行するためのプログラムカウンタ28にロードすべきMINRC値のうちの1つを選択し得る。
[0089] いくつかの例で、制御フローモジュール34は、コール命令とリターン命令との実行をサポートし得る。前にフェッチされた命令がコール命令である場合、制御フローモジュール34は、プログラムカウンタ28にロードすべき、コール命令によって指定されたターゲット命令を示すターゲットプログラムカウンタ値を選択し得る。前にフェッチされた命令がリターン命令である場合、制御フローモジュール34は、プログラムカウンタ28にロードすべき、サブルーチンコールスタックからポップされるリターンアドレスを示すプログラムカウンタ値を選択し得る。
[0090] 制御フローモジュール34は、処理システム10中で実行している各スレッドのためのレジュームカウンタ値を記憶し得る。例えば、制御フローモジュール34に記憶されたレジュームカウンタ値の数は、処理システム10中に含まれている処理要素14の数に等しくなり得る。各レジュームカウンタ値について、該当するレジュームカウンタ値に対応するスレッドが非アクティブである場合、レジュームカウンタ値は、非アクティブスレッドがアクティブ化または再アクティブ化されるべきであるプログラムカウンタ値を示し得る。言い換えれば、レジュームカウンタ値は、非アクティブスレッドが再アクティブ化されるようにスケジュールされた命令に対応するプログラムカウンタ値を示し得る。さもなければ、該当するレジュームカウンタ値に対応するスレッドがアクティブである場合、レジュームカウンタ値は、いくつかの例で、デフォルト値(例えば、最大レジスタ値、またはレジュームカウンタのためのストレージスロットまたはレジスタ中で表され得る最も大きい値である値)にセットされ得る。
[0091] 制御フローモジュール34は、処理システム10中で実行している各スレッドのためのアクティブフラグを記憶し得る。例えば、制御フローモジュール34に記憶されたアクティブフラグの数は、処理システム10中に含まれている処理要素14の数に等しくなり得る。各アクティブフラグは、アクティブフラグに関連付けられたスレッドがアクティブまたは非アクティブであるか否かを示し得る。制御フローモジュール34は、個々のスレッドと、スレッドに対応する処理要素14の個々の処理要素14とをアクティブ化および非アクティブ化するようにアクティブフラグをセットおよびリセットし得る。例えば、制御フローモジュール34は、アクティブフラグに関連付けられたスレッドがアクティブであることを示すようにアクティブフラグをセットし、アクティブフラグに関連付けられたスレッドが非アクティブであることを示すようにアクティブフラグをリセットし得る。いくつかの例で、アクティブフラグの各々はシングルビットであり得る。
[0092] 制御フローモジュール34は、いくつかの例で、プログラム状態を記憶し得る。例えば、第1のプログラム状態は、すべてのスレッドがアクティブであることを示し得、第2のプログラム状態は、少なくともスレッドでアクティブであり、少なくとも1つのスレッドが非アクティブであることを示し得、第3のプログラム状態は、すべてのスレッドが非アクティブであることを示し得る。プログラム状態は、そのような例で、プログラムカウンタ28にロードすべきプログラムカウンタ値を選択するために使用され得る。
[0093] 制御フローモジュール34は、いくつかの例で、通信経路22を介して処理要素14のうちの1つまたは複数をアクティブ化および非アクティブ化するように構成され得る。追加の例で、制御フローモジュール34は、復号モジュール32に特定の処理要素14をアクティブ化および非アクティブ化するように命令し得る。
[0094] 制御フローモジュール34は、レジュームチェック動作を実施するように構成され得る。レジュームチェック動作は、現在命令サイクル中にどのスレッドが再アクティブ化されるようにスケジュールされたかを判断し、そのようなスレッドを再アクティブ化し得る。例えば、レジュームチェック動作は、複数またはレジュームカウンタ値の各々について、レジュームカウンタ値を、現在命令サイクルのためのプログラムカウンタ28に記憶されたプログラムカウンタ値と比較することと、レジュームカウンタ値がプログラムカウンタ値に等しい場合、レジュームカウンタ値に対応するスレッドを再アクティブ化することとに関与し得る。
[0095] 本開示によれば、制御フローモジュール34は、特定の命令サイクル中に処理される命令中に含まれる情報に基づいて、命令サイクルについてレジュームチェック動作を選択的に有効または無効にするように構成され得る。命令中に含まれる情報は、命令がその間に実行される命令サイクルについて、レジュームチェック動作が実施されるべきであるかどうかを指定し得る。例えば、各命令サイクルは、プログラムカウンタ28に記憶された現在プログラムカウンタ値に関連付され得る。各命令サイクル中に、制御フローモジュール34は、該当する命令サイクルのための現在プログラムカウンタ値に対応する命令が、命令についてレジュームチェック動作が実施されるべきであることを示すかどうかを判断し得る。命令が、命令についてレジュームチェック動作が実施されるべきであることを示す場合、制御フローモジュール34は、レジュームチェック動作を現在命令サイクルについて実施させるために、現在命令サイクルについてレジュームチェック動作を有効にし得る。同様に、命令が、命令についてレジュームチェック動作が実施されるべきでないことを示す場合、制御フローモジュール34は、レジュームチェック動作を現在命令サイクルについて実施させるために、現在命令サイクルについてレジュームチェック動作を無効にし得る。
[0096] いくつかの例で、図1および図2の処理システム10はグラフィックス処理ユニット(GPU)中に含まれ得る。そのような例で、処理システム10は、例えば、頂点シェーダユニット、ピクセルシェーダユニット、フラグメントシェーダユニット、ジオメトリシェーダユニット、ユニファイドシェーダユニットなど、GPU内に含まれているシェーダユニットを実装するために使用され得る。そのような例で、処理システム10は、例えば、頂点シェーダプログラム、フラグメントシェーダプログラム、ジオメトリシェーダプログラムなどのシェーダプログラムを実行するように構成され得る。
[0097] 図3は、本開示の選択的レジュームチェックアクティブ化技法を実装するために使用され得る例示的な制御フローモジュール34を示すブロック図である。制御フローモジュール34は、分岐条件評価器40と、次命令生成器42と、アクティブフラグレジスタ44と、レジュームカウンタレジスタ46と、スレッド状態マネージャ48と、スレッドディアクティベータ50と、レジュームチェックモジュール52と、レジュームチェックアクティブ化モジュール54とを含む。
[0098] 分岐条件評価器40は、処理システム10中で実行している各アクティブスレッドについて条件付き分岐命令によって指定された分岐条件を評価するように構成される。分岐条件評価器40は、現在処理されている命令が復号モジュール32からの分岐命令であるかどうかを示す情報を受信し得、現在処理されている命令が分岐命令である場合、分岐条件評価器40はまた、復号モジュール32から、現在処理されている分岐命令についての分岐条件を示す情報を受信し得る。いくつかの例で、現在処理されている命令が分岐命令であるかどうかを示す情報と分岐条件を示す情報の一方または両方は、命令自体の表現であり得る。さらなる例で、これらの情報成分の一方または両方は、復号モジュール32によって生成された信号であり得る。
[0099] 分岐条件評価器40は、スレッド固有データを使用してプログラムのアクティブスレッドの各々について同じ分岐条件を評価し得る。いくつかの例で、分岐条件評価器40は、各スレッドについて分岐条件を評価するために必要とされるデータを取得し得、各スレッドについての分岐条件評価結果を生成するために、各スレッドについて分岐条件を内部で評価し得る。さらなる例で、分岐条件評価器40は、該当するスレッドについて分岐条件を評価するために必要とされるデータを取得することと、分岐条件を評価することと、分岐条件評価器40に該当するスレッドについての分岐条件評価結果を与えることとを行うように、アクティブスレッドに対応する各処理要素14に指示し得る。いずれの場合も、分岐条件評価器40は、各アクティブスレッドについて、分岐条件が該当するスレッドについて満たされるかどうかを判断し得る。
[0100] いくつかの例で、分岐条件評価器40は、分岐命令についての分岐ダイバージェンスが一様であるのかダイバージェントであるのかを判断し得る。例えば、分岐条件評価器40は、すべてのアクティブスレッドが分岐条件を満たしたかどうかと、すべてのアクティブスレッドが分岐条件を満たさなかったかどうかとを判断し得る。すべてのアクティブスレッドが、分岐条件を満たしたかまたは満たさなかったかのいずれかである場合、分岐条件評価器40は、分岐命令についての分岐ダイバージェンスが一様であると判断し得る。いくつかのアクティブスレッドが分岐条件を満たしており、いくつかのアクティブスレッドが分岐条件を満たさなかった場合、分岐条件評価器40は、分岐命令についての分岐ダイバージェンスがダイバージェントであると判断し得る。分岐ダイバージェンスが一様である例で、分岐条件評価器40は、分岐条件が一様に満たされるのか、一様に満たされないのかを判断し得る。
[0101] 分岐条件評価器40は、スレッド状態マネージャ48のスレッドディアクティベータ50に分岐条件ステータス情報を与え得る。分岐条件ステータス情報は、処理システム10中で実行している各アクティブスレッドについて、該当するスレッドが分岐条件を満たしたのか、分岐条件を満たさなかったのか(すなわち、スレッドについての分岐条件評価結果)を示し得る。スレッド状態マネージャ48は、分岐命令を実行したことに応答して特定のスレッドをアクティブ化および/または非アクティブ化すべきかどうかを判断するために分岐条件ステータス情報を使用し得る。
[0102] 分岐条件評価器40は次命令生成器42に分岐ダイバージェンス情報を与え得る。分岐ダイバージェンス情報は、分岐命令についての分岐ダイバージェンスが一様であるのかダイバージェントであるのかを示す情報を含み得る。分岐命令についての分岐ダイバージェンスが一様である場合、分岐ダイバージェンス情報はまた、分岐条件が一様に満たされるのか一様に満たされないのかを示す情報を含み得る。いくつかの例で、分岐ダイバージェンス情報は、アクティブスレッドの各々についての分岐条件ステータス情報の形態をとり得る。他の例で、分岐ダイバージェンス情報は、必ずしも個々のスレッドについての分岐条件ステータス情報を含むとは限らないことがある。
[0103] 次命令生成器42は、現在実行されている命令のタイプを示す情報と、命令が分岐命令である場合、現在実行されている命令の分岐ダイバージェンスを示す情報と、もしあれば現在実行されている命令によって指定されたターゲット命令を示す情報とに基づいて、次の処理サイクル中に実行されるべき次命令に対応するプログラムカウンタ値を生成するように構成される。次命令生成器42は、次の命令サイクルの実行が開始されてたとき、次命令生成器42によって生成されたプログラムカウンタ値をプログラムカウンタ28にロードさせ得る。
[0104] 現在実行されている命令のタイプを示す情報は、復号モジュール32から受信され、例えば、命令が連続命令であるのか制御フロー命令であるのかを示す情報を含み得る。命令が制御フロー命令である場合、命令のタイプを示す情報は、例えば、命令が分岐命令であるのかジャンプ命令であるのかを示す情報を含み得る。命令が分岐命令またはジャンプ命令である場合、命令のタイプを示す情報は、例えば、命令が順方向分岐命令であるのか順方向ジャンプ命令であるのか、または命令が逆方向分岐命令であるのか逆方向ジャンプ命令であるのかを示す情報を含み得る。
[0105] 命令の分岐ダイバージェンスを示す情報は分岐条件評価器40から受信され、例えば、分岐ダイバージェンスが一様であるのかダイバージェントであるのかを示す情報を含み得る。分岐ダイバージェンスが一様である場合、命令の分岐ダイバージェンスを示す情報は、例えば、分岐条件が一様に満たされるのか一様に満たされないのかを示す情報を含み得る。
[0106] ターゲット命令を示す情報は、復号モジュール32から受信され、例えば、ターゲットプログラムカウンタ値またはターゲットプログラムカウンタ値を示すオフセット値を含み得る。オフセット値は、例えば、ターゲットプログラムカウンタ値を生成するためにプログラムカウンタに加算される値であり得る。ターゲット命令を示す情報は、現在命令がターゲット命令を指定するとき実行されるべき次命令についてのプログラムカウンタを判断するために使用され得る。これらの命令は、例えば、条件付き分岐命令とジャンプ命令とを含み得る。
[0107] 連続命令の場合、次命令生成器42は、次連続命令に対応するプログラムカウンタ値を、プログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。次連続命令は、命令ストア16に記憶されたプログラムについての命令の順序付きシーケンスで現在実行されている命令の直後に行われる命令を指すことがある。
[0108] 逆方向ジャンプ命令の場合、次命令生成器42は、逆方向ジャンプ命令によって指定されたターゲット命令を示すターゲットプログラムカウンタ値を、プログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。順方向ジャンプ命令の場合、次命令生成器42は、いくつかの例で、次連続命令に対応するプログラムカウンタ値を、プログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。順方向ジャンプ命令を処理したことに応答して、制御フローモジュール34は、ある例で、スレッドのすべてを非アクティブ化し、非アクティブスレッドのためのレジュームカウンタ値の最初の値が到達されるか、またはジャンプ命令のためのターゲットプログラムカウンタ値が到達されるまで、プログラムカウンタ値を連続的に増分し得る。このようにして、スレッドのための「最小値アドレス第1」処理順序が維持される。
[0109] さらなる例で、順方向ジャンプ命令の場合、「最小値アドレス第1」処理順序を維持するために複数のプログラムカウンタ値を連続的に巡回するのではなく、制御フローモジュール34は、MINRCレジスタ(図示せず)に記憶されたMINRC値に基づいて、プログラムカウンタ28にロードすべきプログラムカウンタ値を選択し得る。例えば、次命令生成器42は、そのような例で、ターゲットプログラムカウンタ値がMINRC値以下であるかどうかを判断し得る。ターゲットプログラムカウンタ値がMINRC値以下である場合、次命令生成器42は、ターゲットプログラムカウンタ値をプログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。一方、ターゲットプログラムカウンタ値がMINRC値以上であるか、またはそれに等しい場合、次命令生成器42は、MINRC値をプログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。このようにして、スレッドのための「最小値アドレス第1」処理順序が維持される。
[0110] 逆方向分岐命令の場合、次命令生成器42は、逆方向分岐命令についての分岐条件が一様に満たされないかどうかを判断し得る。逆方向分岐命令についての分岐条件が一様に満たされない場合、次命令生成器42は、次連続命令に対応するプログラムカウンタ値を、プログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。一方、逆方向分岐命令についての分岐条件が一様に満たされるかまたはダイバージェントである場合、次命令生成器42は、逆方向分岐命令によって指定されたターゲット命令を示すターゲットプログラムカウンタ値を、プログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。
[0111] 順方向分岐命令の場合、次命令生成器42は、順方向分岐命令についての分岐条件が一様に満たされないかまたはダイバージェントでないかを判断し得る。順方向分岐命令についての分岐条件が一様に満たされないかまたはダイバージェントでない場合、次命令生成器42は、次連続命令に対応するプログラムカウンタ値を、プログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。順方向分岐命令についての分岐条件が一様に満たされる場合、次命令生成器42は、いくつかの例で、次連続命令に対応するプログラムカウンタ値を、プログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。分岐条件が一様に満たされる順方向分岐命令を処理したことに応答して、制御フローモジュール34は、いくつかの例で、スレッドのすべてを非アクティブ化し、非アクティブスレッドのためのレジュームカウンタ値の最初の値が到達されるか、または分岐命令のためのターゲットプログラムカウンタ値が到達されるまで、プログラムカウンタ値を連続的に増分し得る。このようにして、スレッドのための「最小値アドレス第1」処理順序が維持される。
[0112] さらなる例で、一様に満たされる順方向分岐命令の場合、制御フローモジュール34は、MINRCレジスタ(図示せず)に記憶されたMINRC値に基づいて、プログラムカウンタ28にロードすべきプログラムカウンタ値を選択し得る。例えば、次命令生成器42は、そのような例で、ターゲットプログラムカウンタ値がMINRC値以下であるかどうかを判断し得る。ターゲットプログラムカウンタ値がMINRC値以下である場合、次命令生成器42は、ターゲットプログラムカウンタ値をプログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。一方、ターゲットプログラムカウンタ値がMINRC値以上であるか、またはそれに等しい場合、次命令生成器42は、MINRC値をプログラムカウンタ28にロードすべきプログラムカウンタ値として選択し得る。このようにして、スレッドのための「最小値アドレス第1」処理順序が維持される。
[0113] アクティブフラグレジスタ44は、処理システム10中で実行しているスレッドのための複数のアクティブフラグを記憶する。アクティブフラグの各々は、処理システム10中で実行しているスレッドの該当する1つに対応し得、スレッドがアクティブである(すなわち、アクティブ化された)のか非アクティブである(すなわち、非アクティブ化された)のか指示であり得る。いくつかの例で、アクティブフラグの各々はシングルビットであり得、アクティブフラグレジスタ44は、アクティブフラグのすべてに対応するビットを記憶するように構成された1つまたは複数のレジスタであり得る。例えば、1つまたは複数のレジスタ中の各ビット位置はアクティブフラグに対応し得る。アクティブフラグレジスタ44はスレッド状態マネージャ48に通信可能に結合される。
[0114] レジュームカウンタレジスタ46は、処理システム10中で実行しているスレッドのための複数のレジュームカウンタ値を記憶する。レジュームカウンタ値の各々は、処理システム10中で実行しているスレッドの該当する1つに対応し得、該当するスレッドが非アクティブである場合、該当するスレッドが再アクティブ化されるようにスケジュールされたプログラムカウンタ値を示し得る。スレッドがアクティブである場合、レジュームカウンタ値はデフォルト値にセットされ、デフォルト値は、場合によっては、プログラムを実行するために使用される有効なプログラムカウンタ値の範囲よりも大きい値であり得る。例えば、スレッドがアクティブである場合、レジュームカウンタは、最大値である値(すなわち、レジュームカウンタのためのストレージスロットまたはレジスタで表され得る最も大きい値である値)にセットされ得る。対応するスレッドのためのレジュームカウンタ値は、スレッドがアクティブであるときデフォルト値にセットされるので、各レジュームカウンタ値はまた、該当するレジュームカウンタに対応するスレッドがアクティブであるのか非アクティブであるのかを示し得る。レジュームカウンタ値の各々は、処理システム10がプログラムを実行し始めるとき、デフォルト値に初期化され得る。
[0115] いくつかの例で、レジュームカウンタレジスタ46は、複数のレジュームカウンタ値を記憶するように構成された複数のレジスタを含み得る。例えば、各レジスタは、処理システム10中で実行している複数のスレッドの該当する1つのためのレジュームカウンタ値を記憶するように構成されたレジュームカウンタレジスタであり得る。レジュームカウンタレジスタ46はスレッド状態マネージャ48に通信可能に結合される。
[0116] スレッド状態マネージャ48は、処理システム10中で実行しているスレッドの状態を管理するように構成される。例えば、スレッド状態マネージャ48は、処理システム10中で実行しているスレッドをアクティブ化および非アクティブ化し、アクティブフラグ44とレジュームカウンタレジスタ46とを適宜に更新し得る。スレッド状態マネージャ48は、スレッドディアクティベータ50とレジュームチェックモジュール52とを含み得る。
[0117] スレッドディアクティベータ50は、処理システム10がダイバージェント分岐条件をもつ分岐命令を実行することに応答して、1つまたは複数のスレッドを非アクティブ化するように構成される。例えば、スレッドディアクティベータ50は、分岐条件評価器40からの、ダイバージェント分岐条件が生じたかどうかを示す情報と、分岐条件評価器40または復号モジュール32のいずれかからの、分岐命令が順方向分岐命令であるのか逆方向分岐命令であるのかを示す情報と、どのスレッドが分岐条件を満たしたか、およびどのスレッドが分岐条件を満たさなかったかを示す情報とを受信し得る。スレッドディアクティベータ50は、ダイバージェント分岐命令が順方向分岐命令であるのか逆方向分岐命令であるのかを判断し得る。ダイバージェント分岐命令が順方向分岐命令である場合、スレッドディアクティベータ50は、分岐条件を満たした各アクティブスレッドを非アクティブ化し得る。ダイバージェント分岐命令が逆方向分岐命令である場合、スレッドディアクティベータ50は、分岐条件を満たさなかった各アクティブスレッドを非アクティブ化し得る。
[0118] 非アクティブ化されている各スレッドについて、スレッドディアクティベータ50は、該当するスレッドに対応するレジュームカウンタレジスタ46に記憶されたレジュームカウンタ値を、該当するスレッドが再アクティブ化されるべきであるプログラムカウンタ値を示す値にセットし得る。ダイバージェント順方向分岐命令に応答してスレッドを非アクティブ化するときは、スレッドディアクティベータ50は、スレッドのためのレジュームカウンタ値を、順方向分岐命令によって指定されたターゲットプログラムカウンタ値を示す値にセットし得る。ダイバージェント逆方向分岐命令に応答してスレッドを非アクティブ化するときは、スレッドディアクティベータ50は、スレッドのためのレジュームカウンタ値を、次連続命令に対応するプログラムカウンタ値を示す値にセットし得る。
[0119] いくつかの例で、特定のスレッドを非アクティブ化するために、スレッドディアクティベータ50は、特定のスレッドに対応する処理要素14の該当する1つを非アクティブ化し得る。追加の例で、特定のスレッドを非アクティブ化するために、スレッドディアクティベータ50は、データストア16が特定のスレッドに対応する計算結果を記憶すべきでないことを示す信号を、特定のスレッドに対応するデータストア16の一部分に送り得る。スレッドを非アクティブ化するときに、スレッドディアクティベータ50は、いくつかの例で、非アクティブ化されるべきスレッドに対応する(アクティブフラグレジスタ44内の)アクティブフラグを、スレッドが非アクティブ化されたことを示す値にセットし得る。
[0120] レジュームチェックモジュール52は、非アクティブ化されたスレッドが、現在命令サイクルについて現在プログラムカウンタ値において再アクティブ化されるようにスケジュールされたかどうかを判断するために、レジュームチェック動作を実施するように構成され得る。いくつかの例で、レジュームチェック動作を実施するために、レジュームチェックモジュール52は、複数のレジュームカウンタ値の各々を現在処理されている命令に関連付けられたプログラムカウンタ値(すなわち、プログラムカウンタ28に現在ロードされているプログラムカウンタ値)と比較し、レジュームカウンタ値の各々が、プログラムカウンタ28に記憶された現在プログラムカウンタ値に等しいかどうかを判断し得る。特定のスレッドのためのレジュームカウンタ値が現在プログラムカウンタ値に等しい場合、レジュームチェックモジュール52はスレッドを再アクティブ化し得る。さもなければ、特定のスレッドのためのレジュームカウンタ値が現在プログラムカウンタ値に等しくない場合、レジュームチェックモジュール52はスレッドの非アクティブ化ステータスを維持し得る。
[0121] 再アクティブ化されている各スレッドについて、レジュームチェックモジュール52は、該当するスレッドに対応するレジュームカウンタ値を、スレッドがアクティブであることを示すデフォルト値にセットし得る。例えば、デフォルト値は、レジュームカウンタレジスタ46のうちの1つ中のレジュームカウンタ値のために表され得る最も大きい値であり得る。
[0122] いくつかの例で、特定のスレッドを再アクティブ化するために、レジュームチェックモジュール52は、特定のスレッドに対応する処理要素14の該当する1つをアクティブ化し得る。さらなる例で、特定のスレッドを再アクティブ化するために、レジュームチェックモジュール52は、データストア16が特定のスレッドに対応する計算結果を記憶すべきであることを示す信号を、特定のスレッドに対応するデータストア16の一部分に送り得る。スレッドを再アクティブ化するとき、レジュームチェックモジュール52は、いくつかの例で、スレッドに対応するアクティブフラグを、スレッドがアクティブ化されたことを示す値にセットし得る。
[0123] いくつかの例で、レジュームチェックモジュール52は、レジュームチェックアクティブ化モジュール54によって与えられる構成情報に基づいて選択的に有効または無効にされ得る。所与の命令サイクルについて、レジュームチェックモジュール52がその命令サイクルについて有効にされた場合、レジュームチェックモジュール52はその命令サイクル中にレジュームチェック動作を実施し得る。同様に、レジュームチェックモジュール52がその命令サイクルについて無効にされた場合、レジュームチェックモジュール52はその命令サイクル中にレジュームチェック動作を実施し得ない。
[0124] レジュームチェック動作を実施するためにレジュームチェックモジュール52が有効にされる命令サイクル中に、レジュームチェックモジュール52は、プログラムカウンタ値をプログラムカウンタ28にロードしたことに応答して、レジュームチェック動作を開始し得る。いくつかの例で、所与の命令サイクル中に、レジュームチェック動作が実施された場合、レジュームチェック動作は主動作より前に実施され得る。主動作は、命令サイクル中に処理される命令中で指定される演算(例えば、算術演算、論理演算、制御フロー演算など)であり得る。
[0125] 命令サイクルは、いくつかの例で、レジュームチェック動作が完了した後、処理要素14が、レジュームチェック動作の一部として再アクティブ化されたスレッドについて計算動作を実施することを可能にするのに十分な長さであり得る。さらなる例で、プログラムカウンタ28に記憶されたプログラムカウンタ値に対応する命令の実行は、レジュームチェック動作が完了した後、および命令について再アクティブ化されるようにスケジュールされたスレッドがアクティブ化されるまで、遅延させられ得る。そのような例で、レジュームチェック動作が完了した後、レジュームチェックモジュール52は、処理要素14に現在命令に関連付けられた計算動作を実施し始めさせ得る。
[0126] レジュームチェックアクティブ化モジュール54は、命令サイクル中に実行されるべき命令中に含まれる情報に基づいて、所与の命令サイクルについてレジュームチェックモジュール52を選択的にアクティブ化する(すなわち、有効または無効にする)ように構成される。命令中に含まれる情報は、命令についてレジュームチェック動作が実施されるべきであるかどうかを示し得る。レジュームチェックアクティブ化モジュール54は、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきであることを示すかどうかを判断し得る。命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきであることを示す場合、レジュームチェックアクティブ化モジュール54は、命令がその間に制御フローモジュール34によって実行される命令サイクルについてレジュームチェックモジュール52を有効にし得る。命令サイクルについてレジュームチェックモジュール52を有効にすることは、レジュームチェックモジュール52にその命令サイクル中にレジュームチェック動作を実施させ得る。命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきでないことを示す場合、レジュームチェックアクティブ化モジュール54は、命令がその間に制御フローモジュール34によって実行される命令サイクルについてレジュームチェックモジュール52を無効にし得る。命令サイクルについてレジュームチェックモジュール52を無効にすることは、レジュームチェックモジュール52にその命令サイクル中にレジュームチェック動作を実施させないことになり得る。このようにして、レジュームチェックアクティブ化モジュール54は、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作の実施を選択的に有効または無効にし得る。
[0127] 図4は、本開示の選択的レジュームチェックアクティブ化技法を実装するために使用され得る例示的な制御フローモジュール34を示すブロック図である。いくつかの例で、図4に示された例示的な制御フローモジュール34は、図2および図3に関して上記で説明した制御フローモジュール34および/または図1に関して上記で説明した制御ユニット12の一部を実装するために使用され得る。制御フローモジュール34は、スレッドレジスタ60と、アクティブフラグ62A〜62D(まとめて「アクティブフラグ62」)と、レジュームカウンタ64A〜64D(まとめて「レジュームカウンタ64」)と、レジュームチェックモジュール66と、レジュームチェックアクティブ化モジュール68と、分岐条件評価器70と、イベント情報生成器72と、プログラム状態レジスタ74と、状態遷移ブロック76と、スレッドディアクティベータ78と、次命令ブロック80とを含む。
[0128] 図4に示された制御フローモジュール34が、図3に示された制御フローモジュール34を実装するために使用される例で、図4に示されたアクティブフラグ62は、図3に示されたアクティブフラグレジスタ44に対応し得、図4に示されたレジュームカウンタ64は、図3に示されたレジュームカウンタレジスタ46に対応し得、図4に示された分岐条件評価器70は、図3に示された分岐条件評価器40に対応し得、図4に示されたレジュームチェックモジュール66は、図3に示されたレジュームチェックモジュール52に対応し得、図4に示されたレジュームチェックアクティブ化モジュール68は、図3に示されたレジュームチェックアクティブ化モジュール54に対応し得る。従って、簡潔のために、および冗長を回避するために、これらの共有構成要素の構造および動作についてはさらに詳細に説明しない。
[0129] さらに、図4に示された制御フローモジュール34が、図3に示された制御フローモジュール34を実装するために使用される例で、イベント情報生成器72、プログラム状態レジスタ74、状態遷移ブロック76および次命令ブロック80は、図3に示された次命令生成器42の機能を実装するように構成され得る。同様に、イベント情報生成器72、プログラム状態レジスタ74、状態遷移ブロック76、およびスレッドディアクティベータ78は、図3に示されたスレッドディアクティベータ50の機能を実装するように構成され得る。
[0130] スレッドレジスタ60は、処理システム10中で実行しているスレッドの各々のスレッド状態を記憶するように構成される。図4に示されているように、スレッドレジスタ60はアクティブフラグ62とレジュームカウンタ64とを含む。アクティブフラグ62の各々は、該当するアクティブフラグ62A〜62Dに対応するスレッドがアクティブであるかどうかを示すアクティブフラグを記憶する。レジュームカウンタ64の各々は、該当するスレッドのためのレジュームカウンタ値を記憶する。いくつかの例で、各スレッドは処理要素14の各々に割り当てられ得る。そのような例で、アクティブフラグ62およびレジュームカウンタ64の各々は処理要素14の該当する1つに対応し得る。例えば、アクティブフラグ62Aおよびレジュームカウンタ64Aは、図1に示された処理要素14Aにそれぞれ対応し得、アクティブフラグ62Bおよびレジュームカウンタ64Bは、図1に示された処理要素14Bの該当する1つに対応し得る。図4に示された例示的な制御フローモジュール34は、4つのアクティブフラグ62と4つのレジュームカウンタ64とを有するシステムを示しているが、他の例で、制御フローモジュール34は、同じまたは異なる数のアクティブフラグ62とレジュームカウンタ64とを有し得る。
[0131] レジュームチェックモジュール66は、レジュームチェックアクティブ化モジュール68によってレジュームチェックモジュール66が有効にされた命令サイクル中にレジュームチェック動作を実施するように構成され得る。有効にされたとき、レジュームチェックモジュール66は、プログラムカウンタ28に新しいプログラムカウンタ値がロードされたことに応答してレジュームチェック動作を実施し得る。いくつかの例で、レジュームチェックモジュール66は、図9および図10に示すレジュームチェック技法に従ってレジュームチェック動作を実施し得る。レジュームチェック動作を実施するために、レジュームチェックモジュール66は、プログラムカウンタ28からの現在プログラムカウンタ値と、アクティブフラグ62からの現在スレッドアクティブ化ステータスと、レジュームカウンタ64からの現在レジュームカウンタ値とを受信し得る。レジュームチェックモジュール66は、レジュームチェック動作の一部としてアクティブフラグ62とレジュームカウンタ64とを変更し得る。さらに、レジュームチェックモジュール66は、レジュームチェック動作の結果に基づいてプログラム状態レジスタ74を更新し得る。命令サイクルについて有効にされないとき、レジュームチェックモジュール66は、命令サイクル中にレジュームチェック動作を実施することを控え得る。
[0132] レジュームチェックアクティブ化モジュール68は、現在命令サイクル中に処理されるべき命令中に含まれる情報に基づいて、レジュームチェックモジュール66を選択的に有効および無効にするように構成され得る。命令中に含まれる情報は、現在命令サイクル中に処理されるべき命令についてレジュームチェック動作が実施されるべきであるかどうかを示し得る。
[0133] レジュームチェックモジュール66が有効にされたとき、レジュームチェック動作を完了した後に、レジュームチェックモジュール66は、レジュームチェック動作が完了したことを示す信号をフェッチモジュール30と復号モジュール32の一方または両方に送り得る。フェッチモジュール30が、レジュームチェック動作が完了したという信号を受信したとき、フェッチモジュール30は、さらなる処理のために、フェッチされた命令を復号モジュール32にフォワーディングし得る。命令を受信したことに応答して、復号モジュール32は、アクティブフラグ62をチェックし、レジュームチェック動作によって変更されていることがあるアクティブフラグ62の現在状態基づいて処理要素14のアクティブおよび非アクティブステータスを更新し得る。命令が、処理要素14に発行可能であるタイプである場合、復号モジュール32は、処理要素14のアクティブおよび非アクティブステータスを更新するとともにまたはその後に、処理要素14に命令を発行し得る。例示的な制御フローモジュール34は、レジュームチェック動作の完了時にフェッチモジュール30にシグナリングするものとしてレジュームチェックモジュール66を示しているが、他の例で、レジュームチェックモジュール66は、レジュームチェックが完了したことを示す信号を復号モジュール32に送り得る。そのような例で、復号モジュール32が信号を受信したとき、復号モジュール32は、アクティブフラグ62をチェックし、アクティブフラグ62の現在状態基づいて処理要素14のアクティブおよび非アクティブステータスを更新し得る。
[0134] 復号モジュール32が命令を復号するとき、復号モジュール32が、命令が分岐命令(すなわち、条件付き分岐命令)であると判断した場合、復号モジュール32は、現在命令が条件付き分岐命令であることを示す信号を分岐条件評価器70に送り、さらなる処理のために、分岐条件を示す情報を分岐条件評価器70に与え得る。いくつかの例で、復号モジュール32が、命令が分岐命令でない(例えば、ジャンプ命令または連続命令である)と判断した場合、復号モジュール32は、現在命令が条件付き分岐命令でないことを示す信号を分岐条件評価器70に送り得る。
[0135] 復号モジュール32は、さらなる処理のためにイベント情報生成器72に制御情報を与える。いくつかの例で、制御情報は命令自体であり得る。さらなる例で、制御情報は、例えば、命令が制御フロー命令であるのか連続命令であるのかを示す情報、命令が制御フロー命令である場合、命令が分岐命令であるのかジャンプ命令であるのかを示す情報、および命令が分岐命令またはジャンプ命令である場合、分岐命令またはジャンプ命令が、順方向分岐命令または順方向ジャンプ命令であるのか逆方向分岐命令または逆方向ジャンプ命令であるのかを示す情報、および命令が分岐命令である場合、分岐条件を指定する情報などの情報を含み得る。
[0136] 現在処理されている命令が条件付き分岐命令である場合、分岐条件評価器70は、各アクティブスレッドについて分岐条件を評価し得る。いくつかの例で、分岐条件評価器70は、通信経路22を介して処理要素14から比較演算またはゼロチェック演算の結果を受信し得る。さらなる例で、分岐条件評価器70は、通信経路24を介してデータストア18中の1つまたは複数のレジスタにアクセスし、比較演算またはゼロチェック演算を実施し得る。いずれの場合も、分岐条件評価器70は、各アクティブスレッドについて分岐条件が満たされるのか満たされないのかを判断し得る。いくつかの例で、分岐条件評価器70は、各アクティブスレッドについて分岐条件が満たされるのか満たされないのかを示す情報をイベント情報生成器72にフォワーディングし得る。追加の例で、分岐条件評価器70は、現在命令の分岐ダイバージェンスが一様であるのかダイバージェントであるのかを判断し、分岐ダイバージェンスが一様であるのかダイバージェントであるのかを示す情報をイベント情報生成器72にフォワーディングし得る。さらなる例で、分岐命令の分岐ダイバージェンスが一様である場合、分岐条件評価器70は、分岐条件が一様に満たされるのか一様に満たされないのかを判断し、分岐条件が一様に満たされるのか一様に満たされないのかを示す情報をイベント情報生成器72にフォワーディングし得る。
[0137] イベント情報生成器72は、復号モジュール32から制御情報を受信し、現在処理されている命令が分岐命令である場合、分岐条件評価器70から分岐条件情報を受信する。いくつかの例で、イベント情報生成器72は、現在処理されている命令が分岐命令である場合、分岐条件評価器70から分岐ダイバージェンス情報をも受信し得る。イベント情報生成器72が分岐条件評価器70から分岐ダイバージェンス情報を受信しない場合、イベント情報生成器72は、現在命令の分岐ダイバージェンスが一様であるのかダイバージェントであるのかを判断し得る。イベント情報生成器72は、受信した情報に基づいてイベントを生成し、それらのイベントを状態遷移ブロック76、スレッドディアクティベータ78および次命令ブロック80に与える。
[0138] いくつかの例で、イベント情報生成器72は以下のイベントを生成し得る。
Jb: ジャンプ逆方向命令
Jf: ジャンプ順方向命令
BbuT: 分岐逆方向命令、すべてのスレッドは一様であり、条件は真である
BbuF: 分岐逆方向命令、すべてのスレッドは一様であり、条件は偽である
BfuT: 分岐順方向命令、すべてのスレッドは一様であり、条件は真である
BfuF: 分岐順方向命令、すべてのスレッドは一様であり、条件は偽である
Bbd: 分岐逆方向命令、スレッドはダイバージェントである
Bfd: 分岐順方向命令、スレッドはダイバージェントである
S: 連続命令
上記で特定されたイベントによれば、命令は、連続命令(S)、ジャンプ命令(J)、または分岐命令(B)であり得る。ジャンプ命令または分岐命令の場合、ジャンプ方向または分岐方向は、逆方向(b)または順方向(f)のいずれかであり得る。分岐命令の場合、分岐ダイバージェンスは、一様(u)またはダイバージェント(d)のいずれかであり得る。分岐命令の場合、分岐条件は、真(T)または偽(F)のいずれかであり得る。真の分岐条件は、満たされる分岐条件に対応し得、偽の分岐条件は満たされない分岐条件に対応し得る。
[0139] プログラム状態レジスタ74は、処理システム10中で実行しているプログラムのプログラム状態を記憶し得る。いくつかの例で、プログラム状態レジスタ74は以下の3つの状態を記憶し得る。
状態0: すべてのスレッドがアクティブである。
状態1: 少なくとも1つのスレッドがアクティブであり、少なくとも1つのスレッドが非アクティブである。
状態2: すべてのスレッドが非アクティブである。
いくつかの例で、処理システム10は、プログラムの初期状態および最終状態がそれぞれ状態0であるように構成され得る。
[0140] 状態遷移ブロック76は、イベント情報生成器72からのイベントとプログラム状態レジスタ74からの現在プログラム状態とを受信し、受信したイベントと現在プログラム状態とに基づいて新しいプログラム状態を生成し、新しいプログラム状態をプログラム状態レジスタ74に記憶し得る。状態遷移ブロック76は、図5に関してさらに詳細に説明する状態遷移表に従って新しいプログラム状態を生成し得る。
[0141] スレッドディアクティベータ78は、イベント情報生成器72からのイベントとプログラム状態レジスタ74からの現在プログラム状態とを受信し、イベントと現在プログラム状態とに基づいて、1つまたは複数のスレッドを非アクティブ化すべきかどうかを判断し、イベントと現在プログラム状態とのいくつかの組合せに応答して1つまたは複数のスレッドを非アクティブ化し得る。スレッドを非アクティブ化するとき、スレッドディアクティベータ78は、非アクティブ化されているスレッドについてアクティブフラグ62とレジュームカウンタ64とを更新し得る。スレッドディアクティベータ78は、図5に関してさらに詳細に説明する状態遷移表に従ってスレッドを非アクティブ化し得る。
[0142] 次命令ブロック80は、イベント情報生成器72からのイベントとプログラム状態レジスタ74からの現在プログラム状態とを受信し、プログラムカウンタ28にロードすべき新しいプログラムカウンタ値を判断し、新しいプログラムカウンタ値をプログラムカウンタ28にロードし得る。新しいプログラムカウンタ値は、制御ユニット12によって処理されるべき次命令を示し得る。次命令ブロック80は、図5に関してさらに詳細に説明する状態遷移表に従って新しいプログラムカウンタ値を判断し得る。
[0143] 上記で説明したように、レジュームチェックモジュール66は、レジュームチェック動作の結果に基づいてプログラム状態レジスタ74を更新し得る。この更新は、非同期的にレジュームチェックモジュール66によって実施され得る。例えば、レジュームチェック動作を実施するより前にプログラム状態が状態1であり、すべての非アクティブスレッドが再アクティブ化された場合、プログラム状態レジスタ74は、すべてのスレッドがアクティブ化されたことを反映するために、非同期的にプログラム状態レジスタ74を状態0に変更し得る。状態遷移ブロック76は、レジュームチェックモジュール66による更新の後に利用可能である現在プログラム状態に基づいて新しいプログラム状態を生成することに留意されたい。同様に、スレッドディアクティベータ78は、レジュームチェックモジュール66による更新の後に利用可能である現在プログラム状態に基づいて、1つまたは複数のスレッドを非アクティブ化すべきかどうかを判断し、次命令ブロック80は、レジュームチェックモジュール66による更新の後に利用可能である現在プログラム状態に基づいて新しいプログラムカウンタ値を判断する。従って、プログラム状態は、レジュームチェックにより単一の処理サイクル中に2つの異なる状態間で変化し得るが、処理サイクルの最終状態、すなわち、レジュームチェックが完了した後に発生する状態が、状態遷移ブロック76、スレッドディアクティベータ78および次命令ブロック80の各々による処理のために現在プログラム状態として使用される。
[0144] 図5は、本開示による、図4に示された制御フローモジュール34の例示的な動作を特徴づける状態遷移表である。図5の状態遷移表は、現在プログラム状態を表す「古い状態」列と、次の処理サイクルについての新しいプログラム状態またはレジュームチェック動作による非同期遷移の後に発生したプログラム状態のいずれかを表す「新しい状態」列とを含む。状態遷移表は、イベント情報生成器72によって生成されたイベントを含む「イベント」列をも含む。「イベント」列中のインジケータ「該当なし」は、レジュームチェック動作により状態遷移およびアクションが行われることと、イベントがそのような遷移とは無関係であることとを意味する。状態遷移表は、現在プログラム状態とイベントとの特定の組合せに応答してどんなアクションが行われるかを示す「アクション」列をも含む。「アクション」列中の「レジューム」と標示されたアクションは、レジュームチェック動作により非同期状態遷移が行われることを意味する。
[0145] 図5に示されているように、状態遷移ブロック76は、現在状態が状態0であることと、Sイベント、Jfイベント、Jbイベント、BfuTイベント、BfuFイベント、BbuTイベント、またはBbuFイベントを受信したこととに応答して、プログラム状態レジスタ74にロードすべき新しい状態として状態0を選択する。状態遷移ブロック76は、現在状態が状態0であることと、BbdイベントまたはBfdイベントを受信したこととに応答して、プログラム状態レジスタ74にロードすべき新しい状態として状態1を選択する。状態遷移ブロック76はまた、現在状態が状態1であることと、Sイベント、Jbイベント、BbuFイベント、BbuTイベント、BfuFイベント、Bbdイベント、またはBfdイベントを受信したこととに応答して、プログラム状態レジスタ74にロードすべき新しい状態として状態1を選択する。状態遷移ブロック76は、現在状態が状態1であることと、JfイベントまたはBfuTイベントを受信したこととに応答して、プログラム状態レジスタ74にロードすべき新しい状態として状態2を選択する。状態遷移ブロック76はまた、現在状態が状態2であることと、何らかイベントを受信したこととに応答して、プログラム状態レジスタ74にロードすべき新しい状態として状態2を選択する。レジュームチェック動作の一部として1つまたは複数のスレッドを再アクティブ化することに応答して、状態遷移ブロック76は、非同期的に状態0または状態1に遷移し得る。
[0146] 同じく図5に示されているように、スレッドディアクティベータ78は、現在状態が状態0または状態1であることと、BbdイベントまたはBfdイベントを受信したこととに応答して、1つまたは複数のスレッドを非アクティブ化することを判断し得る。BbdイベントおよびBfdイベントは、分岐命令についての分岐条件の評価に起因するダイバージェンスイベントと呼ばれることがある。スレッドディアクティベータ78は、Bbdイベントを受信したことに応答して、分岐条件を満たさない(すなわち、偽の条件)すべてのアクティブスレッドを非アクティブ化することと、Bfdイベントを受信したことに応答して、分岐条件を満たす(すなわち、真の条件)すべてのアクティブスレッドを非アクティブ化することとを判断し得る。スレッドディアクティベータ78は、現在状態が状態1であることと、JfイベントまたはBfuTイベントを受信したこととに応答して、すべてのアクティブスレッドを非アクティブ化することを判断し得る。
[0147] 図5に示されているように、次命令ブロック80は、現在プログラム状態とイベントとの様々な組合せに応答して、プログラムカウンタ28にロードすべき、次連続命令を示すプログラムカウンタ値(すなわち、「PC+1」)、またはターゲット命令を示すプログラムカウンタ値(すなわち、ターゲットプログラムカウンタ値)のうちの1つを選択し得る。例えば、次命令ブロック80は、現在状態が状態0であることと、Sイベント、BfuFイベント、BbuFイベント、またはBfdイベントを受信したこととに応答して、プログラムカウンタ28にロードすべき、次連続命令を示すプログラムカウンタ値(すなわち、「PC+1」)を選択し得る。次命令ブロック80はまた、現在状態が状態1であることと、Sイベント、BbuFイベント、BfuFイベント、Bfdイベント、Jfイベント、またはBfuTイベントを受信したこととに応答して、プログラムカウンタ28にロードすべき、次連続命令を示すプログラムカウンタ値(すなわち、「PC+1」)を選択し得る。次命令ブロック80はまた、現在状態が状態2であることと、何らかのイベントを受信したこととに応答して、プログラムカウンタ28にロードすべき、次連続命令を示すプログラムカウンタ値(すなわち、「PC+1」)を選択し得る。次命令ブロック80は、現在状態が状態0であることと、Jfイベント、Jbイベント、BfuTイベント、BbuTイベント、またはBbdイベントを受信したこととに応答して、プログラムカウンタ28にロードすべき、ターゲット命令を示すプログラムカウンタ値(すなわち、ターゲットプログラムカウンタ値)を選択し得る。次命令ブロック80はまた、現在状態が状態1であることと、Jbイベント、BbuTイベント、またはBbdイベントを受信したこととに応答して、プログラムカウンタ28にロードすべき、ターゲット命令を示すプログラムカウンタ値(すなわち、ターゲットプログラムカウンタ値)を選択し得る。
[0148] 図6は、本開示の選択的レジュームチェックアクティブ化技法を実装するために使用され得る例示的なコンピューティングシステム100を示すブロック図である。コンピューティングシステム100は、プロセッサ102、104と、メモリ106と、バス108とを含む。プロセッサ102とプロセッサ104とメモリ106とはバス108を介して互いに通信可能に結合され得る。バス108は、例えば、第3世代バス(例えば、HyperTransportバスまたはInfiniBandバス)、第2世代バス(例えば、Advanced Graphics Portバス、Peripheral Component Interconnect(PCI)Expressバス、またはAdvanced eXentisible Interface(AXI)バス)、あるいは別のタイプのバスまたはデバイス相互接続など、様々なバス構造または他の通信構造のいずれかであり得る。図6に示された異なる構成要素間のバスおよび通信インターフェースの特定の構成は例示にすぎず、同じまたは異なる構成要素をもつコンピューティングデバイスおよび/またはコンピューティングシステムの他の構成が、本開示の技法を実装するために使用され得ることに留意されたい。
[0149] プロセッサ102および104は1つまたは複数のプロセッサにそれぞれ対応し得る。1つまたは複数のプロセッサは、任意のタイプの汎用プロセッサまたは専用プロセッサであり得る。いくつかの例で、プロセッサ102は、アプリケーションプロセッサ、ホストプロセッサおよび/または中央処理ユニット(CPU)であり得る。さらなる例で、プロセッサ104はグラフィックス処理ユニット(GPU)であり得る。そのような例で、GPUは、グラフィックス演算の処理を加速すること、および/またはプロセッサ102の指示で汎用計算タスク(例えば、グラフィックス処理ユニット上での汎用計算(GPGPU:general-purpose computing on graphics processing unit)タスク)を実施することを行うように構成され得る。プロセッサ102は、コンパイラモジュール110を実行するように構成される。プロセッサ104は、本開示の図1に記載されている処理システム10に対応し得る処理システム10を含み得る。プロセッサ102とプロセッサ104は異なるプロセッサであるものとして図6に示されているが、他の例で、プロセッサ102とプロセッサ104は同じプロセッサであり得る。
[0150] メモリ106は、プロセッサ102、104が実行するためにアクセス可能であるプログラムモジュールおよび/または命令を記憶すること、ならびに/あるいはプロセッサ102および104上で実行するプログラムが使用するデータを記憶することを行うように構成され得る。メモリ106は、例えば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、読取り専用メモリ(ROM)、消去可能プログラマブルROM(EPROM)、電気的消去可能プログラマブルROM(EEPROM(登録商標))、フラッシュメモリ、磁気データ媒体または光記憶媒体など、1つまたは複数の揮発性または不揮発性のメモリまたは記憶デバイスから形成され得る。メモリ106は、コンパイラコード112と、ソースコード114と、コンパイルドコード116とを含む。
[0151] コンパイラモジュール110は、コンパイラコード112中に含まれるコンパイル技法に基づいて、コンパイルドコード116を生成するためにソースコード114をコンパイルするように構成され得る。言い換えれば、コンパイラモジュール110は、プロセッサ102上で実行しているコンパイラコード112のランタイム実行インスタンスであり得る。
[0152] ソースコード114は、プロセッサ104および/または処理システム10によって実行されるべきプログラムに対応し得る。コンパイルドコード116はソースコード114のコンパイルされたバージョンであり得る。いくつかの例で、コンパイルされたバージョンは、プロセッサ104および/または処理システム10によって実行されることが可能であるオブジェクトコード、バイトコード、および/または機械語コードであり得る。
[0153] 本開示によれば、コンパイラモジュール110は、コンパイルドコード116が、コンパイルドコード116を実行するプロセッサ(例えば、プロセッサ104および/または処理システム10)によって実行されたとき、該当する命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報をそれぞれ含む1つまたは複数の命令を含むように、コンパイルドコード116を生成するように構成され得る。いくつかの例で、命令中に含まれる情報は、例えば、命令を実行するプロセッサに、命令についてレジュームチェック動作を実施すべきかどうかを命令する1ビットフラグなど、情報フィールドであり得る。追加の例で、命令中に含まれる情報は、特定の動作コード(すなわち、オペコード)パラメータ、ビットの組合せなど、他の形態をとり得る。
[0154] いくつかの例で、コンパイラモジュール110は、コンパイルドコード116の実行中に命令ごとに特定の命令についてレジュームチェック動作が選択的に実施されるように構成され得る。例えば、コンパイラモジュール110は、ソースコード114によって指定されたプログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして1つまたは複数の命令を選択し、そのプログラムのためのコンパイルドコード116が選択された1つまたは複数の命令を含むように、および選択された1つまたは複数の命令が、選択された1つまたは複数の命令についてレジュームチェック動作が実施されるべきであることを示す情報を含むように、コンパイルドコード116を生成し得る。別の例として、コンパイルドコード116は、ソースコード114によって指定されたプログラムが実行されるときにレジュームチェック動作が実施されるべきでない命令であるものとして1つまたは複数の命令を選択し、そのプログラムのためのコンパイルドコード116が選択された1つまたは複数の命令を含むように、および選択された1つまたは複数の命令が、選択された1つまたは複数の命令についてレジュームチェック動作が実施されるべきでないことを示す情報を含むように、コンパイルドコード116を生成し得る。
[0155] さらなる例で、コンパイラモジュール110は、命令が、分岐命令またはジャンプ命令のうちの少なくとも1つを実行することに応答して非アクティブ化された1つまたは複数のスレッドによって実行されるべき候補次命令である場合、プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして命令を選択するように構成され得る。候補次命令は、そのような非アクティブ化されたスレッドが、分岐命令またはジャンプ命令を実行することに応答して再アクティブ化されるようにスケジュールされるであろう命令を指すことがある。例えば、順方向分岐命令および順方向ジャンプ命令の場合、候補次命令は順方向ジャンプ命令または順方向分岐命令のターゲット命令であり得る。別の例として、逆方向分岐命令の場合、候補次命令は逆方向分岐命令の後の次連続命令であり得る。
[0156] 分岐命令は、該当するスレッドについて分岐条件が満たされるかどうかに基づいて、1つまたは複数のスレッドの各々について実行されるべき次命令を指定する、制御フロー命令を指すことがある。分岐命令は、ターゲット命令を指定するフィールドと、そのターゲット命令に分岐するための分岐条件を指定するフィールドとを含み得る。分岐命令を実行するスレッドの各々について、該当するスレッドが分岐条件を満たす場合、分岐命令は、該当するスレッドによって実行されるべき次命令としてターゲット命令を指定し得る。一方、該当するスレッドが分岐条件を満たさない場合、分岐命令は、該当するスレッドによって実行されるべき次命令として次連続命令を指定し得る。次連続命令は、命令の順序付きシーケンスで分岐命令の直後に行われ得る。
[0157] 順方向分岐命令は、分岐命令中で指定されたターゲット命令が、分岐命令を含むプログラムを形成する命令の順序付きシーケンスで分岐命令の後に行われる、分岐命令を指すことがある。逆方向分岐命令は、分岐命令中で指定されたターゲット命令が、分岐命令を含むプログラムを形成する命令の順序付きシーケンスで次連続命令より前に行われる、分岐命令を指すことがある。
[0158] ジャンプ命令は、1つまたは複数のスレッドの各々について実行されるべき次命令を無条件に指定する制御フロー命令を指すことがある。ジャンプ命令は、ターゲット命令を指定する情報フィールドを含み得、いくつかの例で、ターゲット命令にジャンプするための条件を指定するフィールドを含まないことがある。ジャンプ命令は、ジャンプ命令を実行するスレッドの各々によって実行されるべき次命令としてターゲット命令を無条件に指定し得る。
[0159] 順方向および逆方向分岐命令と同様に、順方向ジャンプ命令は、ジャンプ命令中で指定されたターゲット命令が、ジャンプ命令を含むプログラムを形成する命令の順序付きシーケンスでジャンプ命令の後に行われる、ジャンプ命令を指すことがある。逆方向ジャンプ命令は、ジャンプ命令中で指定されたターゲット命令が、ジャンプ命令を含むプログラムを形成する命令の順序付きシーケンスで次連続命令より前に行われる、ジャンプ命令を指すことがある。次連続命令は、命令の順序付きシーケンスでジャンプ命令の直後に行われ得る。
[0160] 上記で説明したように、スレッド再アクティブ化のためのレジュームカウンタベースの手法を使用する処理システムにおいて適切な制御フローが維持されることを保証するために、処理システム10は、「最小値アドレス第1」スレッド処理順序を使用し得る。概して、「最小値アドレス第1」スレッド処理順序は、より低い値のアドレスにおける命令を処理するようにスケジュールされたスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドより前に実行される処理順序を指すことがある。「最小値アドレス第1」スレッド処理順序は、分岐命令の方向(すなわち、順方向または逆方向)に基づいて、ダイバージェント分岐命令に応答してどのスレッドが非アクティブ化されるかを区別し得る。
[0161] 例えば、ダイバージェント逆方向分岐命令の場合、処理システム10は、分岐条件が満たされないスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令の後に行われる次連続命令に関連付けられた値にセットし、分岐命令によって指定されたターゲット命令に関連付けられた値をプログラムカウンタにロードし、続いて分岐条件が満たされるスレッドを実行し得る。ダイバージェント順方向分岐命令の場合、処理システム10は、分岐条件が満たされるスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令によって指定されたターゲット命令に関連付けられた値にセットし、分岐命令の後に行われる次連続命令に関連付けられた値をプログラムカウンタにロードし、続いて分岐条件が満たされないスレッドを実行し得る。このようにしてスレッドを非アクティブ化することは、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドより前に実行すること(すなわち、「最小値アドレス第1」スレッド処理順序)を保証する。
[0162] 1つまたは複数のスレッドがすでに非アクティブ化されており、残りのアクティブスレッドが、順方向ジャンプ命令または一様に満たされる順方向分岐命令(すなわち、分岐条件がすべてのアクティブスレッドについて一様に満たされる順方向分岐命令)のいずれかを実行する場合、制御フローを扱う1つの手法は、すべてのアクティブスレッドがアクティブのままになるので、順方向ジャンプ命令または順方向分岐命令中で指定されたターゲット命令に常にジャンプすることであり得る。しかしながら、そのような手法は「最小値アドレス第1」スレッド処理順序を保証しない。特に、1つまたは複数の非アクティブスレッドは、場合によっては、ジャンプ命令または分岐命令の現在プログラムカウンタ値とターゲットプログラムカウンタ値(すなわち、分岐命令またはジャンプ命令中で指定されたターゲット命令に関連付けられたプログラムカウンタ値)との間にあるレジュームカウンタ値を有し得る。制御フローがそのような非アクティブスレッドを越えてジャンプした場合、そのようなスレッドは、プログラムの実行を完了するより前に再アクティブ化されない可能性がある。
[0163] そのような状況を回避するために、順方向ジャンプ命令または一様に満たされる順方向分岐命令が実行されるときはいつでも、処理システム10は、すべてのスレッドを非アクティブ化することと、非アクティブスレッドのためのレジュームカウンタ値の最初の値が到達されるか、あるいはジャンプ命令または分岐命令のためのターゲットプログラムカウンタ値が到達されるまで、プログラムカウンタ値を連続的に増分することとを行うように構成され得る。このようにして、スレッドのための「最小値アドレス第1」処理順序が維持される。
[0164] いくつかの例で、コンパイラモジュール110は、上記で説明したように「最小値アドレス第1」スレッド処理順序を利用する処理システムにおいて、プログラムの1つまたは複数の命令についてそのプログラムの実行中にレジュームチェック動作が実施される必要があり得るかどうかを判断するように構成され得る。そのような例で、コンパイラモジュール110は、プログラムの実行中にレジュームチェック動作が実施される必要があり得ると判断された命令についてレジュームチェック動作を有効にすることと、プログラムの実行中にスレッドが再アクティブ化される必要がないであろうと判断された命令についてレジュームチェック動作を無効にすることとを行うように構成され得る。
[0165] 1つの具体的な例として、ダイバージェント順方向分岐命令の場合、コンパイラモジュール110は、分岐条件を満たすすべてのスレッドが非アクティブ化されることになるので、順方向分岐命令のターゲット命令である命令についてレジュームチェック動作が実施されるべきであると判断し得る。ダイバージェント逆方向分岐命令の場合、コンパイラモジュール110は、分岐条件を満たさないすべてのスレッドが非アクティブ化されることになるので、逆方向分岐命令の直後に行われる命令(すなわち、逆方向分岐命令の後の次連続命令)についてレジュームチェック動作が実施されるべきであると判断し得る。順方向ジャンプ命令の場合、コンパイラモジュール110は、非アクティブスレッドのためのレジュームカウンタ値の最初の値が到達されるか、またはジャンプ命令のためのターゲットプログラムカウンタ値が到達されるまで、プログラムカウンタ値を巡回するためにすべてのスレッドが非アクティブ化され得るので、順方向ジャンプ命令のターゲット命令である命令についてレジュームチェック動作が実施されるべきであると判断し得る。
[0166] この例で、順方向分岐命令または順方向ジャンプ命令のターゲット命令であるものとして、あるいは逆方向分岐命令の後の次連続命令であるものとして識別されなかった他の命令の場合、コンパイラモジュール110は、プログラムの実行中に非アクティブ化されたスレッドがそのような命令において再アクティブ化される必要がないことになるので、そのような命令についてレジュームチェック動作が実施される必要がないと判断し得る。そのような命令についてレジュームチェック動作を実施しないことは、あらゆる命令についてレジュームチェック動作が実施される処理システムと比較して、SIMD処理システムの電力消費を低減し、および/またはそれの性能を改善し得る。
[0167] プログラムの実行中にレジュームチェック動作が実施される必要があり得ると判断された命令の場合、コンパイラモジュール110は、それらの命令についてレジュームチェック動作が実施されるべきであることを示す情報をコンパイルされた命令中に配置し得る。同様に、プログラムの実行中にレジュームチェック動作が実施される必要がないと判断された命令の場合、コンパイラモジュール110は、それらの命令についてレジュームチェック動作が実施されるべきでないことを示す情報を命令中に配置し得る。
[0168] 図7〜図10は、本開示による、レジュームチェック動作を選択的にアクティブ化および/または実施するための例示的な命令処理技法を示す流れ図である。図7〜図10に示された例示的な技法は、いくつかの例で、図2〜図4のいずれかの制御フローモジュール34中で、および/または図1〜図4および図6のいずれかの処理システム10内で実装され得る。説明を簡単にするために、それらの技法について、図2に示された制御フローモジュール34に関して説明するが、それらの技法は、同じまたは異なる構成で同じまたは異なる構成要素をもつ他のシステムにおいて実施され得ることを理解されたい。
[0169] 図7は、本開示による、レジュームチェック動作を選択的にアクティブ化するための例示的な技法を示す流れ図である。制御フローモジュール34が、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む命令を実行する(120)。制御フローモジュール34は、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にする(122)。
[0170] レジュームチェック動作は、複数のレジュームカウンタ値の各々を命令に関連付けられたプログラムカウンタ値と比較することを含む動作であり得る。レジュームチェック動作は、複数のレジュームカウンタ値の各々について、該当するレジュームカウンタ値がプログラムカウンタ値に等しい場合、該当するレジュームカウンタ値に関連付けられた複数のスレッドの該当する1つをアクティブ化することをさらに含み得る。レジュームカウンタ値の各々は、プロセッサ(例えば、処理システム10)上で実行している複数のスレッドの該当する1つに関連付され得る。
[0171] 図8は、本開示による、レジュームチェック動作を選択的にアクティブ化するための別の例示的な技法を示す流れ図である。制御フローモジュール34が命令サイクル中に命令を実行する(124)。制御フローモジュール34は、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきであることを示すかどうかを判断する(126)。制御フローモジュール34は、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、命令サイクルについてレジュームチェック動作を有効にする(128)。例えば、制御フローモジュール34は、命令サイクル中にレジュームチェック動作が実施されるようにし得る。制御フローモジュール34は、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、命令サイクルについてレジュームチェック動作を無効にする(130)。例えば、制御フローモジュール34は、命令サイクル中にレジュームチェック動作が実施されないようにし得る。
[0172] 図9は、本開示による、レジュームチェック動作を実施するための例示的な技法を示す流れ図である。制御フローモジュール34が、複数のレジュームカウンタ値の各々を命令に関連付けられたプログラムカウンタ値と比較する(132)。レジュームカウンタ値の各々は、プロセッサ上で実行している複数のスレッドの該当する1つに関連付され得る。プログラムカウンタ値は、現在命令処理サイクルに関連付けられたプログラムカウンタ値であり得る。複数のレジュームカウンタ値の各々について、制御フローモジュール34は、該当するレジュームカウンタ値がプログラムカウンタ値に等しい場合、該当するレジュームカウンタ値に関連付けられた複数のスレッドの該当する1つをアクティブ化する(134)。
[0173] 図10は、本開示による、レジュームチェック動作を実施するための別の例示的な技法を示す流れ図である。制御フローモジュール34が非アクティブスレッドを選択する(136)。制御フローモジュール34は、非アクティブスレッドのためのレジュームカウンタ値がプログラムカウンタ値に等しいかどうかを判断する(138)。制御フローモジュール34が、非アクティブスレッドのためのレジュームカウンタ値がプログラムカウンタ値に等しいと判断した場合、制御フローモジュール34は、対応するスレッドが現在アクティブであることを示すために、スレッドに関連付けられたアクティブフラグを真の値にセットし(140)、スレッドに関連付けられたレジュームカウンタを最大値にセットし(142)、決定ボックス144に進む。最大値は、いくつかの例で、レジュームカウンタのためのストレージスロットまたはレジスタ中で表され得る最も大きい値である値であり得る。
[0174] 一方、制御フローモジュール34が、非アクティブスレッドのためのレジュームカウンタ値がプログラムカウンタ値に等しくないと判断した場合、制御フローモジュール34は、スレッドのためのアクティブフラグをセットすることなしに、およびスレッドのためのレジュームカウンタをセットすることなしに決定ボックス144に進む。いずれの場合も、制御フローモジュール34は、処理すべきそれ以上の非アクティブスレッドがあるかどうかを判断する(144)。制御フローモジュール34が、処理すべきそれ以上の非アクティブスレッドがあると判断した場合、制御フローモジュール34は、別の非アクティブスレッドを処理するためにプロセスボックス136に戻る。そうではなく、制御フローモジュール34が、処理すべきそれ以上の非アクティブスレッドがないと判断した場合、制御フローモジュール34はレジュームチェック動作を終了する。図10は、スレッドを連続的に処理し再アクティブ化する例示的なレジュームチェック動作を示しているが、他の例で、スレッドは、部分的に並列にまたは完全に並列に処理され再アクティブ化され得る。
[0175] 図11および図12は、本開示による、レジュームチェック動作を選択的にアクティブ化するコンパイルドコードを生成するための例示的な命令処理技法を示す流れ図である。コンパイルドコードは、該当する命令についてレジュームチェック動作が実施されるべきであるかどうかをそれぞれ指定する1つまたは複数の命令を含み得る。説明を簡単にするために、それらの技法について、図6に示されたコンピューティングシステム100のプロセッサ102(例えば、コンパイラモジュール110)に関して説明するが、それらの技法は、同じまたは異なるコンピューティングシステムにおいて他の構成要素によって実施され得ることを理解されたい。
[0176] 図11は、本開示による、レジュームチェック動作を選択的に有効および無効にするコンパイルドコードを生成するための例示的な技法を示す流れ図である。プロセッサ102が、プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとしてプログラムの1つまたは複数の命令を選択する(146)。プロセッサ102は、選択された1つまたは複数の命令に基づいてプログラムのためのコンパイルドコードを生成する(148)。例えば、プロセッサ102は、プログラムのためのコンパイルドコードが選択された1つまたは複数の命令を含むように、および選択された1つまたは複数の命令が、選択された1つまたは複数の命令についてレジュームチェック動作が実施されるべきであることを示す情報を含むように、コンパイルドコードを生成し得る。
[0177] いくつかの例で、プロセッサ102は、命令が、分岐命令またはジャンプ命令のうちの少なくとも1つの後の1つまたは複数の非アクティブ化されたスレッドによって実行されるべき候補次命令である場合、プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして命令を選択し得る。さらなる例で、プロセッサ102は、命令が順方向分岐命令および順方向ジャンプ命令のうちの少なくとも1つのターゲット命令である場合、プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして命令を選択し得る。追加の例で、プロセッサ102は、命令が逆方向分岐命令の後の次連続命令である場合、プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして命令を選択し得る。
[0178] プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとしてプログラムの1つまたは複数の命令を選択することに加えてまたはその代わりに、プロセッサ102は、プログラムが実行されるときにレジュームチェック動作が実施されるべきでない命令であるものとして1つまたは複数の命令を選択し、プログラムのためのコンパイルドコードが選択された1つまたは複数の命令を含むように、および選択された1つまたは複数の命令が、選択された1つまたは複数の命令についてレジュームチェック動作が実施されるべきでないことを示す情報を含むように、コンパイルドコードを生成し得る。
[0179] 図12は、本開示による、レジュームチェック動作を選択的に有効および無効にするコンパイルドコードを生成するための別の例示的な技法を示す流れ図である。プロセッサ102が、プログラムのためのソースコードに基づいてプログラムのための予備コンパイルドコードを生成する(150)。いくつかの例で、予備コンパイルドコードは、予備コンパイルドコード中の命令が、そのような命令についてレジュームチェック動作が実施されるべきであるかどうかを示さないことを除いて、プロセッサ102によって生成される最終コンパイルドコードと同様であり得る。
[0180] プロセッサ102は、予備コンパイルドコード中のどの命令が制御フロー命令であるかを判断する(152)。制御フロー命令は、例えば、ジャンプ命令と条件付き分岐命令とを含み得る。プロセッサ102は、処理のために制御フロー命令を選択する(154)。プロセッサ102は、選択された制御フロー命令が、処理システム10に、命令を処理することに応答して1つまたは複数のスレッドを非アクティブ化させることが可能である命令であるかどうかを判断する(156)。いくつかの例で、処理システム10に、命令を処理することに応答して1つまたは複数のスレッドを非アクティブ化させることが可能である命令のセットは、順方向分岐命令と、逆方向分岐命令と、順方向ジャンプ命令とを含む。さらなる例で、上記ですでに説明した命令に加えて、処理システム10に、命令を処理することに応答して1つまたは複数のスレッドを非アクティブ化させることが可能である命令のセットは逆方向ジャンプ命令をも含み得る。
[0181] 選択された制御フロー命令が、処理システム10に、命令を処理することに応答して1つまたは複数のスレッドを非アクティブ化させることが可能である命令である場合、プロセッサ102は、レジュームチェック動作が実施されるべきである命令として候補次命令を選択する(158)。候補次命令は、現在制御フロー命令を処理することに応答して非アクティブ化されたスレッドが、再アクティブ化されるようにスケジュールされるであろう命令を指すことがある。例えば、命令が順方向ジャンプ命令または順方向分岐命令である場合、候補次命令は、順方向ジャンプ命令または順方向分岐命令中で指定されたターゲット命令であり得る。別の例として、命令が逆方向分岐命令である場合、候補次命令は逆方向分岐命令の後の次連続命令(すなわち、逆方向分岐命令の直後に行われる命令)であり得る。逆方向ジャンプ命令が、処理システム10に、命令を処理することに応答して1つまたは複数のスレッドを非アクティブ化させることが可能である命令を構成する例で、逆方向ジャンプ命令のための候補次命令は、逆方向分岐命令の後の次連続命令(すなわち、逆方向ジャンプ命令の直後に行われる命令)であり得る。レジュームチェック動作が実施されるべきである命令として候補次命令を選択した後に、プロセッサ102は、コンパイルドコードを生成するときに使用するために選択をロギングし、決定ボックス160に進み得る。
[0182] 決定ボックス156に戻ると、選択された制御フロー命令が、処理システム10に、命令を処理することに応答して1つまたは複数のスレッドを非アクティブ化させることが可能でない命令である場合、プロセッサ102は、レジュームチェック動作が実施されるべきである命令であるものとして制御フロー命令のための命令を選択することなしに、決定ボックス158に進み得る。いずれの場合も、プロセッサ102は、処理すべきそれ以上の制御フロー命令があるかどうかを判断する(160)。プロセッサ102が、処理すべきそれ以上の制御フロー命令があると判断した場合、プロセッサ102は、別の制御フロー命令を処理するためにプロセスボックス154に戻る。そうではなく、プロセッサ102が、処理すべきそれ以上の制御フロー命令がないと判断した場合、プロセッサ102は、続いて、レジュームチェックが実施されるべきである命令であるものとして選択された命令に基づいてコンパイルドコードを生成する(162)。
[0183] 例えば、レジュームチェックが実施されるべきである命令であるように選択された命令の各々について、プロセッサ102は、プログラムを実行するプロセッサによっておよび命令が実行される命令サイクル中にレジュームチェック動作が実施されるべきであることを示す情報をコンパイルされた命令中に配置し得る。レジュームチェックが実施されるべきである命令であるように選択されなかった命令の各々について、プロセッサ102は、プログラムを実行するプロセッサによっておよび命令が実行される命令サイクル中にレジュームチェック動作が実施されるべきでないことを示す情報をコンパイルされた命令中に配置し得る。
[0184] 図13は、本開示の選択的レジュームチェックアクティブ化技法を使用せずに実行され得る例示的なプログラムを示す図である。図13に示されているように、左列の数字は命令識別(ID)番号を表す。各命令の命令ID番号は、いくつかの例で、命令に関連付けられたプログラムカウンタ値および/またはアドレスに対応し得る。中間列は、左列中の命令IDに関連付けられた命令を表す。右列は命令の説明を与える。
[0185] 「alu」から始まる表示を有する命令は連続(すなわち、非制御フロー)ALU命令を表す。「alu」表示に続く数字は、単に、ALU命令が異なる命令であり得ることを表す。「branch」命令として表示された命令は、「branch」表示の後に指定されたターゲット命令(例えば、ターゲット命令ID)をもつ条件付き分岐命令を構成する。同様に、「jump」命令として表示された命令は、「jump」表示の後に指定されたターゲット命令(例えば、ターゲット命令ID)をもつジャンプ命令(すなわち、無条件分岐命令)を構成する。
[0186] 図13に示されているように、命令2は、ターゲット命令として命令5を指定する順方向分岐命令である。命令4は、ターゲット命令として命令7を指定する順方向ジャンプ命令である。命令8は、ターゲット命令として命令1を指定する逆方向分岐命令である。
[0187] 図14は、図13中の例示的なプログラムのための例示的な実行シーケンスを示す表である。処理システム中で実行している2つの異なるスレッド(すなわち、スレッド0およびスレッド1)に関する実行シーケンスが示されている。処理システムは、システムが4つの処理要素14の代わりに2つの処理要素14を有し得る(または同等に、処理要素14のうちの2つがプログラムの持続時間の間永続的に非アクティブ化され得る)ことを除いて、図1に示された処理システム10と同様であり得る。さらに、この例の処理システムは、命令を実行するより前にあらゆる命令サイクル中にレジュームチェック動作を自動的に実施する。スレッド0およびスレッド1は、処理要素14の該当する1つ上で実行するようにそれぞれ割り当てられ得る。両方のスレッドは、ロックステップでプログラムの命令を実行し得る。すなわち、所与の命令サイクル中に、各スレッドは、アクティブである場合、異なるデータに関してプログラムの同じ命令を実行し得る。
[0188] 図14中の行の各々は、テーブルの上部の最も早い命令処理サイクルから開始する単一の命令処理サイクルを構成する。「命令ID」列は、所与の命令処理サイクル中に実行および/または処理される命令を示す。「スレッド0」列は、所与の命令処理サイクルについてスレッド0がアクティブであるかどうかを示し、「スレッド1」列は、所与の命令処理サイクルについてスレッド1がアクティブであるかどうかを示す。「スレッド0」列または「スレッド1」列中の「X」表示は、所与の命令処理サイクルについて該当するスレッドがアクティブであることを示す。「スレッド0」列または「スレッド1」列中の「O」表示は、所与の命令処理サイクルについて該当するスレッドが非アクティブであることを示す。
[0189] 図14に示されているように、スレッドの両方(すなわち、スレッド0およびスレッド1)が、初めはアクティブであり、連続命令である命令0および1を処理する間アクティブのままである。順方向分岐命令である命令2を処理するとき、スレッド1は分岐条件を満たし、スレッド0は分岐条件を満たさない。従って、「最小値アドレス第1」スレッド処理順序に従って、制御ユニット12は、スレッド1を非アクティブ化し、スレッド1が命令5において再アクティブ化されるようにスケジュールされたことを示すために、スレッド1のためのレジュームカウンタを値5(すなわち、ターゲット命令のアドレス)にセットする。制御ユニット12は、続いてアクティブスレッド0に関して命令3および4を処理する。
[0190] 順方向ジャンプ命令である命令4において、制御ユニット12は、アクティブであるすべてのスレッドを非アクティブ化する。特に、制御ユニット12は、スレッド0を非アクティブ化し、スレッド0が命令7において再アクティブ化されるようにスケジュールされたことを示すために、スレッド0のためのレジュームカウンタを値7(すなわち、ターゲット命令のアドレス)にセットする。制御ユニット12は、続いて、非アクティブスレッドのためのレジュームカウンタ値の最初の値が到達されるか、あるいはジャンプ命令のためのターゲットプログラムカウンタ値が到達されるまで、プログラムカウンタ値を連続的に増分する。
[0191] 上記で説明したように、レジュームチェック動作は、この例で、あらゆる命令中に命令を処理するより前に実施される。命令3および4において、スレッド1のためのレジュームカウンタ値(すなわち、「5」)は、それらの命令のためのプログラムカウンタ値(すなわち、それぞれ「3」および「4」)に等しくなかった。従って、スレッド1は、これらの命令を処理する間、非アクティブ化されたままであった。しかしながら、命令5において、スレッド1のためのレジュームカウンタ値(すなわち、「5」)は命令5のためのプログラムカウンタ値に等しい。従って、制御ユニット12は、命令5を実行するより前にスレッド1を再アクティブ化する。再アクティブ化プロセスの一部として、制御ユニット12は、スレッド1のためのレジュームカウンタをデフォルト値(例えば、最大レジスタ値)にセットし得る。一方、スレッド0は、スレッド0のためのレジュームカウンタ値が7に等しいので、非アクティブのままである。
[0192] 制御ユニット12は、続いてアクティブスレッド1に関して命令5および6を処理する。命令7において、スレッド0は、スレッド0のためのレジュームカウンタ値(すなわち、「7」)が命令7のためのプログラムカウンタ値に等しいので、レジュームチェック動作の一部として再アクティブ化される。制御ユニット12は、続いて両方のスレッドに関して命令7を処理する。
[0193] 逆方向分岐命令である命令8において、スレッド0は分岐条件を満たし、スレッド1は分岐条件を満たさない。従って、「最小値アドレス第1」スレッド処理順序に従って、制御ユニット12は、スレッド1を非アクティブ化し、スレッド1が命令9において再アクティブ化されるべきであることを示すために、スレッド1のためのレジュームカウンタを値9(すなわち、逆方向分岐命令の後の次連続命令)にセットする。制御ユニット12は、続いてアクティブスレッド0に関して命令1〜4を処理する。命令2において、スレッド0は分岐条件を満たさず、従って制御フローは命令3に進む。
[0194] 順方向ジャンプ命令である命令4において、制御ユニット12は、アクティブであるすべてのスレッドを非アクティブ化する。特に、制御ユニット12は、スレッド0を非アクティブ化し、スレッド0が命令7において再アクティブ化されるべきであることを示すために、スレッド0のためのレジュームカウンタを値7(すなわち、ターゲット命令のアドレス)にセットする。制御ユニット12は、続いて、非アクティブスレッドのためのレジュームカウンタ値の最初の値が到達されるか、あるいはジャンプ命令のためのターゲットプログラムカウンタ値が到達されるまで、プログラムカウンタ値を連続的に増分する。
[0195] 命令5および6が処理されるが、それらは、スレッドがアクティブ化されないので、ドーマント命令サイクルである。命令7において、スレッド0は、スレッド0のためのレジュームカウンタ値(すなわち、「7」)が命令7のためのプログラムカウンタ値に等しいので、レジュームチェック動作の一部として再アクティブ化される。制御ユニット12は、続いてアクティブスレッド0に関して命令7および8を処理する。
[0196] 命令9において、スレッド1は、スレッド0のためのレジュームカウンタ値(すなわち、「9」)が命令9のためのプログラムカウンタ値に等しいので、レジュームチェック動作の一部として再アクティブ化される。制御ユニット12は、続いて両方のスレッドに関して命令9を処理し、これはプログラムの終了である。
[0197] 上記で説明したように、スレッド0は、命令4を実行した後に2回非アクティブ化され、そのたびごとに、命令7を実行するより前に再アクティブ化される。スレッド1は、命令2および8を実行した後に非アクティブ化され、命令5および9を実行するより前に再アクティブ化される。スレッドは、ダイバージェント分岐命令または順方向ジャンプ命令のいずれかにより非アクティブ化される。制御ユニット12があらゆる命令を実行するより前にレジュームチェックを実施するので、この例で、制御ユニット12は、スレッドが4つの命令サイクル中にのみ再アクティブ化されたにもかかわらず、18個の異なるレジュームチェック動作を実施する。
[0198] 図15は、本開示の選択的レジュームチェックアクティブ化技法を使用して実行され得る例示的なプログラムを示す。例示的なプログラムは、いくつかのプログラム命令についてレジュームチェック動作が実施されるべきであることを示すアスタリスク(すなわち、「*」)がそのような命令中に含まれることを除いて、図13に示された例示的なプログラムと同様である。アスタリスクを含まない命令は、そのような命令についてレジュームチェックが実施されないことを示す。
[0199] 図15に示されているように、コンパイラは、レジュームチェック動作が実施されるべきである命令であるものとして命令5、7および9を選択し得る。命令5は、その命令が順方向分岐命令(すなわち、命令2)のターゲット命令であるので、レジュームチェック動作が実施されるべきである命令として選択された。命令7は、その命令が順方向ジャンプ命令(すなわち、命令4)のターゲット命令であるので、レジュームチェック動作が実施されるべきである命令として選択された。命令9は、その命令が逆方向分岐命令(すなわち、命令8)の後の次連続命令であるので、レジュームチェック動作が実施されるべきである命令として選択された。
[0200] 図16は、本開示による、図15中の例示的なプログラムのための例示的な実行シーケンスを示す表である。例示的な実行シーケンスは図16であり、あらゆる命令サイクル中にレジュームチェック動作が実施されるとは限らないことを除いて、図14に関して上記で説明したものと同様である。代わりに、レジュームチェック動作は、図15において命令がアスタリスクでマークされた命令サイクル(すなわち、命令5、7および9)についてのみ実施される。
[0201] 図16に示されているように、図16の例示的な実行シーケンス中に実施されるレジュームチェック動作の数は5である。従って、本開示の技法に従ってレジュームチェック動作を選択的にアクティブ化することによって、この例において実施されるレジュームチェック動作の数は、(図14において行われた)18個の異なる命令サイクル中に実施される18個の動作から、5つの命令サイクル中に実施される5つの動作に低減された。レジュームチェック動作は、いくつかの例で、動作が実施されるたびにかなりの電力量を消費し得、命令を処理するのにかかる時間に著しく寄与し得る、多くの比較演算の性能に関与し得る。従って、本開示の選択的レジュームチェックアクティブ化技法に従って、処理システムによって実施される必要があるレジュームチェック動作の数を低減することによって、プログラムの各命令についてレジュームチェック動作が自動的に実施される処理システムと比較して、処理システムの電力消費が低減され得、および/または処理システムの性能が高められ得る。
[0202] その上、レジュームチェック動作は、スレッドがプログラムの実行中に再アクティブ化される必要がないであろうと判断された命令について無効にされたので、レジュームチェック動作の選択的無効化は、処理システムにおけるスレッド再アクティブ化の完全性を損なわなかったか、またはプログラムを実行するために必要な処理サイクルの数を増加させなかった。このようにして、本開示の技法は、いくつかの例で、スレッド再アクティブ化プロセスの完全性に悪影響を及ぼすことなしに、およびプログラムを実行するために必要な処理サイクルの数を増加させることなしに、処理システムの電力消費を低減し、および/またはそれの性能を高めるために使用され得る。
[0203] 本開示で説明した技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。例えば、説明した技法の様々な態様は、1つまたは複数のマイクロプロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、あるいは他の等価な集積回路またはディスクリート論理回路を含む、1つまたは複数のプロセッサ、ならびにそのような構成要素の任意の組合せ内で実装され得る。「プロセッサ」または「処理回路」という用語は、概して、単独で、あるいは他の論理回路、または処理を実施する個別ハードウェアなどの他の等価回路との組合せで上記の論理回路のいずれかを指すことがある。
[0204] そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明した様々な動作および機能をサポートするために、同じデバイス内で、または別々のデバイス内で実装され得る。さらに、説明したユニット、モジュールまたは構成要素のいずれも、個別であるが相互運用可能な論理デバイスとして、一緒にまたは別々に実装され得る。モジュールまたはユニットとしての様々な機能の図は、様々な機能的態様を強調するものであり、そのようなモジュールまたはユニットが別々のハードウェアまたはソフトウェア構成要素によって実現されなければならないことを必ずしも暗示するとは限らない。そうではなく、1つまたは複数のモジュールあるいはユニットに関連付けられた機能は、別々のハードウェア、ファームウェア、および/またはソフトウェア構成要素によって実施されるか、あるいは共通または別々のハードウェアもしくはソフトウェア構成要素内に組み込まれることがある。
[0205] また、本開示で説明した技法は、命令を記憶するコンピュータ可読記憶媒体などのコンピュータ可読媒体中に記憶、実施または符号化され得る。コンピュータ可読媒体中に埋め込まれたまたは符号化された命令は、例えば、その命令が1つまたは複数のプロセッサによって実行されたとき、1つまたは複数のプロセッサに本明細書で説明した技法を実施させ得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、プログラマブル読取り専用メモリ(PROM)、消去可能プログラマブル読取り専用メモリ(EPROM)、電子的に消去可能なプログラマブル読取り専用メモリ(EEPROM)、フラッシュメモリ、ハードディスク、CD−ROM、フロッピー(登録商標)ディスク、カセット、磁気媒体、光媒体、または有形である他のコンピュータ可読記憶媒体を含み得る。
[0206] コンピュータ可読媒体は、上記に記載した有形記憶媒体などの有形記憶媒体に対応するコンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、例えば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を可能にする任意の媒体を含む通信媒体を備え得る。このようにして、「コンピュータ可読媒体」という句は、概して、(1)非一時的である有形コンピュータ可読記憶媒体、および(2)一時的な信号または搬送波などの非有形コンピュータ可読通信媒体に対応し得る。
[0207] 様々な態様および例について説明した。しかしながら、以下の特許請求の範囲から逸脱することなく本開示の構造または技法に変更を行うことができる。