(57)【要約】  本開示は、ダイバージェントスレッド条件を受ける単一命令複数データ（ＳＩＭＤ）処理システムにおいてサブルーチンを実行するための技法を対象とする。より詳細には、制御フロー命令の効率的な処理のためにプログラムモジュール固有の最小レジュームカウンタ（ＭＩＮＲＣ）を利用する、ダイバージェントスレッド状態を管理するためのレジュームカウンタベースの手法について説明する。いくつかの例では、本開示の技法は、メインプログラムモジュールの実行を制御するためにメインプログラムＭＩＮＲＣを使用することと、サブルーチンプログラムモジュールの実行を制御するためにサブルーチン固有ＭＩＮＲＣを使用することとを含み得る。また、サブルーチン呼出しおよび復帰命令が実行されたときにメインプログラムＭＩＮＲＣとサブルーチン固有ＭＩＮＲＣとを管理するための技法について説明する。また、サブルーチン固有ＭＩＮＲＣのための更新されたＭＩＮＲＣ値が、サブルーチンのために割り当てられたプログラム空間内にあることを保証するように、サブルーチン固有ＭＩＮＲＣを更新するための技法について説明する。
2015531945.tif 000002
【特許請求の範囲】
【請求項１】
１つまたは複数のプロセッサを用いて、第１の最小レジュームカウンタ（ＭＩＮＲＣ）に基づいてプログラムの実行を制御することと、ここで、前記第１のＭＩＮＲＣは、前記プログラムのための複数の実行スレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定する、
前記１つまたは複数のプロセッサを用いて、前記プログラムのサブルーチンに関連する第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御することと、ここで、前記第２のＭＩＮＲＣは、前記サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する前記複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定する、
を備える方法。
【請求項２】
サブルーチン呼出し命令を実行したことに応答して、前記第１のＭＩＮＲＣの状態を保存することと、
前記サブルーチン呼出し命令を実行したことに応答して、前記第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御させることと
をさらに備える、請求項１に記載の方法。
【請求項３】
前記第１のＭＩＮＲＣの前記状態を保存することが、前記第１のＭＩＮＲＣのためのＭＩＮＲＣレジスタに記憶された値をスタック記憶構造上にプッシュすることを含み、
前記第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御させることが、前記ＭＩＮＲＣレジスタに記憶された前記値を前記第２のＭＩＮＲＣの初期値で上書きすることを含む、
請求項２に記載の方法。
【請求項４】
サブルーチン復帰命令を実行したことに応答して、前記第１のＭＩＮＲＣの保存された状態に基づいて前記プログラムの実行を制御させること
をさらに備える、請求項２に記載の方法。
【請求項５】
前記第１のＭＩＮＲＣの前記保存された状態に基づいて前記プログラムの実行を制御させることが、
スタック記憶構造から前記第１のＭＩＮＲＣの前記保存された状態をポップすることと、
前記ＭＩＮＲＣレジスタに記憶された値を前記第１のＭＩＮＲＣの前記保存された状態に対応する値で上書きすることと
を含む、請求項４に記載の方法。
【請求項６】
前記レジュームカウンタ値の各々は、前記それぞれのレジュームカウンタ値に対応する前記スレッドの各々が非アクティブである場合、前記スレッドの前記各々がアクティブ化されるようにスケジュールされたプログラムカウンタ値を示す、請求項１に記載の方法。
【請求項７】
前記それぞれのレジュームカウンタ値に対応する前記スレッドの前記各々がアクティブである場合、前記レジュームカウンタ値の各々がデフォルト値に等しい、請求項６に記載の方法。
【請求項８】
前記複数のレジュームカウンタ値の前記サブセットからの前記最も小さいレジュームカウンタ値を示す値に前記第２のＭＩＮＲＣを設定すること
をさらに備える、請求項１に記載の方法。
【請求項９】
前記第２のＭＩＮＲＣを設定することは、
各非アクティブスレッドについて、前記それぞれの非アクティブスレッドのレジュームカウンタ値が前記第２のＭＩＮＲＣよりも小さく、前記それぞれの非アクティブスレッドの前記レジュームカウンタ値が前記サブルーチンの第１の命令を示す値よりも大きいかまたはそれに等しい場合に、前記第２のＭＩＮＲＣを前記それぞれの非アクティブスレッドの前記レジュームカウンタ値に等しく設定すること
を含む、請求項８に記載の方法。
【請求項１０】
前記第２のＭＩＮＲＣを設定することは、
各非アクティブスレッドについて、前記それぞれの非アクティブスレッドのレジュームカウンタ値が前記第２のＭＩＮＲＣ値よりも小さく、前記それぞれの非アクティブスレッドに関連するフラグが、前記サブルーチンの実行が開始されたときに前記非アクティブスレッドがアクティブであったことを示す場合に、前記第２のＭＩＮＲＣを前記それぞれの非アクティブスレッドの前記レジュームカウンタ値に等しく設定すること
を含む、請求項８に記載の方法。
【請求項１１】
前記スレッドの各々について、前記サブルーチンの実行を開始したことに応答して、前記サブルーチンの実行が開始されたときに前記スレッドがアクティブである場合に、前記それぞれのスレッドに対応するフラグをアクティブステータスに設定することと、
前記スレッドの各々について、前記サブルーチンの実行を開始したことに応答して、前記サブルーチンの実行が開始されたときに前記スレッドがアクティブでない場合に、前記それぞれのスレッドに対応する前記フラグを非アクティブステータスに設定することと
をさらに備える、請求項１０に記載の方法。
【請求項１２】
第１の最小レジュームカウンタ（ＭＩＮＲＣ）に基づいてプログラムの実行を制御し、前記プログラムのサブルーチンに関連する第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御するように構成された１つまたは複数のプロセッサを備え、前記第１のＭＩＮＲＣが、前記プログラムのための複数の実行スレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定し、前記第２のＭＩＮＲＣが、前記サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する前記複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定する、
デバイス。
【請求項１３】
前記１つまたは複数のプロセッサが、サブルーチン呼出し命令を実行したことに応答して、前記第１のＭＩＮＲＣの状態を保存することと、前記サブルーチン呼出し命令を実行したことに応答して、前記第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御させることとを行うようにさらに構成された、請求項１２に記載のデバイス。
【請求項１４】
前記１つまたは複数のプロセッサが、前記第１のＭＩＮＲＣのためのＭＩＮＲＣレジスタに記憶された値をスタック記憶構造上にプッシュすることと、前記ＭＩＮＲＣレジスタに記憶された前記値を前記第２のＭＩＮＲＣの初期値で上書きすることとを行うようにさらに構成された、請求項１３に記載のデバイス。
【請求項１５】
前記１つまたは複数のプロセッサが、サブルーチン復帰命令を実行したことに応答して、前記第１のＭＩＮＲＣの保存された状態に基づいて前記プログラムの実行を制御させるようにさらに構成された、請求項１３に記載のデバイス。
【請求項１６】
前記１つまたは複数のプロセッサが、スタック記憶構造から前記第１のＭＩＮＲＣの前記保存された状態をポップすることと、前記ＭＩＮＲＣレジスタに記憶された値を前記第１のＭＩＮＲＣの前記保存された状態に対応する値で上書きすることとを行うようにさらに構成された、請求項１５に記載のデバイス。
【請求項１７】
前記レジュームカウンタ値の各々は、前記それぞれのレジュームカウンタ値に対応する前記スレッドの各々が非アクティブである場合、前記スレッドの前記各々がアクティブ化されるようにスケジュールされたプログラムカウンタ値を示す、請求項１２に記載のデバイス。
【請求項１８】
前記それぞれのレジュームカウンタ値に対応する前記スレッドの前記各々がアクティブである場合、前記レジュームカウンタ値の各々がデフォルト値に等しい、請求項１７に記載のデバイス。
【請求項１９】
前記１つまたは複数のプロセッサが、前記複数のレジュームカウンタ値の前記サブセットからの前記最も小さいレジュームカウンタ値を示す値に前記第２のＭＩＮＲＣを設定するようにさらに構成された、請求項１２に記載のデバイス。
【請求項２０】
前記１つまたは複数のプロセッサは、各非アクティブスレッドについて、前記それぞれの非アクティブスレッドのレジュームカウンタ値が前記第２のＭＩＮＲＣよりも小さく、前記それぞれの非アクティブスレッドの前記レジュームカウンタ値が、前記サブルーチンの第１の命令を示す値よりも大きいかまたはそれに等しい場合、前記第２のＭＩＮＲＣを前記それぞれの非アクティブスレッドの前記レジュームカウンタ値に等しく設定するようにさらに構成された、請求項１９に記載のデバイス。
【請求項２１】
前記１つまたは複数のプロセッサは、各非アクティブスレッドについて、前記それぞれの非アクティブスレッドのレジュームカウンタ値が前記第２のＭＩＮＲＣ値よりも小さく、前記それぞれの非アクティブスレッドに関連するフラグが、前記サブルーチンの実行が開始されたときに前記非アクティブスレッドがアクティブであったことを示す場合、前記第２のＭＩＮＲＣを前記それぞれの非アクティブスレッドの前記レジュームカウンタ値に等しく設定するようにさらに構成された、請求項１９に記載のデバイス。
【請求項２２】
前記１つまたは複数のプロセッサは、前記スレッドの各々について、前記サブルーチンの実行を開始したことに応答して、前記サブルーチンの実行が開始されたときに前記スレッドがアクティブである場合に、前記それぞれのスレッドに対応するフラグをアクティブステータスに設定することと、前記スレッドの各々について、前記サブルーチンの実行を開始したことに応答して、前記サブルーチンの実行が開始されたときに前記スレッドがアクティブでない場合に、前記それぞれのスレッドに対応する前記フラグを非アクティブステータスに設定することとを行うようにさらに構成された、請求項２１に記載のデバイス。
【請求項２３】
前記デバイスがワイヤレス通信デバイスを含む、請求項１２に記載のデバイス。
【請求項２４】
前記デバイスがモバイルフォンハンドセットを含む、請求項１２に記載のデバイス。
【請求項２５】
第１の最小レジュームカウンタ（ＭＩＮＲＣ）に基づいてプログラムの実行を制御するための手段と、ここで、前記第１のＭＩＮＲＣは、前記プログラムのための複数の実行スレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定する、
前記プログラムのサブルーチンに関連する第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御するための手段と、ここで、前記第２のＭＩＮＲＣは、前記サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する前記複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定する、
を備える、装置。
【請求項２６】
サブルーチン呼出し命令を実行したことに応答して、前記第１のＭＩＮＲＣの状態を保存するための手段と、
前記サブルーチン呼出し命令を実行したことに応答して、前記第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御させるための手段と
をさらに備える、請求項２５に記載の装置。
【請求項２７】
前記第１のＭＩＮＲＣの前記状態を保存するための前記手段が、前記第１のＭＩＮＲＣのためのＭＩＮＲＣレジスタに記憶された値をスタック記憶構造上にプッシュするための手段を含み、
前記サブルーチン呼出し命令を実行したことに応答して、前記第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御させるための前記手段が、前記ＭＩＮＲＣレジスタに記憶された前記値を前記第２のＭＩＮＲＣの初期値で上書きするための手段を含む、
請求項２６に記載の装置。
【請求項２８】
サブルーチン復帰命令を実行したことに応答して、前記第１のＭＩＮＲＣの保存された状態に基づいて前記プログラムの実行を制御させるための手段
をさらに備える、請求項２６に記載の装置。
【請求項２９】
サブルーチン復帰命令を実行したことに応答して、前記第１のＭＩＮＲＣの前記保存された状態に基づいて前記プログラムの実行を制御させるための前記手段が、
スタック記憶構造から前記第１のＭＩＮＲＣの前記保存された状態をポップするための手段と、
前記ＭＩＮＲＣレジスタに記憶された値を前記第１のＭＩＮＲＣの前記保存された状態に対応する値で上書きするための手段と
を含む、請求項２８に記載の装置。
【請求項３０】
前記レジュームカウンタ値の各々は、前記それぞれのレジュームカウンタ値に対応する前記スレッドの各々が非アクティブである場合、前記スレッドの前記各々がアクティブ化されるようにスケジュールされたプログラムカウンタ値を示す、請求項２５に記載の装置。
【請求項３１】
前記それぞれのレジュームカウンタ値に対応する前記スレッドの前記各々がアクティブである場合、前記レジュームカウンタ値の各々がデフォルト値に等しい、請求項３０に記載の装置。
【請求項３２】
前記複数のレジュームカウンタ値の前記サブセットからの最も小さいレジュームカウンタ値を示す値に前記第２のＭＩＮＲＣを設定するための手段
をさらに備える、請求項２５に記載の装置。
【請求項３３】
実行されたとき、１つまたは複数のプロセッサに、
第１の最小レジュームカウンタ（ＭＩＮＲＣ）に基づいてプログラムの実行を制御することと、ここで、前記第１のＭＩＮＲＣは、前記プログラムのための複数の実行スレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定する、
前記プログラムのサブルーチンに関連する第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御することと、ここで、前記第２のＭＩＮＲＣは、前記サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する前記複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定する、
を行わせる命令を記憶したコンピュータ可読記憶媒体。
【請求項３４】
実行されたとき、１つまたは複数のプロセッサに、
サブルーチン呼出し命令を実行したことに応答して、前記第１のＭＩＮＲＣの状態を保存することと、
前記サブルーチン呼出し命令を実行したことに応答して、前記第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御させることと
を行わせる命令をさらに備える、請求項３３に記載のコンピュータ可読記憶媒体。
【請求項３５】
前記第１のＭＩＮＲＣの前記状態を保存することを前記１つまたは複数のプロセッサに行わせる前記命令が、前記第１のＭＩＮＲＣのためのＭＩＮＲＣレジスタに記憶された値をスタック記憶構造上にプッシュすることを前記１つまたは複数のプロセッサに行わせる命令を含み、
前記サブルーチン呼出し命令を実行したことに応答して、前記第２のＭＩＮＲＣに基づいて前記サブルーチンの実行を制御させることを前記１つまたは複数のプロセッサに行わせる前記命令が、前記ＭＩＮＲＣレジスタに記憶された前記値を前記第２のＭＩＮＲＣの初期値で上書きすることを前記１つまたは複数のプロセッサに行わせる命令を含む、
請求項３４に記載のコンピュータ可読記憶媒体。
【請求項３６】
実行されたとき、１つまたは複数のプロセッサに、
サブルーチン復帰命令を実行したことに応答して、前記第１のＭＩＮＲＣの保存された状態に基づいて前記プログラムの実行を制御させること
を行わせる命令をさらに備える、請求項３４に記載のコンピュータ可読記憶媒体。
【請求項３７】
サブルーチン復帰命令を実行したことに応答して、前記第１のＭＩＮＲＣの前記保存された状態に基づいて前記プログラムの実行を制御させることを前記１つまたは複数のプロセッサに行わせる前記命令が、
スタック記憶構造から前記第１のＭＩＮＲＣの前記保存された状態をポップすることと、
前記ＭＩＮＲＣレジスタに記憶された値を前記第１のＭＩＮＲＣの前記保存された状態に対応する値で上書きすることと
を前記１つまたは複数のプロセッサに行わせる命令を含む、請求項３６に記載のコンピュータ可読記憶媒体。
【請求項３８】
前記レジュームカウンタ値の各々は、前記それぞれのレジュームカウンタ値に対応する前記スレッドの各々が非アクティブである場合、前記スレッドの前記各々がアクティブ化されるようにスケジュールされたプログラムカウンタ値を示す、請求項３３に記載のコンピュータ可読記憶媒体。
【請求項３９】
前記それぞれのレジュームカウンタ値に対応する前記スレッドの前記各々がアクティブである場合、前記レジュームカウンタ値の各々がデフォルト値に等しい、請求項３８に記載のコンピュータ可読記憶媒体。
【請求項４０】
実行されたとき、１つまたは複数のプロセッサに、
前記複数のレジュームカウンタ値の前記サブセットからの最も小さいレジュームカウンタ値を示す値に前記第２のＭＩＮＲＣを設定すること
を行わせる命令をさらに備える、請求項３３に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本開示は、マルチスレッド（multi-threaded）処理に関し、より詳細には、マルチスレッド処理システムにおいてサブルーチンを実行するための技法に関する。
【背景技術】
【０００２】
[0002]単一命令複数データ（ＳＩＭＤ：single instruction, multiple data）処理システムは、複数のデータに対して同じ命令を実行する複数の処理要素を含む、１つのタイプの並列コンピューティングシステムである。ＳＩＭＤシステムは、スタンドアロンコンピュータ、またはコンピューティングシステムのサブシステムであり得る。たとえば、１つまたは複数のＳＩＭＤ実行ユニットが、プログラマブルシェーディングをサポートするプログラマブルシェーディングユニットを実装するためにグラフィックス処理ユニット（ＧＰＵ：graphics processing unit）中で使用され得る。
【０００３】
[0003]ＳＩＭＤ処理システムは、プログラムのための複数の実行スレッド（thread of execution）が並列に複数の処理要素上で同期的に実行することを可能にし、それによって、動作の同じセットが複数のデータに対して実施される必要があるプログラムのためのスループットを増加させる。各スレッドが異なるデータに対して動作するので、プログラムが条件付き分岐命令を含む場合、分岐条件が、システム中で実行しているスレッドのうちのいくつかについては満たされ、システム中で実行している他のスレッドについては満たされないことがあり得る。そのような条件は、ダイバージェント分岐条件（divergent branch condition）とも呼ばれ、ＳＩＭＤシステムが複数の処理要素上で同期的にスレッドのすべてを実行することが可能でなくなる。
【発明の概要】
【０００４】
[0004]本開示は、ダイバージェントスレッド条件を受ける単一命令複数データ（ＳＩＭＤ）処理システムにおいてサブルーチンを実行するための技法を対象とする。より詳細には、制御フロー命令の効率的な処理のためにプログラムモジュール固有の最小レジュームカウンタ（ＭＩＮＲＣ：minimum resume counter）を利用する、ダイバージェントスレッドを管理するためのレジュームカウンタベースの手法について説明する。本明細書で使用するプログラムモジュールは、メインプログラムモジュール（たとえば、トップレベルプログラムモジュール）またはサブルーチンプログラムモジュールを指し得る。したがって、処理システム中で実行される各サブルーチンは、サブルーチン中に含まれる制御フロー命令の処理を制御するためにサブルーチン固有ＭＩＮＲＣを使用し得る。プログラムモジュール固有ＭＩＮＲＣの使用は、ＭＩＮＲＣベースの制御フローを実装するシステムが、サブルーチンプログラム命令の実行をサポートすることを可能にする。
【０００５】
[0005]一例では、本開示では、１つまたは複数のプロセッサを用いて、第１のＭＩＮＲＣに基づいてプログラムの実行を制御することを含む方法について説明する。第１のＭＩＮＲＣは、プログラムのための複数の実行スレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定する。本方法は、１つまたは複数のプロセッサを用いて、サブルーチンに関連する第２のＭＩＮＲＣに基づいてプログラムのサブルーチンの実行を制御することをさらに含む。第２のＭＩＮＲＣは、サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定する。
【０００６】
[0006]別の例では、本開示では、第１のＭＩＮＲＣに基づいてプログラムの実行を制御することと、サブルーチンに関連する第２のＭＩＮＲＣに基づいてプログラムのサブルーチンの実行を制御することとを行うように構成された１つまたは複数のプロセッサを含むシステムについて説明する。第１のＭＩＮＲＣは、プログラムのための複数の実行スレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定する。第２のＭＩＮＲＣは、サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定する。
【０００７】
[0007]別の例では、本開示では、第１のＭＩＮＲＣに基づいてプログラムの実行を制御するための手段を含む装置について説明する。第１のＭＩＮＲＣは、プログラムのための複数の実行スレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定する。本装置は、サブルーチンに関連する第２のＭＩＮＲＣに基づいてプログラムのサブルーチンの実行を制御するための手段をさらに含む。第２のＭＩＮＲＣは、サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定する。
【０００８】
[0008]別の例では、本開示では、実行されたとき、１つまたは複数のプロセッサに、第１のＭＩＮＲＣに基づいてプログラムの実行を制御させる命令を記憶したコンピュータ可読記憶媒体について説明する。第１のＭＩＮＲＣは、プログラムのための複数の実行スレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定する。命令は、サブルーチンに関連する第２のＭＩＮＲＣに基づいてプログラムのサブルーチンの実行を制御することを１つまたは複数のプロセッサにさらに行わせる。第２のＭＩＮＲＣは、サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定する。
【０００９】
[0009]本開示の１つまたは複数の例の詳細を添付の図面および以下の説明に記載する。本開示の他の特徴、目的、および利点は、以下の説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【００１０】
【図１】[0010]本開示のサブルーチン実行技法を実装するために使用され得る例示的な処理システムを示すブロック図。
【図２】[0011]本開示による、図１の例示的な処理システム中の制御ユニットをより詳細に示すブロック図。
【図３】[0012]本開示のサブルーチン実行技法を実装するために使用され得る例示的な制御フローモジュールを示すブロック図。
【図４】[0013]本開示のサブルーチン実行技法のための例示的な制御フローを示す概念図。
【図５】[0014]本開示のサブルーチン実行技法のための別の例示的な制御フローを示す概念図。
【図６】[0015]本開示の技法による、例示的なプログラム空間構成を示す概念図。
【図７】[0016]本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図８】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図９】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１０】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１１】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１２】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１３】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１４】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１５】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１６】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１７】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１８】本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図。
【図１９】[0017]本開示のサブルーチン実行技法を実装するために使用され得る別の例示的な制御フローモジュールを示すブロック図。
【図２０】[0018]本開示による、図１９に示された制御フローモジュールの例示的な動作を特徴づける状態遷移図。
【図２１】[0019]本開示による、図１９に示された制御フローモジュールの例示的な動作を特徴づける状態遷移表。
【図２２】[0020]本開示のサブルーチン実行技法を実装するための例示的な擬似コード（pseudo-code）を示す図。
【図２３】本開示のサブルーチン実行技法を実装するための例示的な擬似コードを示す図。
【図２４】本開示のサブルーチン実行技法を実装するための例示的な擬似コードを示す図。
【図２５】本開示のサブルーチン実行技法を実装するための例示的な擬似コードを示す図。
【図２６】本開示のサブルーチン実行技法を実装するための例示的な擬似コードを示す図。
【図２７】本開示のサブルーチン実行技法を実装するための例示的な擬似コードを示す図。
【図２８】本開示のサブルーチン実行技法を実装するための例示的な擬似コードを示す図。
【図２９】[0021]本開示による、プログラムモジュール固有ＭＩＮＲＣに基づいて処理システムを制御するための例示的な技法を示す流れ図。
【図３０】[0022]本開示による、サブルーチン呼出し命令を実行するための例示的な技法を示す流れ図。
【図３１】[0023]本開示による、サブルーチン復帰命令を実行するための例示的な技法を示す流れ図。
【詳細な説明】
【００１１】
[0024]本開示は、ダイバージェントスレッド条件を受ける単一命令複数データ（ＳＩＭＤ）処理システムにおいてサブルーチンを実行するための技法を対象とする。より詳細には、制御フロー命令の効率的な処理のためにプログラムモジュール固有最小レジュームカウンタ（ＭＩＮＲＣ）を利用する、ダイバージェントスレッドを管理するためのレジュームカウンタベースの手法について説明する。本明細書で使用するプログラムモジュールは、メインプログラムモジュール（たとえば、トップレベルプログラムモジュール）またはサブルーチンプログラムモジュールを指し得る。したがって、処理システムにおいて実行される各サブルーチンは、そのサブルーチン中に含まれる制御フロー命令の処理を制御するためにサブルーチン固有ＭＩＮＲＣを使用し得る。プログラムモジュール固有ＭＩＮＲＣの使用は、ＭＩＮＲＣベースの制御フローを実装するシステムが、サブルーチンプログラム命令の実行をサポートすることを可能にする。
【００１２】
[0025]いくつかの例では、本開示の技法は、メインプログラムの実行を制御するためにメインプログラムＭＩＮＲＣを使用することと、メインプログラムによってまたは他のサブルーチンによって呼び出されるサブルーチンの実行を制御するためにサブルーチン固有ＭＩＮＲＣを使用することとを含み得る。メインプログラムＭＩＮＲＣ値は、通常はシステム中で実行されているすべてのスレッドである、メインプログラムの実行が開始されたときにアクティブであるすべてのスレッドに対応する１つまたは複数のレジュームカウンタ値のセットからの最も小さいレジュームカウンタ値を示し得る。同様に、各サブルーチン固有ＭＩＮＲＣは、それぞれのサブルーチンの実行が開始されたときにアクティブであるすべてのスレッドに対応する１つまたは複数のレジュームカウンタ値のセットからの最も小さいレジュームカウンタ値を示す値を指定し得る。各レジュームカウンタ値は、処理システム上で実行している複数のスレッドの各々に対応し得、それぞれのスレッドが非アクティブである場合、レジュームカウンタ値は、非アクティブスレッドがそれにおいて再アクティブ化されるようにスケジュールされた、プログラムカウンタ値を示し得る。
【００１３】
[0026]処理システムの実行を現在制御しているＭＩＮＲＣは、１つまたは複数のスレッドが非アクティブ化されたときに、前方ジャンプ命令（forward jump instruction）の後にまたは前方分岐命令（forward branch instruction）の後にどの命令が実行されるかを制御するために使用され得る。たとえば、場合によっては、前方ジャンプ命令または前方分岐命令を実行した後に、処理システムは、実行されるべき次命令（next instruction）として、ＭＩＮＲＣによって示された命令を選択し得る。メインプログラムとサブルーチンの各々とのために別個のＭＩＮＲＣを使用することによって、処理システムは、サブルーチンが、あるサブルーチンから呼出しまたは復帰命令の実行の外の別のサブルーチンにまたはメインプログラムに分岐しないことを保証し得る。このようにして、本開示の技法は、前方ジャンプ命令と前方分岐命令との実行を制御するためにＭＩＮＲＣを使用する処理システムにおけるサブルーチンの実行のための適切な制御フローを保証し得る。
【００１４】
[0027]本開示のいくつかの態様に従って、サブルーチンの出入り時に処理システムの実行を制御するために使用されるＭＩＮＲＣを切り替えるための技法について説明する。たとえば、呼出し命令を実行したことに応答して、処理システムは、呼出し側プログラムに対応するＭＩＮＲＣの状態を保存し、サブルーチンプログラムに対応する新しいＭＩＮＲＣを初期化し、サブルーチンプログラムに対応するＭＩＮＲＣに基づいてサブルーチンの実行を制御するように構成され得る。復帰命令を実行したことに応答して、処理システムは、呼出し側プログラムに対応するＭＩＮＲＣの保存状態を復元し、ＭＩＮＲＣの復元された状態に基づいて呼出し側プログラムの実行を制御することをレジュームするように構成され得る。
【００１５】
[0028]本開示のいくつかの態様に従って、処理システムにおいて１つまたは複数のスレッドをアクティブ化および／または非アクティブ化したことに応答して、ＭＩＮＲＣ値を更新するための技法について説明する。概して、ＭＩＮＲＣ値を更新するために、処理システムは、ＭＩＮＲＣ値を決定する際に使用するためのレジュームカウンタ値の候補セットを決定し、レジュームカウンタ値の候補セットからの最も小さいレジュームカウンタ値を示す値にＭＩＮＲＣを設定し得る。レジュームカウンタ値の候補セットは、処理システム中で実行しているすべてのスレッドに対応するレジュームカウンタ値のセット全体のサブセットであり得る。レジュームカウンタ値の候補セットは、場合によっては、現在実行されているプログラムモジュールの実行が開始されたときにアクティブでなかったスレッドに対応する１つまたは複数のレジュームカウンタ値を除外し得る。ＭＩＮＲＣを更新している間にそのようなレジュームカウンタ値を考慮から除外することによって、本開示の技法は、サブルーチン固有ＭＩＮＲＣが、サブルーチンに関連するプログラム空間内にある値に更新されることを保証し得る。
【００１６】
[0029]ＳＩＭＤ処理システムの命令セットアーキテクチャ（ＩＳＡ：instruction set architecture）が制御フロー命令をサポートする場合、すべてのスレッドは、単一のプログラムカウンタを含む単一の制御フローユニットによって制御され得る。各スレッドは異なるデータに対して動作するので、特定の分岐命令のための分岐条件は、システム中で実行しているスレッドのうちのいくつかについて満たされ、システム中で実行している他のスレッドについては満たされないことが起こり得る。特定の条件付き分岐命令によって指定された条件が、システム中で実行しているアクティブスレッドのすべてについて満たされる場合または満たされない場合のいずれも、分岐命令についての分岐ダイバージェンスは一様であると言われる。そうではなく、条件がアクティブスレッドのうちのいくつかについて満たされ、アクティブスレッドの他のものについては満たされない場合、分岐命令についての分岐ダイバージェンスはダイバージェントであると言われる。ダイバージェント分岐が起きた場合、アクティブスレッドのうちのいくつかについて実行されるようにスケジュールされる次命令は、アクティブスレッドのうちの他のスレッドについて実行されるようにスケジュールされる次命令とは異なり得る。これにより、ＳＩＭＤ処理システムは、スレッドのすべてをロックステップ（lockstep）方式で実行することが可能でなくなり得る。
【００１７】
[0030]ダイバージェント分岐命令に対処するために、本開示の技法は、いくつかの例では、残りのアクティブスレッドがすべて同じ次命令を実行するように同期させられるように、分岐条件を満たしたかまたはそれを満たさなかったかのいずれかのスレッドの１つのサブセットを非アクティブ化し得る。非アクティブ化されたスレッドの再アクティブ化を制御するために、本開示の技法は、処理システム中で実行している各スレッドにレジュームカウンタを割り当てることと、非アクティブ化されている各スレッドのためのレジュームカウンタを、それぞれのスレッドが再アクティブ化されるべきであるプログラムカウンタ値を示す値に設定することと、あらゆる命令の実行よりも前にレジュームチェック動作を実施することとを伴う、レジュームカウンタベースの手法を使用し得る。
【００１８】
[0031]たとえば、レジュームカウンタベースの手法は、ダイバージェント分岐条件に応答して１つまたは複数のスレッドを非アクティブ化し、非アクティブ化されている各スレッドについて、それぞれのスレッドのレジュームカウンタ（たとえば、レジスタ）を、非アクティブ化されたスレッドによって実行されるべき次命令に対応するプログラムカウンタ値を示す値に設定し得る。スレッドがアクティブである場合、スレッドのレジュームカウンタはデフォルト値に設定され得る。いくつかの例では、デフォルト値は、プログラムのアドレス範囲よりも大きい値（たとえば、最大レジスタ値）に対応する「無限値」であり得る。プログラムカウンタレジスタに新しいプログラムカウンタ値がロードされるたびに、スレッドについてのレジュームカウンタ値が新しいプログラムカウンタ値に等しいスレッドを再アクティブ化し得る、レジュームチェック動作が実施され得る。
【００１９】
[0032]スレッド再アクティブ化のための上記で説明したレジュームカウンタベースの手法を使用する処理システムにおいて適切な制御フローが維持されることを保証するために、処理システムは、「最小値アドレス優先（least-valued address first）」スレッド処理順序を使用し得る。概して、「最小値アドレス優先」スレッド処理順序は、より低い値のアドレスにおける命令を処理するようにスケジュールされたスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドよりも前に実行される処理順序を指す。そのような処理順序は、制御フローが、最初に非アクティブスレッドを再アクティブ化することなしにそのようなスレッドのレジュームポイントを越えてジャンプするのを防ぎ得る。言い換えれば、そのような処理順序は、最後のプログラムステートメントが実行を完了した時間までに、すべてのスレッドがアクティブになり、処理を完了していることを保証し得る。
【００２０】
[0033]「最小値アドレス優先」スレッド処理順序は、分岐命令の方向（すなわち、前方（forward）または後方（backward））に基づいて、ダイバージェント分岐命令に応答してどのスレッドが非アクティブ化されるかを区別し得る。ダイバージェント後方分岐命令の場合、本開示の技法は、分岐条件が満たされないスレッドを非アクティブ化し、非アクティブ化されている各スレッドについてのレジュームカウンタ値を、分岐命令の後に行われる次順の命令（next sequential instruction）に関連する値に設定し、分岐命令によって指定されたターゲット命令に関連する値をプログラムカウンタにロードし、続いて、分岐条件が満たされるスレッドの実行に進み得る。ダイバージェント前方分岐命令の場合、本開示の技法は、分岐条件が満たされるスレッドを非アクティブ化し、非アクティブ化されている各スレッドについてのレジュームカウンタ値を、分岐命令によって指定されたターゲット命令に関連する値に設定し、分岐命令の後に行われる次順の命令に関連する値をプログラムカウンタにロードし、続いて、分岐条件が満たされないスレッドの実行に進み得る。このような形でスレッドを非アクティブ化すると、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドよりも前に実行されること（すなわち、「最小値アドレス優先」スレッド処理順序）が保証される。
【００２１】
[0034]１つまたは複数のスレッドがすでに非アクティブ化されており、残りのアクティブスレッドが、前方ジャンプ命令または一様に満たされる前方分岐命令（すなわち、分岐条件がすべてのアクティブスレッドについて一様に満たされる前方分岐命令）のいずれかを実行する場合、制御フローを扱う１つの手法は、すべてのアクティブスレッドがアクティブのままになるので、前方ジャンプ命令または前方分岐命令中で指定されたターゲット命令に常にジャンプすることであり得る。しかしながら、そのような手法は「最小値アドレス優先」スレッド処理順序を保証しない。具体的には、１つまたは複数の非アクティブスレッドは、場合によっては、ジャンプ命令または分岐命令の現在プログラムカウンタ値と、ターゲットプログラムカウンタ値（すなわち、分岐命令またはジャンプ命令中で指定されたターゲット命令に関連するプログラムカウンタ値）との間にあるレジュームカウンタ値を有し得る。制御フローがそのような非アクティブスレッドを越えてジャンプした場合、そのようなスレッドは、プログラムの実行を完了する前に再アクティブ化されない可能性がある。
【００２２】
[0035]そのような状況を回避するために、システム中のすべてのスレッドに対応するレジュームカウンタ値のセットからの最も小さいレジュームカウンタ値を示す値を記憶する、グローバルＭＩＮＲＣが使用され得る。（たとえば、スレッドの非アクティブ化時に）レジュームカウンタのいずれかが新しい値に設定されたときには、ＭＩＮＲＣは、新しい最小のレジュームカウンタ値を反映するように更新され得る。処理システムは、そのＭＩＮＲＣを使用して、現在実行されている前方ジャンプ命令または前方分岐命令と、その命令において指定されているターゲット命令との間にレジュームポイントがあるかどうかを決定し得、今度はそのレジュームポイントを使用して、非アクティブスレッドについての１つまたは複数のレジュームポイントを越えてスキップすることを処理システムに行わせることなしに、処理システムがターゲット命令に直接ジャンプすることができるかどうかを決定し得る。
【００２３】
[0036]たとえば、前方ジャンプ命令または一様に満たされる前方分岐命令を実行するときには、処理システムは、ジャンプ命令または分岐命令によって指定されたターゲットプログラムカウンタ値をＭＩＮＲＣ値と比較し、その比較に基づいてプログラムカウンタにロードすべきターゲットプログラムカウンタ値またはＭＩＮＲＣ値のいずれかを選択し得る。ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さいかまたはそれに等しいときには、処理システムは、そのターゲットプログラムカウンタ値をプログラムカウンタにロードすべき値として選択し得る。ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さくなくそれに等しくもないときには、処理システムは、そのＭＩＮＲＣをプログラムカウンタにロードすべき値として選択し得る。ＭＩＮＲＣ値はすべての非アクティブスレッドの最も小さいレジュームカウンタ値を示すので、上記で説明した方式で前方ジャンプおよび一様前方分岐を実行することにより、制御フローがどんな非アクティブスレッドについてもレジュームポイントを越えてスキップしないことが保証されることになる。このように、ＭＩＮＲＣを使用して、非アクティブ化スレッドの再アクティブ化を制御するためにレジュームカウンタを使用する処理システムにおいて前方ジャンプ命令と前方分岐命令とを実行するときに、適切な制御フローを保証し得る。
【００２４】
[0037]前方ジャンプ命令と前方分岐命令との適切な制御フローを保証するためのＭＩＮＲＣベースの手法はまた、同じ目的のために使用され得る他の技法よりも効率的であり得る。たとえば、適切な制御フローを保証するための別の技法は、前方ジャンプ命令または一様に満たされる前方分岐命令が実行されたときはいつでも、すべてのスレッドを非アクティブ化することと、現在プログラムカウンタ値とターゲットプログラムカウンタ値との間のレジュームカウンタ値を有する任意の非アクティブスレッドが、ターゲット命令を実行するよりも前に適切に再アクティブ化され実行されるように、現在プログラムカウンタ値とターゲットプログラムカウンタ値との間の各プログラムカウンタ値にわたってプログラムカウンタを順次にインクリメントすることとを伴い得る。そのような手法は「最小値アドレス優先」スレッド処理順序を保証し得るが、そのような手法は、ＭＩＮＲＣベースの手法よりも効率的でないことがある。たとえば、場合によっては、非アクティブスレッドのすべてのためのレジュームカウンタ値は、当該の前方ジャンプまたは分岐命令に関連するターゲットプログラムカウンタ値よりも大きいかまたはそれに等しくなり得る。そのような状況において現在命令とターゲット命令との間のプログラムカウンタ値の各々を順次にトラバースすることは、いかなるスレッドの実行も行われない無駄なドーマント命令サイクルが原因で、非効率的となり得る。
【００２５】
[0038]現在命令とターゲット命令との間のプログラムカウンタ値の各々を順次にトラバースするのではなく、ＭＩＮＲＣベースの手法は、前方ジャンプ命令または一様に満たされる前方分岐命令を処理したことに応答して、ターゲットプログラムカウンタ値またはＭＩＮＲＣ値のいずれかをプログラムカウンタに直接ロードし得る。これにより、現在命令の実行と次命令の実行との間の余分のドーマント命令サイクルを有する必要なしに、次命令が次命令サイクル中に処理されることが可能になる。次命令が次命令サイクル中に処理されることを可能にすることによって、制御フローのためのＭＩＮＲＣベースの手法は、ＭＩＮＲＣを使用しないレジュームカウンタベースのシステムに対して前方ジャンプ命令と前方分岐命令とのパフォーマンスを改善し得る。
【００２６】
[0039]ただし、単一のグローバルＭＩＮＲＣ値を使用することの１つの欠点は、そのような値が、それ自体としては、サブルーチンを含むプログラムにとって適切な制御フローを保証するのに十分でないことがあることである。プログラムがサブルーチンを含む場合、グローバルＭＩＮＲＣ値は、現在実行されているサブルーチンのプログラム空間の外側に位置するプログラムカウンタ値を指し得る可能性がある。たとえば、１つまたは複数のスレッドがメインプログラムモジュール中で非アクティブ化されていることがあり、ＭＩＮＲＣは、そのようなスレッドによって実行されるべき次命令に対応するメインプログラム空間中のプログラムカウンタ値に設定されていることがある。非アクティブ化されたスレッドが再アクティブ化されるようにスケジュールされるメインプログラム空間中のプログラムカウンタ値において命令を実行するよりも前に、残りのアクティブスレッドが、サブルーチンを実行し始め得る。サブルーチン中に前方ジャンプ命令または前方分岐命令が実行された場合、ＭＩＮＲＣ値は依然として、サブルーチンのプログラム空間の外側にあるメインプログラム空間中のプログラムカウンタ値を指し得る可能性がある。これは、制御フローがサブルーチンの外側にジャンプし、復帰命令の外のメインプログラムに戻ることを引き起こし得る。
【００２７】
[0040]概して、プログラムの実行中にメインプログラムとサブルーチンとの間でまたは異なるサブルーチン間で制御フローを移動するために、専用の呼出しおよび復帰命令が使用される。これらの命令は、１つのプログラムモジュール（すなわち、メインプログラムまたはサブルーチン）に関するシステム状態が、制御を別のプログラムモジュールに移す前に保存されることを可能にし、また、それが以前に保存されていた場合、他のプログラムモジュールのシステム状態が復元されることを可能にする。上記の例において説明したように、制御フローをサブルーチンの外側にジャンプさせ、呼出し命令または復帰命令の外のメインプログラムに戻させると、システムが正しくない状態で動作することを引き起こし得る。したがって、単一のグローバルＭＩＮＲＣは、レジュームカウンタを使用するシステムにおいて前方分岐命令と前方ジャンプ命令とのパフォーマンスを改善することが可能であり得るが、グローバルＭＩＮＲＣは、単独では、プログラム内の実行サブルーチンを適切にサポートすることが可能でないことがある。
【００２８】
[0041]本開示では、ＭＩＮＲＣベースの制御フロー技法を使用する処理システムにおいてサブルーチンを実行するための技法について説明する。サブルーチンを実行するための技法は、１つまたは複数のプログラムモジュール固有ＭＩＮＲＣを維持することを含み得る。各プログラムモジュール固有ＭＩＮＲＣは、実行されるべきプログラムの特定のプログラムモジュールに対応し、現在実行中のプログラムモジュールの実行が開始されたときにアクティブであったすべてのスレッドに対応する１つまたは複数のレジュームカウンタ値のセットからの最も小さいレジュームカウンタ値を示し得る。メインプログラムとサブルーチンの各々とのために別個のＭＩＮＲＣを使用することによって、処理システムは、サブルーチンが、あるサブルーチンから呼出しまたは復帰命令の実行の外の別のサブルーチンにまたはメインプログラムに分岐しないことを保証し得る。このようにして、前方ジャンプ命令と前方分岐命令との実行を制御するためにＭＩＮＲＣベースの手法を使用する処理システムにおいて、サブルーチンの実行のための適切な制御フローが保証され得る。
【００２９】
[0042]ダイバージェントスレッドを管理するための他の技法は、同期トークンとダイバージェンストークンとを記憶するためにスタックを使用することと、非アクティブ化されたスレッドの再アクティブ化を制御するためにソフトウェアトリガされるスレッド再アクティブ化システムを使用することとを含み得る。たとえば、ダイバージェンスを可能にする分岐命令が行われるたびに、同期トークンが、分岐命令に最初に遭遇したときにアクティブであったスレッドを示すスタック上にプッシュされ得る。分岐命令がダイバージェント分岐命令である場合、システムは、分岐を取らなかったスレッドと、分岐を取らなかったスレッドのための次命令に対応するプログラムカウンタ値とを示すスタック上にダイバージェンストークンをプッシュし得る。スタックからダイバージェンストークンをポップオフするようにシステムに命令する専用ソフトウェアフラグおよび／またはソフトウェア命令に遭遇するまで、システムは、分岐を取った残りのスレッドを実行し続け得る。スタックからダイバージェンストークンをポップオフしたことに応答して、システムは、続いて、分岐を取ったスレッドを非アクティブ化し、分岐を取らなかったスレッドを再アクティブ化および実行し得る。スタックから同期トークンをポップオフするようにシステムに命令する専用ソフトウェアフラグおよび／またはソフトウェア命令に遭遇するまで、システムは、分岐を取らなかった残りのスレッドを実行し続け得る。スタックから同期トークンをポップオフしたことに応答して、システムは、続いて、ダイバージェント分岐命令に最初に遭遇したときとスレッド状態が同じになるようにスレッドを再アクティブ化し得る。
【００３０】
[0043]しかしながら、この手法の１つの欠点は、スレッドの再アクティブ化を制御するために専用ソフトウェア命令が必要とされるということである。その上、この手法はダイバージェント分岐が起こるたびにスタックにエントリを入れるので、システムが処理することができるネストダイバージェント分岐の数は、スタックのサイズに基づいて制限される。ネストダイバージェント分岐は、別のダイバージェント分岐命令の取られた経路または取られなかった経路のいずれかの実行中に起こるダイバージェント分岐を指すことがある。すなわち、ネストダイバージェント分岐は、１つまたは複数のスレッドが、前に行われたダイバージェント分岐命令によりすでに非アクティブ化されており、そのようなスレッドがまだ再アクティブ化されていないときに起こる、ダイバージェント分岐である。
【００３１】
[0044]上記で説明したダイバージェントスレッドを再アクティブ化するためのソフトウェアトリガされるスタックベースの手法とは対照的に、本開示のレジュームカウンタベースの手法を実装するためには必ずしも専用ソフトウェア命令は必要とされない。代わりに、いくつかの例では、各命令サイクルにおいて、いずれかの非アクティブ化されたスレッドがそのサイクルの間に再アクティブ化されるようにスケジュールされるかどうかを決定するためのレジュームチェックが実施され得る。これにより、ダイバージェントスレッドが非アクティブ化および再アクティブ化される方式がプログラマーおよび／またはコンパイラから効果的に隠されることが可能になり、またプログラマーおよび／またはコンパイラが、ダイバージェントスレッドを処理するように設計された並列システムと、ダイバージェントスレッドを処理するように設計されていない非並列システムの両方の上で実行され得る単一セットの実行可能コードを生成することが可能になり得る。さらに、レジュームカウンタベースの手法は、ダイバージェントスレッド処理を可能にするようにレガシーコードを再コンパイルするおよび／または書き直す必要なしに、元来非並列システムのために設計されたコードを実行することが可能である。
【００３２】
[0045]その上、非アクティブ化されたスレッドの再アクティブ化を制御するために、レジュームカウンタベースの手法は、スタックとは対照的に、有限セットのレジュームカウンタを使用するので、そのような手法が扱うことができるネストダイバージェント分岐の数は、概念的に無限であり、スタックのサイズに基づいて制限されない。いくつかの例では、本開示の技法は、ＭＩＮＲＣ値を記憶するためにスタックを使用することがあることに留意されたい。しかしながら、ＭＩＮＲＣ値は、ダイバージェント分岐自体に応答してではなく、サブルーチン呼出しおよび復帰命令に応答して、そのようなスタック上にプッシュされ、それからポップオフされる。したがって、本開示の技法を実装するためにＭＩＮＲＣスタックが使用され得るが、そのようなスタックは、そのようなシステムにおいて起こり得るネストダイバージェント分岐の数を制限するものではない。
【００３３】
[0046]図１は、本開示のサブルーチン実行技法を実装するために使用され得る例示的な処理システム１０を示すブロック図である。処理システム１０は、プログラムの命令を並列に実行するように構成される。処理システム１０は、制御ユニット１２と、処理要素１４Ａ〜１４Ｄ（まとめて「処理要素１４」）と、命令ストア１６と、データストア１８と、通信経路２０、２２、２４、２６Ａ〜２６Ｄとを含む。通信経路２６Ａ〜２６Ｄは、まとめて「通信経路２６」と呼ばれることがある。
【００３４】
[0047]処理システム１０は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、タブレットコンピューティングデバイス、ビデオゲームプラットフォームまたはコンソール、ワイヤレス通信デバイス（たとえば、いわゆるスマートフォン、携帯電話、セルラー電話、衛星電話、および／または携帯電話ハンドセットなど）、固定電話、インターネット電話、ポータブルビデオゲームデバイスまたは携帯情報端末（ＰＤＡ）などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、グラフィカルデータを処理および／または表示する他のタイプのデバイス、あるいは計算を実施する任意のタイプのデバイスにおいて実装され得る。
【００３５】
[0048]いくつかの例では、制御ユニット１２および処理要素１４は、プログラマブルプロセッサまたはプログラマブルプロセッサの一部を形成するハードウェア構成要素であり得る。たとえば、制御ユニット１２と処理要素１４はグラフィックス処理ユニット（ＧＰＵ）またはＧＰＵの一部を一緒に形成し得る。
【００３６】
[0049]いくつかの例では、処理システム１０は、処理要素１４を使用してプログラムのための複数の実行スレッドを実行するように構成された単一命令複数データ（ＳＩＭＤ）処理システムであり得る。そのようなＳＩＭＤシステムでは、処理要素１４は、ともに、異なるデータアイテムに関して一度に単一の命令を処理し得る。プログラムは、プログラムに関連するスレッドのすべてが実行を完了した後、リタイアし得る。
【００３７】
[0050]制御ユニット１２は、命令ストア１６に記憶されたプログラムの命令を実行するように処理システム１０を制御するように構成される。プログラムの各命令について、制御ユニット１２は、通信経路２０を介して命令ストア１６から命令を取り出し、その命令を処理し得る。いくつかの例では、制御ユニット１２は、命令に関連する動作を処理要素１４のうちの１つまたは複数上で実行させることによって命令を処理し得る。たとえば、制御ユニット１２によって取り出された命令は、その命令によって指定されたデータアイテムに関する算術演算を実施するように処理システム１０に命令する算術命令であり得、制御ユニット１２は、処理要素１４のうちの１つまたは複数に、指定されたデータアイテムに対して算術演算を実施させ得る。さらなる例では、制御ユニット１２は、処理要素１４上で動作を実施させることなしに命令を処理し得る。
【００３８】
[0051]制御ユニット１２は、通信経路２２を介して処理要素１４に命令を与えることによって、動作を処理要素１４のうちの１つまたは複数上で実施させ得る。命令は、処理要素１４によって実施されるべき動作を指定し得る。処理要素１４のうちの１つまたは複数に与えられる命令は、命令ストア１６から取り出される命令と同じであるか、またはそれとは異なり得る。いくつかの例では、制御ユニット１２は、動作がそれの上で実施されるべきである処理要素１４の特定のサブセットをアクティブ化することと、動作がそれの上で実施されるべきでない処理要素１４の別のサブセットを非アクティブ化することとの一方または両方によって、処理要素１４の特定のサブセット上で動作を実施させ得る。制御ユニット１２は、通信経路２２を介して処理要素１４の各々にそれぞれのアクティブ化および／または非アクティブ化信号を与えることによって、処理要素１４をアクティブ化および／または非アクティブ化し得る。いくつかの例では、制御ユニット１２は、処理要素１４に命令を与えることとともに処理要素１４にアクティブ化および／または非アクティブ化信号を与えることによって、処理要素１４をアクティブ化および／または非アクティブ化し得る。さらなる例では、制御ユニット１２は、処理要素１４に命令を与えるよりも前に処理要素１４をアクティブ化および／または非アクティブ化し得る。
【００３９】
[0052]制御ユニット１２は、処理要素１４を使用してプログラムのための複数の実行スレッドを実行し得る。処理要素１４の各々は、複数のスレッドのうちのそれぞれのスレッドについてプログラムの命令を処理するように構成され得る。たとえば、制御ユニット１２は、処理のために処理要素１４の各々に各実行スレッドを割り当て得る。プログラムについての異なる実行スレッドは、データアイテムのセット中の異なるデータアイテムに関して命令の同じセットを実行し得る。たとえば、処理要素１４Ａは、複数のデータアイテム中のデータアイテムの第１のサブセットに関して命令ストア１６に記憶されたプログラムのための第１の実行スレッドを実行し得、処理要素１４Ｂは、複数のデータアイテム中のデータアイテムの第２のサブセットに関して命令ストア１６に記憶されたプログラムのための第２の実行スレッドを実行し得る。第１の実行スレッドは第２の実行スレッドとは異なり得、データアイテムの第１のサブセットはデータアイテムの第２のサブセットとは異なり得る。
【００４０】
[0053]いくつかの例では、制御ユニット１２は、複数の実行スレッド中の個々のスレッドをアクティブ化および非アクティブ化し得る。制御ユニット１２がスレッドを非アクティブ化するとき、制御ユニット１２はまた、スレッドを実行するために割り当てられた処理要素１４Ａ〜１４Ｄを非アクティブ化および／または無効にし得る。同様に、制御ユニット１２がスレッドをアクティブ化するとき、制御ユニット１２はまた、スレッドを実行するために割り当てられた処理要素１４Ａ〜１４Ｄをアクティブ化し得る。制御ユニット１２は、本開示において後でさらに詳細に説明するようにダイバージェント分岐条件の扱いを支援するために、１つまたは複数のスレッドの様々な組合せをアクティブ化および非アクティブ化し得る。
【００４１】
[0054]本明細書で使用するアクティブスレッドは、アクティブ化された、プログラムの命令を実行するように現在構成されているスレッドを指すことがある。非アクティブスレッドは、非アクティブ化された、プログラムの命令を実行しないように現在構成されているスレッドを指すことがある。所与の処理サイクル中に処理システム１０中で複数のスレッドが実行している場合、アクティブスレッドの各々は、処理サイクル中に複数スレッドのためのグローバルプログラムカウンタレジスタによって識別されるプログラムの命令を処理するように構成され得る。たとえば、制御ユニット１２は、アクティブスレッドに割り当てられた処理要素１４を、処理サイクル中にプログラムの命令を処理するように構成するために、そのような処理要素１４をアクティブ化し得る。一方、非アクティブスレッドの各々は、処理サイクル中にプログラムの命令を処理しないように構成され得る。たとえば、制御ユニット１２は、非アクティブスレッドに割り当てられた処理要素１４を、処理サイクル中にプログラムの命令を処理しないように構成するために、そのような処理要素１４を非アクティブ化し得る。
【００４２】
[0055]いくつかの例では、命令処理サイクルは、プログラムカウンタの連続ロード間の時間間隔を指すことがある。たとえば、命令処理サイクルは、第１の命令に関連する第１の値がプログラムカウンタにロードされるときと、第２の命令に関連する第２の値がプログラムカウンタにロードされるときとの間の時間を指すことがある。第２の命令は、第１の命令の直後にシステムによって処理される命令であり得る。第１の値と第２の値は同じ値または異なる値であり得、第１の命令と第２の命令は同じ命令または異なる命令であり得る。いくつかの例では、命令処理サイクルは、プログラムカウンタの連続同期ロード間の時間間隔を指すことがある。プログラムカウンタの同期ロードは、いくつかの例では、クロック信号によってトリガされるロードを指すことがある。命令処理サイクルは、本明細書では、代替的に命令サイクルまたは処理サイクルと呼ぶことがある。いくつかの例では、命令処理サイクルは１つまたは複数のクロックサイクルに対応し得る。
【００４３】
[0056]次命令の処理よりも前のあるときに、制御ユニット１２は、処理システム１０によって処理されるべき次命令を決定する。制御ユニット１２が処理されるべき次命令を決定する方法は、直近に実行された命令が制御フロー命令であるかどうかに応じて異なる。直近に実行された命令が制御フロー命令でない場合、制御ユニット１２は、処理システム１０によって処理されるべき次命令が、命令ストア１６に記憶された次順の命令に対応すると決定し得る。たとえば、命令ストア１６はプログラムの命令を順序付きシーケンスで記憶し得、次順の命令は、命令の順序付きシーケンスで直近に実行された命令の直後に行われる命令であり得る。
【００４４】
[0057]直近に実行された命令が制御フロー命令である場合、制御ユニット１２は、制御フロー命令中で指定された情報に基づいて処理システム１０によって処理されるべき次命令を決定し得る。たとえば、制御フロー命令は無条件制御フロー命令（たとえば、無条件分岐命令またはジャンプ命令）であり得、その場合、制御ユニット１２は、処理システム１０によって処理されるべき次命令が、制御フロー命令によって識別されるターゲット命令であると決定し得る。別の例として、制御フロー命令は条件付き制御フロー命令（たとえば、条件付き分岐命令）であり得、その場合、制御ユニット１２は、制御フロー命令によって識別されるターゲット命令、または命令ストア１６に記憶された次順の命令のうちの１つを、命令ストア１６からの処理すべき次命令として選択し得る。
【００４５】
[0058]本明細書で使用する制御フロー命令は、次順の命令を無条件に選択すること以外の技法に基づいて実行すべき次命令を決定するように制御ユニット１２に指示する命令を指すことがある。制御フロー命令は、命令ストア１６に記憶されたターゲット命令を指定し得る。たとえば、制御フロー命令は、命令ストア１６に記憶されたターゲット命令に対応するターゲットプログラムカウンタ値を示す値を含み得る。別の例として、制御フロー命令は、スタック記憶構造から復帰アドレスをポップオフするように制御ユニット１２に指示することによって、ターゲット命令を指定し得る。復帰アドレスは、命令ストア１６に記憶されたターゲット命令に対応し得る。ターゲット命令は、いくつかの例では、命令ストア１６に記憶された次順の命令とは異なり得る。
【００４６】
[0059]高レベルプログラムコードは、たとえば、ｉｆステートメント、ｓｗｉｔｃｈステートメント、ｄｏステートメント、ｆｏｒステートメント、ｗｈｉｌｅステートメント、ｃｏｎｔｉｎｕｅステートメント、ｂｒｅａｋステートメント、およびｇｏｔｏステートメントなど、制御フローステートメントを含み得る。コンパイラは、高レベル制御フローステートメントを低レベル制御フロー命令、たとえば、機械レベル制御フロー命令に変換し得る。制御フロー命令でない命令は、本明細書ではシーケンシャル命令（sequential instruction）と呼ぶことがある。シーケンシャル命令は、制御ユニット１２が、実行すべき次命令であるものとして次順の命令（next sequential instruction）を必ず選択する命令を指すことがある。シーケンシャル命令は、いくつかの例では、ターゲット命令を識別する情報を含まないことがある。
【００４７】
[0060]制御フロー命令の場合、ターゲット命令を識別する情報は、命令ストア１６に記憶されたターゲット命令を示す値であり得る。いくつかの例では、ターゲット命令を示す値は、命令ストア１６に記憶されたターゲット命令に対応する命令アドレスを示す値であり得る。命令アドレスを示す値は、場合によっては、命令ストア１６に記憶されたターゲット命令のアドレスであり得る。さらなる場合には、命令アドレスを示す値は、ターゲット命令のアドレスを計算するために使用される値であり得る。さらなる例では、命令アドレスを示す値は、ターゲット命令に対応するターゲットプログラムカウンタ値を示す値であり得る。ターゲットプログラムカウンタ値を示す値は、場合によっては、ターゲット命令に対応するターゲットプログラムカウンタ値であり得る。さらなる場合には、ターゲットプログラムカウンタ値を示す値は、ターゲットプログラムカウンタ値を計算するために使用される値であり得る。ターゲット命令に対応するターゲットプログラムカウンタ値は、いくつかの例では、命令ストア１６に記憶されたターゲット命令のアドレスに等しくなり得る。
【００４８】
[0061]制御フロー命令は、前方制御フロー命令または後方制御フロー命令であり得る。制御フロー命令が前方であるのか後方であるのかのプロパティは、制御フロー命令の方向と呼ばれることがある。前方制御フロー命令は、ターゲット命令が、命令ストア１６に記憶された命令の順序付きシーケンスで制御フロー命令の後に行われる、制御フロー命令であり得る。後方制御フロー命令は、ターゲット命令が、命令ストア１６に記憶された命令の順序付きシーケンスで次順の命令よりも前に行われる、制御フロー命令であり得る。次順の命令は、命令の順序付きシーケンスで制御フロー命令の直後に行われ得る。
【００４９】
[0062]制御フロー命令は、条件付き制御フロー命令または無条件制御フロー命令であり得る。条件付き制御フロー命令は、制御フロー命令に関連するターゲット命令にジャンプするための条件を指定する情報を含む。条件付き制御フロー命令を処理するとき、制御ユニット１２が、条件が満たされると決定した場合、制御ユニット１２は、処理されるべき次命令がターゲット命令であると決定し得る。一方、制御ユニット１２が、条件が満たされないと決定した場合、制御ユニット１２は、処理されるべき次命令が、命令ストア１６に記憶された次順の命令であると決定し得る。無条件制御フロー命令は、制御フロー命令に関連するターゲット命令にジャンプするための条件を指定する情報を含まない。無条件制御フロー命令を処理するとき、制御ユニット１２は、処理すべき次命令が、制御フロー命令によって識別されるターゲット命令であると無条件に決定し得る。言い換えれば、そのような場合における決定は、無条件制御フロー命令自体において指定される条件を条件としない。
【００５０】
[0063]条件付き制御フロー命令の例としては条件付き分岐命令がある。本開示における分岐命令という総称語の使用は、一般に、分岐命令が無条件分岐命令として別段に指定されていない限り、条件付き分岐命令を指す。無条件制御フロー命令の例としては、ジャンプ命令、呼出し命令、および復帰命令がある。
【００５１】
[0064]条件付き分岐命令は、１つまたは複数のデータアイテム値に関して指定される条件を含み得る。たとえば、１つのタイプの条件は、処理システム１０中で実行している各アクティブスレッドについて、第１のデータアイテム値を第２のデータアイテム値と比較する比較条件であり得る。データアイテム値を比較することは、たとえば、第１のデータアイテム値が第２のデータアイテム値よりも大きいのか、それよりも小さいのか、それ以下であるのか、それ以上であるのか、それに等しいのか、またはそれに等しくないのかを決定することを含み得る。別のタイプの条件は、処理システム１０中で実行している各アクティブスレッドについてのデータアイテム値がゼロに等しいのかゼロに等しくないのかを決定するゼロチェック条件であり得る。処理要素１４の各々は、異なるデータアイテムに対して動作するので、条件を評価した結果は、処理システム１０中で実行している各アクティブスレッドについて異なり得る。処理システム１０中で実行しているアクティブスレッドのすべてが分岐条件を満たすか、または処理システム１０中で実行しているアクティブスレッドのすべてが分岐条件を満たさないかのいずれかの場合、一様な分岐条件が発生し、分岐命令の分岐ダイバージェンスは一様であると言われる。一方、処理システム１０中で実行しているアクティブスレッドのうちの少なくとも１つが分岐条件を満たし、処理システム１０中で実行しているアクティブスレッドのうちの少なくとも１つが分岐条件を満たさない場合、ダイバージェント分岐条件が発生し、分岐命令の分岐ダイバージェンスはダイバージェントであると言われる。
【００５２】
[0065]処理システム１０中で実行しているスレッドは、同じ命令をロックステップ方式で実行し得る。言い換えれば、処理要素１４の各々は、処理サイクル中にすべてのアクティブスレッドについて同じ命令を一緒に実行し得る。しかしながら、ダイバージェント分岐条件が発生したとき、その分岐条件を満たすスレッドは、分岐条件を満たさないスレッドによって実行されるようにスケジュールされた次命令とは異なる次命令を実行するようにスケジュールされ得る。これは、処理システム１０中のスレッドが単一の命令をロックステップ方式で実行することを妨害し得る。
【００５３】
[0066]ダイバージェント分岐条件に対処するために、制御ユニット１２は、いくつかの例では、残りのアクティブスレッドがすべて同じプログラムカウンタアドレスに同期させられるように、分岐条件を満たしたかまたはそれを満たさなかったかのいずれかのスレッドの１つのサブセットを非アクティブ化し得る。スレッドの再アクティブ化を制御するために、制御ユニット１２は、処理システム中で実行している各スレッドにレジュームカウンタを割り当てることと、「最小値アドレス優先」スレッド処理順序に従ってダイバージェントスレッドを処理することと、あらゆる命令の実行よりも前にレジュームチェック動作を実施することとを伴う、レジュームカウンタベースの手法を使用し得る。
【００５４】
[0067]より詳細には、制御ユニット１２は、ダイバージェント分岐条件に応答して１つまたは複数のスレッドを非アクティブ化し、非アクティブ化されている各スレッドについて、それぞれのスレッドのレジュームカウンタ（たとえば、レジスタ）を、それぞれのスレッドが再アクティブ化されるようにスケジュールされたプログラムカウンタ値を示す値に設定し得る。それぞれのスレッドが再アクティブ化されるようにスケジュールされたプログラムカウンタ値は、いくつかの例では、非アクティブ化されたスレッドによって実行されるべき次命令に対応するプログラムカウンタ値であり得る。スレッドがアクティブである場合、スレッドのレジュームカウンタは、プログラムのアドレス範囲よりも大きい値（たとえば、最大レジスタ値）に対応し得るデフォルト値に設定され得る。プログラムカウンタレジスタに新しいプログラムカウンタ値がロードされるたびに、制御ユニット１２は、スレッドのレジュームカウンタ値が新しいプログラムカウンタ値に等しいスレッドを再アクティブ化し得る、レジュームチェック動作を実施し得る。レジュームチェック動作は、いくつかの例では、非アクティブ化されたスレッドのいずれかが、命令を実行するより前に再アクティブ化されるようにスケジュールされているかどうかを決定するために、各非アクティブ化されたスレッドに関連するレジュームカウンタ値を新たにロードされたプログラムカウンタ値と比較し得る。
【００５５】
[0068]「最小値アドレス優先」スレッド処理順序は、分岐命令の方向（すなわち、前方または後方）に基づいて、ダイバージェント分岐命令に応答してどのスレッドが非アクティブ化されるかを区別し得る。ダイバージェント後方分岐命令の場合、制御ユニット１２は、分岐条件が満たされないスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令の後に行われる次順の命令に関連する値に設定し、分岐命令によって指定されたターゲット命令に関連する値をプログラムカウンタにロードし、続いて分岐条件が満たされるスレッドを実行し得る。ダイバージェント前方分岐命令の場合、制御ユニット１２は、分岐条件が満たされるスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令によって指定されたターゲット命令に関連する値に設定し、分岐命令の後に行われる次順の命令に関連する値をプログラムカウンタにロードし、続いて分岐条件が満たされないスレッドを実行し得る。このようにしてスレッドを非アクティブ化することは、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドよりも前に実行すること（すなわち、「最小値アドレス優先」スレッド処理順序）を保証する。そのような処理順序は、制御フローが、非アクティブスレッドを再アクティブ化することおよびプログラムを早期に終了することなしに、そのようなスレッドのレジュームポイントを越えてジャンプするのを防ぎ得る。言い換えれば、そのような処理順序は、すべてのスレッドがアクティブになり、最後のプログラムステートメントが実行を完了した時間までには処理を完了していることになることを保証する。
【００５６】
[0069]本開示によれば、制御ユニット１２は、プログラムに関連する第１のＭＩＮＲＣに基づいてプログラムの実行を制御し、サブルーチンに関連する第２のＭＩＮＲＣに基づいてプログラムのサブルーチンの実行を制御し得る。第１のＭＩＮＲＣは、処理システム１０中で実行している複数のスレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定し得る。第２のＭＩＮＲＣは、サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定し得る。場合によっては、第１のＭＩＮＲＣのための複数のレジュームカウンタ値は、プログラムの実行が開始されたときにアクティブであるスレッドのすべてに対応し得る。いくつかの例では、プログラムがトップレベルプログラム（たとえば、メインプログラム）であるとき、プログラムが開始されたときにすべてのスレッドがアクティブであり得る。そのような例では、第１のＭＩＮＲＣは、処理システム１０中で実行しているすべてのスレッドに関連するレジュームカウンタ値のセットのうちの最も小さいレジュームカウンタ値であり得る。
【００５７】
[0070]概して、制御ユニット１２は、複数のＭＩＮＲＣに基づいて処理システム１０の実行を制御し得る。各ＭＩＮＲＣは、プログラム全体内で特定のプログラムモジュールを制御するために使用され得る。本明細書で使用するプログラムモジュールは、メインプログラムモジュール（すなわち、プログラムの実行が開始されたとき、プログラムが初めに実行するプログラムモジュール）を、および／またはメインプログラムモジュールもしくは別のサブルーチンプログラムモジュールによって呼び出されるサブルーチンプログラムモジュールを指すことがある。いくつかの例では、制御ユニット１２は、実行されている現在プログラムモジュールのＭＩＮＲＣ値を維持し、現在プログラムモジュールに対応するＭＩＮＲＣ値に基づいて現在プログラムモジュールの実行を制御し得る。ＭＩＮＲＣ値は、現在プログラムモジュールの実行が開始されたときにアクティブであるすべてのスレッドに対応する１つまたは複数のレジュームカウンタ値のセットからの最も小さいレジュームカウンタ値を示し得る。
【００５８】
[0071]制御ユニット１２が異なるプログラムモジュールを実行することに切り替わるとき、制御ユニット１２は、処理システム１０の実行を制御するために使用されるＭＩＮＲＣを切り替え得る。たとえば、制御ユニット１２が呼出し側プログラムモジュールを実行することからサブルーチンプログラムモジュールを実行することに切り替わる場合、制御ユニット１２は、処理システム１０の実行を制御するために使用されるＭＩＮＲＣを、呼出し側プログラムモジュールに関連する第１のＭＩＮＲＣからサブルーチンモジュールに関連する第２のＭＩＮＲＣに切り替え得る。同様に、サブルーチンプログラムモジュールの実行を完了した後に、制御ユニット１２は、処理システム１０の実行を制御するために使用されるＭＩＮＲＣを、サブルーチンモジュールに関連する第２のＭＩＮＲＣから呼出し側プログラムモジュールに関連する第１のＭＩＮＲＣ値に切り替え得る。呼出し側プログラムモジュールはメインプログラムモジュールまたはサブルーチンプログラムモジュールであり得る。
【００５９】
[0072]いくつかの例では、特定のＭＩＮＲＣに基づいてプログラムモジュールの実行を制御することは、その特定のＭＩＮＲＣに基づいてプログラムモジュール中に含まれる前方制御フロー命令の実行を制御することを含み得る。たとえば、前方ジャンプ命令、または分岐条件が一様に満たされる前方条件付き分岐命令を実行したことに応答して、制御ユニット１２は、ＭＩＮＲＣ値に基づいて、実行すべき次命令を決定し得る。制御ユニット１２は、たとえば、分岐命令またはジャンプ命令によって指定されたターゲットプログラムカウンタ値をＭＩＮＲＣ値と比較し、プログラムカウンタにロードすべきターゲットプログラムカウンタ値またはＭＩＮＲＣ値のいずれかを選択し得る。一例では、ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さいかまたはそれに等しいとき、制御ユニット１２は、そのターゲットプログラムカウンタ値をプログラムカウンタにロードすべき値として選択し得る。そのような例では、ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さくなくそれに等しくもないとき、制御ユニット１２は、そのＭＩＮＲＣ値をプログラムカウンタにロードすべき値として選択し得る。プログラムカウンタにターゲットプログラムカウンタ値またはＭＩＮＲＣ値のいずれかをロードすることにより、いかなる実行も行われない値にわたってプログラムカウンタを増分することによって処理システム１０がプログラムサイクルを浪費することが防止される。その上、ＭＩＮＲＣ値はすべての非アクティブスレッドの最も小さいレジュームカウンタ値を示すので、上記で説明した方式で前方ジャンプおよび一様前方分岐を実行することにより、制御フローがどんな非アクティブスレッドについてもレジュームポイントを越えてジャンプしないことが保証されることになる。このようにして、１つまたは複数のＭＩＮＲＣ値に基づいて処理システム１０の実行を制御することは、ダイバージェントスレッド処理のためにレジュームカウンタを利用するシステムにおいて前方ジャンプ命令と前方分岐命令とのパフォーマンスを改善し得る。
【００６０】
[0073]本開示のいくつかの態様によれば、制御ユニット１２は、サブルーチンのエントリおよび／またはエグジット時に処理システム１０の実行を制御するために使用されるＭＩＮＲＣを切り替えるように構成され得る。たとえば、呼出し命令を実行したことに応答して、制御ユニット１２は、呼出し側プログラムに対応する第１のＭＩＮＲＣの状態を保存し、サブルーチンプログラムに対応する第２のＭＩＮＲＣを初期化し、サブルーチンプログラムに対応する第２のＭＩＮＲＣに基づいてサブルーチンプログラムの実行を制御するように構成され得る。復帰命令を実行したことに応答して、処理システムは、呼出し側プログラムに対応する第１のＭＩＮＲＣの保存状態を復元し、第１のＭＩＮＲＣの復元状態に基づいてメインプログラムの実行を制御することをレジュームするように構成され得る。
【００６１】
[0074]制御ユニット１２は、いくつかの例では、第１のＭＩＮＲＣについてのＭＩＮＲＣレジスタに記憶された値をスタック記憶構造上にプッシュすることに少なくとも部分的によって、呼出し側プログラムに対応する第１のＭＩＮＲＣの状態を保存し得る。そのような例では、制御ユニット１２は、スタック記憶構造から第１のＭＩＮＲＣの保存状態をポップし、ＭＩＮＲＣレジスタに記憶された値を第１のＭＩＮＲＣの保存状態に対応する値で上書きすることに少なくとも部分的によって、呼出し側プログラムに対応するＭＩＮＲＣの保存状態を復元し得る。呼出し命令を実行するとき、制御ユニット１２は、第２のＭＩＮＲＣをデフォルト値（たとえば、最大レジスタ値、またはプログラムのアドレス範囲よりも大きい値）に等しく設定することに少なくとも部分的によって、サブルーチンプログラムに対応する第２のＭＩＮＲＣを初期化し得る。
【００６２】
[0075]処理システム１０中のレジュームカウンタ値のいずれかが新しい値に設定されたとき、制御ユニット１２は、新しい最も小さいレジュームカウンタ値を反映するためにＭＩＮＲＣ値を更新し得る。制御ユニット１２は、たとえば、１つまたは複数のスレッドを非アクティブ化したことに応答しておよび／またはレジュームチェック動作を実施したことに応答して、ＭＩＮＲＣ値を更新し得る。
【００６３】
[0076]本開示のいくつかの態様によれば、ＭＩＮＲＣ値を更新するとき、制御ユニット１２は、サブルーチンの実行が開始されたときに非アクティブであったスレッドに関連するレジュームカウンタ値を、サブルーチンに関連するＭＩＮＲＣを更新するために使用されることから除外するために様々な技法を使用し得る。ＭＩＮＲＣを更新している間にそのようなレジュームカウンタ値を考慮から除外することによって、本開示の技法は、サブルーチン固有ＭＩＮＲＣが、サブルーチンに関連するプログラム空間内にある値に更新されることを保証し得る。
【００６４】
[0077]いくつかの例では、制御ユニット１２は、サブルーチンのエントリポイントよりも大きいかまたはそれに等しいレジュームカウンタ値を、ＭＩＮＲＣ更新中に得られたＭＩＮＲＣ値に影響を及ぼすことから除外し得る。さらなる例では、制御ユニット１２は、フラグのセット中の各フラグが、サブルーチンの実行が開始されたときにそれぞれのスレッドがアクティブであったかどうかを示す、フラグのセットを維持し得る。そのような例では、制御ユニット１２は、サブルーチンの実行が開始されたときにアクティブでなかったレジュームカウンタ値を、ＭＩＮＲＣ更新中に得られたＭＩＮＲＣ値に影響を及ぼすことから除外し得る。
【００６５】
[0078]制御ユニット１２は、通信経路２０を介して命令ストア１６に通信可能に結合され、通信経路２２を介して処理要素１４に通信可能に結合され、通信経路２４を介してデータストア１８に通信可能に結合される。制御ユニット１２は、通信経路２０を使用して、命令ストア１６に読取り命令（read instructions）を送り得る。読取り命令は、命令がそこから取り出されるべきである命令ストア１６中の命令アドレスを指定し得る。制御ユニット１２は、読取り命令を送ったことに応答して、命令ストア１６から１つまたは複数のプログラム命令を受信し得る。制御ユニット１２は、通信経路２２を使用して、命令を処理要素１４に与え、いくつかの例では、処理要素１４からデータ（たとえば、分岐条件を評価するための比較命令の結果）を受信し得る。いくつかの例では、制御ユニット１２は、通信経路２４を使用して、（たとえば、分岐条件を評価するために）データストア１８から直接データアイテム値を取り出し得る。図１は、通信経路２４を含むものとして処理システム１０を示しているが、他の例では、処理システム１０は通信経路２４を含まないことがある。
【００６６】
[0079]処理要素１４の各々は、命令ストア１６に記憶されたプログラムの命令を処理する際に処理システム１０を支援するための演算を実施するように構成され得る。いくつかの例では、処理要素１４の各々は、演算の同じセットを実施するように構成され得る。たとえば、処理要素１４の各々は、同じ命令セットアーキテクチャ（ＩＳＡ）を実装し得る。追加の例では、処理要素１４の各々は算術論理ユニット（ＡＬＵ：arithmetic logic unit）であり得る。さらなる例では、処理システム１０はベクトルプロセッサ（たとえば、グラフィックス処理ユニット（ＧＰＵ）ベクトルプロセッサ）であり得、処理要素１４の各々はベクトルプロセッサ内の処理要素であり得る。追加の例では、処理システム１０はＳＩＭＤ実行ユニットであり得、処理要素１４の各々はＳＩＭＤ実行ユニット内のＳＩＭＤ処理要素であり得る。
【００６７】
[0080]処理要素１４によって実施される演算は、算術演算、論理演算、比較演算などを含み得る。算術演算は、たとえば、加算演算、減算演算、乗算演算、除算演算などの演算を含み得る。算術演算はまた、たとえば、整数算術演算および／または浮動小数点算術演算を含み得る。論理演算は、たとえば、ビット単位ＡＮＤ演算、ビット単位ＯＲ演算、ビット単位ＸＯＲ演算などの演算を含み得る。比較演算は、たとえば、大なり演算、小なり演算、ゼロに等しい演算、ゼロに等しくない演算などの演算を含み得る。大なり演算および小なり演算は、第１のデータアイテムが第２のデータアイテムよりも大きいのか、それよりも小さいのかを判定し得る。ゼロに等しい演算およびゼロに等しくない演算は、データアイテムがゼロに等しいのか、ゼロに等しくないのかを判定し得る。演算のために使用されるオペランドは、データストア１８中に含まれているレジスタに記憶され得る。
【００６８】
[0081]処理要素１４の各々は、通信経路２２を介して制御ユニット１２から命令を受信したことに応答して演算を実施するように構成され得る。いくつかの例では、処理要素１４の各々は、他の処理要素１４とは無関係にアクティブ化および／または非アクティブ化されるように構成され得る。そのような例では、処理要素１４の各々は、それぞれの処理要素１４Ａ〜１４Ｄがアクティブ化されるときに制御ユニット１２から命令を受信したことに応答して演算を実施するように構成され、それぞれの処理要素１４Ａ〜１４Ｄが非アクティブ化される（すなわち、アクティブ化されない）ときに制御ユニット１２から命令を受信したことに応答して演算を実施しないように構成され得る。
【００６９】
[0082]処理要素１４Ａ〜１４Ｄの各々は、それぞれの通信経路２６Ａ〜２６Ｄを介してデータストア１８に通信可能に結合され得る。処理要素１４は、通信経路２６を介して、データストア１８からデータを取り出し、データストア１８にデータを記憶するように構成され得る。データストア１８から取り出されるデータは、いくつかの例では、処理要素１４によって実施される演算のためのオペランドであり得る。データストア１８に記憶されるデータは、いくつかの例では、処理要素１４によって実施された演算の結果であり得る。
【００７０】
[0083]命令ストア１６は、処理システム１０が実行するためのプログラムを記憶するように構成される。プログラムは命令の順序付きシーケンスとして記憶され得る。いくつかの例では、各命令は一意の命令アドレスによってアドレス指定され得る。そのような例では、命令のシーケンス中で後の命令についての命令アドレスは、命令のシーケンス中で前の命令についての命令アドレスよりも大きい。プログラム命令は、いくつかの例では、機械レベル命令であり得る。すなわち、そのような例では、命令は、処理システム１０のＩＳＡに対応するフォーマットであり得る。命令ストア１６は、通信経路２０を介して制御ユニット１２から読取り命令を受信するように構成される。読取り命令は、命令がそこから取り出されるべきである命令アドレスを指定し得る。読取り命令を受信したことに応答して、命令ストア１６は、読取り命令において指定された命令アドレスに対応する命令を、通信経路２０を介して制御ユニット１２に与え得る。
【００７１】
[0084]命令ストア１６は、任意のタイプのメモリ、キャッシュまたはそれらの組合せであり得る。命令ストア１６がキャッシュであるとき、命令ストア１６は、処理システム１０の外部のプログラムメモリに記憶されたプログラムに関連する命令をキャッシュし得る。命令ストア１６は処理システム１０内にあるものとして示されているが、他の例では、命令ストア１６は処理システム１０の外にあり得る。
【００７２】
[0085]データストア１８は、処理要素１４によって使用されるデータアイテムを記憶するように構成される。いくつかの例では、データストア１８は複数のレジスタを備え、各レジスタは、処理システム１０によって演算される複数のデータアイテム内にそれぞれのデータアイテムを記憶するように構成され得る。データストア１８は、データストア１８中のレジスタとメモリまたはキャッシュ（図示せず）との間でデータを転送するように構成された１つまたは複数の通信経路（図示せず）に結合され得る。
【００７３】
[0086]通信経路２０、２２、２４、２６は、図１に示されている処理システム１０中の異なる構成要素間で信号、命令および／またはデータの通信を行うように構成され得る。通信経路２０、２２、２４、２６はそれぞれ、たとえば、図１に示された異なる構成要素間で電気信号を搬送する１つまたは複数のバス（たとえば、オンチップバス）および／または電気相互接続（たとえば、ワイヤおよび／または回路トレース）として実装され得る。
【００７４】
[0087]図１は、処理要素１４によって使用されるデータを記憶するための単一のデータストア１８を示しているが、他の例では、処理システム１０は、処理要素１４の各々について別個の専用データストアを含み得る。図１は、例示のために４つの処理要素１４を有する処理システム１０を示している。しかしながら、他の例では、処理システム１０は、同じまたは異なる構成で同じまたは異なる数の処理要素１４を有し得る。
【００７５】
[0088]図２は、本開示による、図１の例示的な処理システム１０中の制御ユニット１２をさらに詳細に示すブロック図である。制御ユニット１２は、プログラムカウンタ２８と、フェッチモジュール３０と、復号モジュール３２と、制御フローモジュール３４とを含む。制御フローモジュール３４は、本明細書では代替的に制御フローユニットとも呼ぶことがある。
【００７６】
[0089]プログラムカウンタ２８は、プログラムカウンタ値を記憶するように構成される。いくつかの例では、プログラムカウンタ２８は、たとえば、プログラムカウンタレジスタなどのハードウェアレジスタであり得る。プログラムカウンタ値は、命令ストア１６に記憶された命令を示し得る。プログラムカウンタ値は、場合によっては、命令ストア１６に記憶された命令の命令アドレスに等しくなり得る。さらなる場合には、プログラムカウンタ値は、命令ストア１６に記憶された命令の命令アドレスを計算するために使用され得る。たとえば、プログラムカウンタ値は、命令アドレスを生成するためにオフセット値に加算され得る。プログラムカウンタ２８は、処理要素１４のすべてについて単一のプログラムカウンタとして使用され得るので、プログラムカウンタ２８は、本明細書では「グローバルプログラムカウンタ」または「グローバルプログラムカウンタレジスタ」と呼ぶことがある。
【００７７】
[0090]フェッチモジュール３０は、プログラムカウンタ２８に記憶されたプログラムカウンタ値に基づいて命令ストア１６から命令をフェッチする（たとえば、取り出す）ように構成される。たとえば、フェッチモジュール３０は、プログラムカウンタ２８に記憶されたプログラムカウンタ値によって識別される命令アドレスから命令をフェッチし得る。フェッチモジュール３０は、さらなる処理のために、フェッチされた命令を復号モジュール３２に与え得る。
【００７８】
[0091]復号モジュール３２は、フェッチモジュール３０から受信した命令を復号するように構成される。命令を復号することは、命令が処理要素１４によって処理され得るタイプの命令であるかどうかを決定するものであり得る。命令が、処理要素１４によって処理され得るタイプの命令である場合、復号モジュール３２は、命令を処理要素１４のうちの１つまたは複数の上で実行させ得る。いくつかの例では、復号モジュール３２は、命令を処理要素１４のすべての上で実行させ得る。他の例では、復号モジュール３２は、命令を処理要素１４のすべてよりも少ないものの上で実行させ得る。命令を処理要素１４のうちの１つまたは複数の上で実行させることは、場合によっては、実行のために処理要素１４のうちの１つまたは複数に命令を発行することを含み得る。たとえば、復号モジュール３２は、処理のためのアクティブスレッドに対応するすべての処理要素１４にシーケンシャル命令を発行し得る。命令が、処理要素１４によって処理され得るタイプの命令でない場合、制御ユニット１２は、処理のために処理要素１４のいずれかに命令を発行することなしに命令を処理し得る。たとえば、命令は、処理要素１４による処理を必要としないタイプの制御フロー命令であり得、その場合、制御ユニット１２は、処理要素１４のいずれかに命令を発行することなしに命令を処理し得る。
【００７９】
[0092]いずれの場合も、復号モジュール３２は、さらなる処理のために制御フローモジュール３４に制御情報をフォワーディングし得る。いくつかの例では、制御情報は命令自体であり得る。さらなる例では、制御情報は、たとえば、命令が制御フロー命令であるのかシーケンシャル命令であるのかを示す情報を含み得る。命令が制御フロー命令である場合、制御情報は、たとえば、命令が分岐命令であるのか、ジャンプ命令であるのか、呼出し命令であるのか、復帰命令であるのかを示す情報をさらに含み得る。命令が分岐命令またはジャンプ命令である場合、制御情報は、たとえば、分岐命令またはジャンプ命令が前方分岐命令であるのか、後方分岐命令であるのか、またはジャンプ命令であるのかを示す情報をさらに含み得る。命令が分岐命令である場合、制御情報は、たとえば、分岐条件を指定する情報をさらに含み得る。
【００８０】
[0093]処理要素１４によって処理され得るタイプである命令は、算術命令と論理命令とを含み得る。算術命令は、処理要素１４に算術演算を実施するように命令する命令を指し、論理命令は、処理要素１４に論理演算を実施するように命令する命令を指し得る。いくつかの例では、制御フロー命令は、処理要素１４によって処理され得る命令であり得る（たとえば、制御フロー命令は、処理要素１４によって評価される分岐条件を含み得る）。処理要素１４によって処理され得るタイプでない命令は、分岐条件が制御ユニット１２によって評価される制御フロー命令、および／または分岐条件を有しない制御フロー命令を含み得る。
【００８１】
[0094]制御フローモジュール３４は、制御ユニット１２によって処理されるべき次命令に関連するプログラムカウンタ値を決定し、プログラムカウンタ値をプログラムカウンタ２８にロードし得る。前にフェッチされた命令がシーケンシャル命令である場合、制御フローモジュール３４は、プログラムカウンタ２８にロードすべき、次順の命令を示すプログラムカウンタ値を選択し得る。前にフェッチされた命令が分岐命令またはジャンプ命令である場合、制御フローモジュール３４は、プログラムカウンタ２８にロードすべき新しいプログラムカウンタ値を選択するためにＭＩＮＲＣを利用し得る。たとえば、制御フローモジュール３４は、制御フロー命令によって指定されたターゲット命令に関連するターゲットプログラムカウンタ値、次順の命令を示すプログラムカウンタ値、またはプログラムカウンタ２８にロードすべきＭＩＮＲＣ値のうちの１つを選択し得る。前にフェッチされた命令が呼出し命令である場合、制御フローモジュール３４は、プログラムカウンタ２８にロードすべき、呼出し命令によって指定されたターゲット命令を示すターゲットプログラムカウンタ値を選択し得る。前にフェッチされた命令が復帰命令である場合、制御フローモジュール３４は、プログラムカウンタ２８にロードすべき、サブルーチン呼出しスタックからポップされる復帰アドレスを示すプログラムカウンタ値を選択し得る。
【００８２】
[0095]制御フローモジュール３４は、処理システム１０中で実行している各スレッドのためのレジュームカウンタ値を記憶し得る。たとえば、制御フローモジュール３４に記憶されたレジュームカウンタ値の数は、処理システム１０中に含まれている処理要素１４の数に等しくなり得る。各レジュームカウンタ値について、それぞれのレジュームカウンタ値に対応するスレッドが非アクティブである場合、レジュームカウンタ値は、非アクティブスレッドがアクティブ化または再アクティブ化されるようにスケジュールされたプログラムカウンタ値を示し得る。そうではなく、それぞれのレジュームカウンタ値に対応するスレッドがアクティブである場合、レジュームカウンタ値は、いくつかの例では、デフォルト値（たとえば、最大レジスタ値、またはレジュームカウンタのための記憶スロットまたはレジスタ中で表され得る最も大きい値である値）に設定され得る。
【００８３】
[0096]制御フローモジュール３４は、処理システム１０において現在実行されているプログラムモジュールについてのＭＩＮＲＣ値を記憶し得る。ＭＩＮＲＣ値は、処理モジュールの実行が開始されたときにアクティブであるスレッドに関連するレジュームカウンタ値のセットからの最も小さいレジュームカウンタ値を示し得る。すべてのスレッドがアクティブである場合、最小レジュームカウンタ値は、いくつかの例では、最大値、すなわち、最小レジュームカウンタのための記憶スロット中で表され得る最も大きい値である値に設定され得る。
【００８４】
[0097]制御フローモジュール３４は、処理システム１０において実行されている各スレッドのためのアクティブフラグを記憶し得る。たとえば、制御フローモジュール３４に記憶されたアクティブフラグの数は、処理システム１０中に含まれている処理要素１４の数に等しくなり得る。各アクティブフラグは、アクティブフラグに関連するスレッドがアクティブまたは非アクティブであるか否かを示し得る。いくつかの例では、アクティブフラグは、アクティブフラグに関連するスレッドがアクティブであることを示すために設定され、アクティブフラグに関連するスレッドが非アクティブであることを示すためにリセットされる、シングルビットであり得る。制御フローモジュール３４は、スレッドをアクティブ化および非アクティブ化するとき、特定のスレッドについてアクティブフラグを設定およびリセットし得る。
【００８５】
[0098]制御フローモジュール３４は、サブルーチン呼出し命令とサブルーチン復帰命令とを処理するのを支援するために１つまたは複数のスタックを管理し得る。たとえば、制御フローモジュール３４は、呼出し命令を実行したことに応答して、復帰アドレスをサブルーチンスタック上にプッシュし、ＭＩＮＲＣ値をＭＩＮＲＣスタック上にプッシュし得る。別の例として、制御フローモジュール３４は、復帰命令を実行したことに応答して、サブルーチンスタックから復帰アドレスをポップし、ＭＩＮＲＣスタックからＭＩＮＲＣ値をポップし得る。サブルーチンスタックおよびＭＩＮＲＣスタックは、同じスタックであるかまたは異なるスタックであり得る。
【００８６】
[0099]いくつかの例では、制御フローモジュール３４は、フラグのセット中の各フラグが、現在実行されているプログラムモジュールの実行がアクティブ化されていたときにそれぞれのスレッドがアクティブであったかどうかを示す、フラグのセットを記憶し得る。そのような例では、制御フローモジュール３４は、呼出し命令を実行したことに応答して、フラグのセットのためのフラグ値をスタック上にプッシュし、復帰命令を実行したことに応答して、スタックからセットフラグのためのフラグ値をポップオフし得る。
【００８７】
[0100]制御フローモジュール３４は、いくつかの例では、プログラム状態を記憶し得る。たとえば、第１のプログラム状態は、すべてのスレッドがアクティブであることを示し得、第２のプログラム状態は、少なくとも１つのスレッドがアクティブであり、少なくとも１つのスレッドが非アクティブであることを示し得、第３のプログラム状態は、すべてのスレッドが非アクティブであることを示し得る。プログラム状態は、そのような例では、プログラムカウンタ２８にロードすべきプログラムカウンタ値を選択するために使用され得る。
【００８８】
[0101]制御フローモジュール３４は、いくつかの例では、通信経路２２を介して処理要素１４のうちの１つまたは複数をアクティブ化および非アクティブ化するように構成され得る。追加の例では、制御フローモジュール３４は、特定の処理要素１４をアクティブ化および非アクティブ化するように復号モジュール３２に命令し得る。
【００８９】
[0102]いくつかの例では、図１および図２の処理システム１０はグラフィックス処理ユニット（ＧＰＵ）中に含まれ得る。そのような例では、処理システム１０は、たとえば、頂点シェーダユニット、ピクセルシェーダユニット、フラグメントシェーダユニット、ジオメトリシェーダユニット、ユニファイドシェーダユニットなど、ＧＰＵ内に含まれているシェーダユニットを実装するために使用され得る。そのような例では、処理システム１０は、たとえば、頂点シェーダプログラム、フラグメントシェーダプログラム、ジオメトリシェーダプログラムなどのシェーダプログラムを実行するように構成され得る。
【００９０】
[0103]図３は、本開示のサブルーチン実行技法を実装するために使用され得る例示的な制御フローモジュール３４を示すブロック図である。制御フローモジュール３４は、分岐条件評価器４０と、最小レジュームカウンタ（ＭＩＮＲＣ）レジスタ４２と、次命令生成器４４と、レジュームカウンタレジスタ４６と、スレッド状態マネージャ４８と、サブルーチンハンドラ５０と、スタック記憶構造５２とを含む。
【００９１】
[0104]分岐条件評価器４０は、処理システム１０中で実行している各アクティブスレッドについて条件付き分岐命令によって指定された分岐条件を評価するように構成される。分岐条件評価器４０は、現在処理されている命令が復号モジュール３２からの分岐命令であるかどうかを示す情報を受信し得、現在処理されている命令が分岐命令である場合、分岐条件評価器４０はまた、復号モジュール３２から、現在処理されている分岐命令についての分岐条件を示す情報を受信し得る。いくつかの例では、現在処理されている命令が分岐命令であるかどうかを示す情報と、分岐条件を示す情報の一方または両方が、命令自体の表現であり得る。さらなる例では、これらの情報成分の一方または両方は、復号モジュール３２によって生成された信号であり得る。
【００９２】
[0105]分岐条件評価器４０は、スレッド固有データを使用して各スレッドについて同じ分岐条件を評価し得る。いくつかの例では、分岐条件評価器４０は、各スレッドについて分岐条件を評価するために必要とされるデータを取得し得、各スレッドについての分岐条件評価結果を生成するために、各スレッドについて分岐条件を内部で評価し得る。さらなる例では、分岐条件評価器４０は、それぞれのスレッドについて分岐条件を評価するために必要とされるデータを取得することと、分岐条件を評価することと、分岐条件評価器４０にそれぞれのスレッドについての分岐条件評価結果を与えることとを行うように、アクティブスレッドに対応する各処理要素１４に指示し得る。いずれの場合も、分岐条件評価器４０は、各アクティブスレッドについて、分岐条件がそれぞれのスレッドについて満たされるかどうかを判定し得る。
【００９３】
[0106]いくつかの例では、分岐条件評価器４０は、分岐命令についての分岐ダイバージェンスが一様であるのかダイバージェントであるのかを判定し得る。たとえば、分岐条件評価器４０は、すべてのアクティブスレッドが分岐条件を満たしたかどうかと、すべてのアクティブスレッドが分岐条件を満たさなかったかどうかとを判定し得る。すべてのアクティブスレッドが、分岐条件を満たしたかまたは満たさなかったかのいずれかである場合、分岐条件評価器４０は、分岐命令についての分岐ダイバージェンスが一様であると判定し得る。いくつかのアクティブスレッドが分岐条件を満たしており、いくつかのアクティブスレッドが分岐条件を満たさなかった場合、分岐条件評価器４０は、分岐命令についての分岐ダイバージェンスがダイバージェントであると判定し得る。分岐ダイバージェンスが一様である例では、分岐条件評価器４０は、分岐条件が一様に満たされるのか、一様に満たされないのかを判定し得る。
【００９４】
[0107]分岐条件評価器４０は、スレッド状態マネージャ４８に分岐条件ステータス情報を与え得る。分岐条件ステータス情報は、処理システム１０中で実行している各アクティブスレッドについて、それぞれのスレッドが分岐条件を満たしたのか、分岐条件を満たさなかったのか（すなわち、スレッドについての分岐条件評価結果）を示し得る。スレッド状態マネージャ４８は、分岐命令を実行したことに応答して特定のスレッドをアクティブ化および／または非アクティブ化すべきかどうかを判定するために分岐条件ステータス情報を使用し得る。
【００９５】
[0108]分岐条件評価器４０は次命令生成器４４に分岐ダイバージェンス情報を与え得る。分岐ダイバージェンス情報は、分岐命令についての分岐ダイバージェンスが一様であるのかダイバージェントであるのかを示す情報を含み得る。分岐命令についての分岐ダイバージェンスが一様である場合、分岐ダイバージェンス情報はまた、分岐条件が一様に満たされるのか一様に満たされないのかを示す情報を含み得る。いくつかの例では、分岐ダイバージェンス情報は、アクティブスレッドの各々についての分岐条件ステータス情報の形態をとり得る。他の例では、分岐ダイバージェンス情報は、必ずしも個々のスレッドについての分岐条件ステータス情報を含むとは限らないことがある。
【００９６】
[0109]ＭＩＮＲＣレジスタ４２は、処理システム１０中の現在実行中のプログラムモジュールのＭＩＮＲＣ値を記憶し得る。ＭＩＮＲＣ値は、現在実行中のプログラムモジュールの実行が開始されたときにアクティブであるすべてのスレッドの最も小さいレジュームカウンタ値を示し得る。ＭＩＮＲＣ値は、スレッド状態マネージャ４８とサブルーチンハンドラ５０とスタック記憶構造５２とのうちの１つまたは複数によって更新および／または変更され得る。制御フローモジュール３４は、次命令生成器４４に関してさらに詳細に説明するように、ＭＩＮＲＣレジスタ４２に基づいて現在実行中のプログラムモジュールの実行を制御するように構成される。ＭＩＮＲＣレジスタ４２は、次命令生成器４４と、レジュームカウンタレジスタ４６と、サブルーチンハンドラ５０と、スタック記憶構造５２とに通信可能に結合される。
【００９７】
[0110]次命令生成器４４は、現在実行されている命令のタイプを示す情報と、命令が分岐命令である場合、現在実行されている命令の分岐ダイバージェンスを示す情報と、現在実行されている命令がもしあればその命令によって指定されるターゲット命令を示す情報と、命令が復帰命令である場合、復帰アドレスを示す情報と、命令が前方分岐命令またはジャンプ命令である場合、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値とに基づいて実行されるべき次命令に対応するプログラムカウンタ値を生成するように構成される。次命令生成器４４は、次命令サイクルの実行が開始されたときに、次命令生成器４４によって生成されたプログラムカウンタ値をプログラムカウンタ２８にロードさせ得る。
【００９８】
[0111]現在実行されている命令のタイプを示す情報は、復号モジュール３２から受信され、たとえば、命令がシーケンシャル命令であるのか制御フロー命令であるのかを示す情報を含み得る。命令が制御フロー命令である場合、命令のタイプを示す情報は、たとえば、命令が分岐命令であるのか、ジャンプ命令であるのか、サブルーチン命令（たとえば、呼出し命令または復帰命令）であるのかを示す情報を含み得る。命令が分岐命令またはジャンプ命令である場合、命令のタイプを示す情報は、たとえば、命令が前方分岐命令であるのか前方ジャンプ命令であるのか、または命令が後方分岐命令であるのか後方ジャンプ命令であるのかを示す情報を含み得る。
【００９９】
[0112]命令の分岐ダイバージェンスを示す情報は分岐条件評価器４０から受信され、たとえば、分岐ダイバージェンスが一様であるのかダイバージェントであるのかを示す情報を含み得る。分岐ダイバージェンスが一様である場合、命令の分岐ダイバージェンスを示す情報は、たとえば、分岐条件が一様に満たされるのか一様に満たされないのかを示す情報を含み得る。
【０１００】
[0113]ターゲット命令を示す情報は、復号モジュール３２から受信され、たとえば、ターゲットプログラムカウンタ値またはターゲットプログラムカウンタ値を示すオフセット値を含み得る。オフセット値は、たとえば、ターゲットプログラムカウンタ値を生成するためにプログラムカウンタに加算される値であり得る。ターゲット命令を示す情報は、現在命令がターゲット命令を指定するときに実行されるべき次命令についてのプログラムカウンタを決定するために使用され得る。これらの命令は、たとえば、条件付き分岐命令、ジャンプ命令、および呼出し命令を含み得る。
【０１０１】
[0114]復帰アドレスを示す情報はスタック記憶構造５２から受信され得る。たとえば、サブルーチン呼出し命令が実行されたとき、サブルーチンハンドラ５０がスタック記憶構造５２上に復帰アドレスをプッシュし得る。サブルーチンのための復帰命令が実行されたとき、サブルーチンハンドラ５０は、スタック記憶構造５２から復帰アドレスをポップオフし、その復帰アドレスを次命令生成器４４に与えて、実行されるべき次命令のプログラムカウンタ値を決定し得る。
【０１０２】
[0115]シーケンシャル命令の場合、次命令生成器４４は、次順の命令に対応するプログラムカウンタ値を、プログラムカウンタ２８にロードすべきプログラムカウンタ値として選択する。次順の命令は、命令ストア１６に記憶されたプログラムについての命令の順序付きシーケンスで現在実行されている命令の直後に行われる命令を指すことがある。
【０１０３】
[0116]後方ジャンプ命令の場合、次命令生成器４４は、後方ジャンプ命令によって指定されたターゲット命令を示すターゲットプログラムカウンタ値を、プログラムカウンタ２８にロードすべきプログラムカウンタ値として選択し得る。前方ジャンプ命令の場合、次命令生成器４４は、以下でさらに詳細に説明するように、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値に基づいてプログラムカウンタ２８にロードすべきプログラムカウンタ値を選択し得る。
【０１０４】
[0117]後方分岐命令の場合、次命令生成器４４は、後方分岐命令についての分岐条件が一様に満たされないかどうかを判定し得る。後方分岐命令についての分岐条件が一様に満たされない場合、次命令生成器４４は、次順の命令に対応するプログラムカウンタ値を、プログラムカウンタ２８にロードすべきプログラムカウンタ値として選択し得る。一方、後方分岐命令についての分岐条件が一様に満たされるかまたはダイバージェントである場合、次命令生成器４４は、後方分岐命令によって指定されたターゲット命令を示すターゲットプログラムカウンタ値を、プログラムカウンタ２８にロードすべきプログラムカウンタ値として選択し得る。
【０１０５】
[0118]前方分岐命令の場合、次命令生成器４４は、前方分岐命令についての分岐条件が一様に満たされないかまたはダイバージェントでないかどうかを判定し得る。前方分岐命令についての分岐条件が一様に満たされないかまたはダイバージェントでない場合、次命令生成器４４は、次順の命令に対応するプログラムカウンタ値を、プログラムカウンタ２８にロードすべきプログラムカウンタ値として選択し得る。前方分岐命令についての分岐条件が一様に満たされる場合、次命令生成器４４は、以下でさらに詳細に説明するように、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値に基づいてプログラムカウンタ２８にロードすべきプログラムカウンタ値を選択し得る。
【０１０６】
[0119]呼出し命令の場合、次命令生成器４４は、呼出し命令によって指定されたターゲット命令を示すターゲットプログラムカウンタ値を、プログラムカウンタ２８にロードすべきプログラムカウンタ値として選択し得る。復帰命令の場合、次命令生成器４４は、スタック記憶構造５２からポップされた復帰アドレスを示すプログラムカウンタを、プログラムカウンタ２８にロードすべきプログラムカウンタ値として選択し得る。
【０１０７】
[0120]上記で説明したように、分岐条件が一様に満たされる前方ジャンプ命令または前方分岐命令を実行したことに応答して、次命令生成器４４は、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値に基づいてプログラムカウンタ２８にロードすべきプログラムカウンタ値を選択し得る。いくつかの例では、次命令生成器４４は、命令によって指定されたターゲットプログラムカウンタ値またはＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値のうちの１つを、ＭＩＮＲＣ値に基づいてプログラムカウンタ２８にロードすべきプログラムカウンタ値として選択し得る。たとえば、次命令生成器４４は、いくつかの例では、ターゲットプログラムカウンタ値がＭＩＮＲＣ値以下であるかどうかを判定し得る。ターゲットプログラムカウンタ値がＭＩＮＲＣ値以下である場合、次命令生成器４４は、ターゲットプログラムカウンタ値を、プログラムカウンタ２８にロードすべきプログラムカウンタ値として選択し得る。一方、ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さくなくそれに等しくもない場合、次命令生成器４４は、ＭＩＮＲＣ値を、プログラムカウンタ２８にロードすべきプログラムカウンタ値として選択し得る。他の例では、たとえば、ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さいかどうかを判定すること、またはＭＩＮＲＣ値がターゲットプログラムカウンタ値よりも大きいかどうかを判定することを含む、他の比較演算も可能である。このようにして、次命令生成器４４は、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値に基づいて、現在実行中のプログラムモジュールの実行を制御し得る。
【０１０８】
[0121]レジュームカウンタレジスタ４６は、処理システム１０中で実行しているスレッドのための複数のレジュームカウンタ値を記憶する。各レジュームカウンタ値は、処理システム１０中で実行しているそれぞれのスレッドに対応し得、それぞれのスレッドが非アクティブである場合、それぞれのスレッドがアクティブ化されるようにスケジュールされたプログラムカウンタ値を示し得る。スレッドがアクティブである場合、レジュームカウンタ値はデフォルト値に設定され、デフォルト値は、場合によっては、プログラムを実行するために使用される有効なプログラムカウンタ値の範囲よりも大きい値であり得る。たとえば、スレッドがアクティブである場合、レジュームカウンタは、最大値である値（すなわち、レジュームカウンタのための記憶スロットまたはレジスタ中で表され得る最も大きい値である値）に設定され得る。対応するスレッドのためのレジュームカウンタは、スレッドがアクティブであるときにデフォルト値に設定されるので、各レジュームカウンタはまた、それぞれのレジュームカウンタに対応するスレッドがアクティブであるかどうかを示し得る。
【０１０９】
[0122]いくつかの例では、レジュームカウンタレジスタ４６は、複数のレジュームカウンタ値を記憶するように構成された複数のレジスタを含み得る。たとえば、各レジスタは、処理システム１０中で実行している複数のスレッドの各々のためのレジュームカウンタ値を記憶するように構成されたレジュームカウンタレジスタであり得る。レジュームカウンタレジスタ４６はスレッド状態マネージャ４８に通信可能に結合される。
【０１１０】
[0123]スレッド状態マネージャ４８は、処理システム１０中で実行しているスレッドの状態を管理するように構成される。たとえば、スレッド状態マネージャ４８は、処理システム１０中で実行しているスレッドをアクティブ化および非アクティブ化し、レジュームカウンタレジスタ４６を更新し、ＭＩＮＲＣレジスタ４２を適宜に更新し得る。
【０１１１】
[0124]スレッド状態マネージャ４８は、処理システム１０がダイバージェント分岐条件をもつ分岐命令を実行したことに応答して、１つまたは複数のスレッドを非アクティブ化し得る。たとえば、スレッド状態マネージャ４８は、分岐条件評価器４０からの、ダイバージェント分岐条件が生じたかどうかを示す情報と、分岐条件評価器４０または復号モジュール３２のいずれかからの、分岐命令が前方分岐命令であるのか後方分岐命令であるのかを示す情報と、どのスレッドが分岐条件を満たしたか、およびどのスレッドが分岐条件を満たさなかったかを示す情報とを受信し得る。スレッド状態マネージャ４８は、ダイバージェント分岐命令が前方分岐命令であるのか後方分岐命令であるのかを判定し得る。ダイバージェント分岐命令が前方分岐命令である場合、スレッド状態マネージャ４８は、分岐条件を満たした各アクティブスレッドを非アクティブ化し得る。ダイバージェント分岐命令が後方分岐命令である場合、スレッド状態マネージャ４８は、分岐条件を満たさなかった各アクティブスレッドを非アクティブ化し得る。
【０１１２】
[0125]非アクティブ化されている各スレッドについて、スレッド状態マネージャ４８は、それぞれのスレッドに対応するレジュームカウンタレジスタ４６に記憶されたレジュームカウンタ値を、それぞれのスレッドが再アクティブ化されるべきであるプログラムカウンタ値（たとえば、それぞれのスレッドが再アクティブ化されるようにスケジュールされたプログラムカウンタ値）を示す値に設定し得る。ダイバージェント前方分岐命令に応答してスレッドを非アクティブ化するときは、スレッド状態マネージャ４８は、スレッドのためのレジュームカウンタ値を、前方分岐命令によって指定されたターゲットプログラムカウンタ値を示す値に設定し得る。ダイバージェント後方分岐命令に応答してスレッドを非アクティブ化するときは、スレッド状態マネージャ４８は、スレッドのためのレジュームカウンタ値を、次順の命令に対応するプログラムカウンタ値を示す値に設定し得る。非アクティブ化されたスレッドのためのレジュームカウンタ値を設定した後に、スレッド状態マネージャ４８は、以下でさらに詳細に説明するように、現在実行中のプログラムモジュールのためのＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値を更新し得る。
【０１１３】
[0126]いくつかの例では、特定のスレッドを非アクティブ化するために、スレッド状態マネージャ４８は、特定のスレッドに対応する処理要素１４の各々を非アクティブ化し得る。追加の例では、特定のスレッドを非アクティブ化するために、スレッド状態マネージャ４８は、データストア１６が特定のスレッドに対応する計算結果を記憶すべきでないことを示す信号を、特定のスレッドに対応するデータストア１６の一部分に送り得る。スレッドを非アクティブ化するとき、スレッド状態マネージャ４８は、いくつかの例では、非アクティブ化されるべきスレッドに対応するアクティブフラグを、スレッドが非アクティブ化されたことを示す値に設定し得る。
【０１１４】
[0127]スレッド状態マネージャ４８は、非アクティブ化されたスレッドがそれぞれの命令サイクルの間に再アクティブ化される必要があるかどうかを判定するために、各命令サイクルの間にレジュームチェック動作を実施するように構成され得る。いくつかの例では、レジュームチェック動作を実施するために、スレッド状態マネージャ４８は、複数のレジュームカウンタ値の各々を現在処理されている命令に関連するプログラムカウンタ値（すなわち、プログラムカウンタ２８に現在ロードされているプログラムカウンタ値）と比較し得る。たとえば、スレッド状態マネージャ４８は、各レジュームカウンタ値が、プログラムカウンタ２８に記憶された現在プログラムカウンタ値に等しいかどうかを判定し得る。特定のスレッドのためのレジュームカウンタ値が現在プログラムカウンタ値に等しい場合、スレッド状態マネージャ４８はスレッドを再アクティブ化し得る。そうではなく、特定のスレッドのためのレジュームカウンタ値が現在プログラムカウンタ値に等しくない場合、スレッド状態マネージャ４８は、スレッドの非アクティブ化されたステータスを維持し得る。
【０１１５】
[0128]再アクティブ化されている各スレッドについて、スレッド状態マネージャ４８は、それぞれのスレッドに対応するレジュームカウンタ値を、スレッドがアクティブであることを示すデフォルト値に設定し得る。たとえば、デフォルト値は、レジュームカウンタ値のためのレジスタ中で表され得る最も大きい値であり得る。再アクティブ化されたスレッドのためのレジュームカウンタ値を設定した後に、スレッド状態マネージャ４８は、以下でさらに詳細に説明するように、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値を更新し得る。
【０１１６】
[0129]いくつかの例では、特定のスレッドを再アクティブ化するために、スレッド状態マネージャ４８は、特定のスレッドに対応する処理要素１４の各々をアクティブ化し得る。さらなる例では、特定のスレッドを再アクティブ化するために、スレッド状態マネージャ４８は、データストア１６が特定のスレッドに対応する計算結果を記憶すべきであることを示す信号を、特定のスレッドに対応するデータストア１６の一部分に送り得る。スレッドを再アクティブ化するとき、スレッド状態マネージャ４８は、いくつかの例では、スレッドに対応するアクティブフラグを、スレッドがアクティブ化されたことを示す値に設定し得る。
【０１１７】
[0130]いくつかの例では、プログラムカウンタ２８にプログラムカウンタ値をロードしたことに応答して、レジュームチェック動作が開始され得る。命令サイクルは、いくつかの例では、レジュームチェック動作が完了した後、処理要素１４が、レジュームチェック動作の一部として再アクティブ化されたスレッドについて計算動作を実施することを可能にするのに十分な長さであり得る。さらなる例では、プログラムカウンタ２８に記憶されたプログラムカウンタ値に対応する命令の実行は、レジュームチェック動作が完了した後、および命令について再アクティブ化されるようにスケジュールされたスレッドがアクティブ化されるまで、遅延させられ得る。そのような例では、レジュームチェック動作が完了した後、スレッド状態マネージャ４８は、現在命令に関連する計算動作を処理要素１４に実施し始めさせ得る。
【０１１８】
[0131]上記のように、スレッドを非アクティブおよび／または再アクティブ化するときに１つまたは複数のレジュームカウンタ値を更新したことに応答して、スレッド状態マネージャ４８は、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値を更新し得る。概して、スレッド状態マネージャ４８は、更新されたＭＩＮＲＣ値を決定する際に使用するためのレジュームカウンタ値の候補セットを決定し、レジュームカウンタ値の候補セットからの最も小さいレジュームカウンタ値を示す値にＭＩＮＲＣ値を設定し得る。レジュームカウンタ値の候補セットは、処理システム１０中で実行しているすべてのスレッドのためのレジュームカウンタ値を含む、レジュームカウンタ値の全セットのサブセットであり得る。サブセットは、親セットの要素のすべてまたはそのすべてよりも少ないものを含み得る。レジュームカウンタ値の候補セットは、場合によっては、現在実行中のプログラムモジュールの実行が開始されたときにアクティブでなかったスレッドに対応する１つまたは複数のレジュームカウンタ値を除外し得る。ＭＩＮＲＣを更新している間にそのようなレジュームカウンタ値を考慮から除外することによって、本開示の技法は、サブルーチン固有ＭＩＮＲＣが、サブルーチンに関連するプログラム空間内にある値に更新されることを保証し得る。
【０１１９】
[0132]いくつかの例では、スレッド状態マネージャ４８は、レジュームカウンタ値の全セットからの各レジュームカウンタ値が、現在実行中のプログラムモジュールのエントリポイント（たとえば、サブルーチンのエントリポイント）よりも大きいかまたはそれに等しいかどうかを判定し、レジュームカウンタ値が、現在実行中のプログラムモジュールのエントリポイントよりも大きいかまたはそれに等しいレジュームカウンタを、レジュームカウンタ値の候補セットであるものとして選択し得る。現在実行中のプログラムモジュールのエントリポイントは、現在実行中のプログラムモジュールに対応するプログラム空間の開始アドレスを示すプログラムカウンタ値であり得る。プログラムモジュールがメインプログラム（すなわち、トップレベルプログラム）である場合、プログラムモジュールのエントリポイントはトップレベルプログラムの開始アドレスであり得る。プログラムモジュールがサブルーチンプログラムモジュールである場合、プログラムモジュールのエントリポイントはサブルーチンプログラムモジュールの開始アドレスであり得る。
【０１２０】
[0133]追加の例では、スレッド状態マネージャ４８は、フラグのセット中の各フラグが、プログラムモジュール（たとえば、サブルーチン）の実行が開始されたときにそれぞれのスレッドがアクティブであったかどうかを示す、フラグのセットを維持し得る。たとえば、サブルーチン呼出し命令を実行したことに応答して、スレッド状態マネージャ４８は、フラグのセット中の各フラグを、呼出し命令が実行されたときにそれぞれのフラグに対応するスレッドがアクティブであるかどうかを示す値に設定し得る。そのような例では、スレッド状態マネージャ４８がＭＩＮＲＣ値を更新するとき、スレッド状態マネージャ４８は、レジュームカウンタ値の全セットからの各レジュームカウンタ値が、プログラムモジュールの実行が開始されたとき、そのレジュームカウンタ値に対応するスレッドがアクティブであったことを示すそれぞれのフラグに対応するかどうかを判定し、スレッドがアクティブであったことを示すフラグ値を有するレジュームカウンタ値を、レジュームカウンタ値の候補セットであるものとして選択し得る。
【０１２１】
[0134]サブルーチンハンドラ５０は、処理システム１０におけるサブルーチン制御フローステートメントの実行を管理するように構成される。サブルーチンハンドラ５０は、現在処理されている命令が呼出し命令であるのか復帰命令であるのかを示す情報を復号モジュール３２から受信し得る。呼出し命令は、サブルーチンプログラムモジュールの実行を開始するように処理システム１０に命令する命令を参照し得る。復帰命令は、現在実行中のサブルーチンモジュールの実行を終了し、サブルーチンプログラムの実行を開始した呼出し命令の直後に生じる呼出し側プログラム中の命令において呼出し側プログラムモジュールを実行することをレジュームするように、処理システム１０に命令する命令を参照し得る。呼出し側プログラムはメインプログラムまたは別のサブルーチンプログラムのいずれかであり得る。
【０１２２】
[0135]呼出し命令を実行したことに応答して、サブルーチンハンドラ５０は、呼出し側プログラムに関連するＭＩＮＲＣレジスタ４２の状態を保存し得る。たとえば、サブルーチンハンドラ５０は、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値をスタック記憶構造５２内のスタック上にプッシュし得る。ＭＩＮＲＣ値をスタック上にプッシュすることは、ＭＩＮＲＣ値をスタック記憶構造５２のスタックに記憶することを含み得る。また、呼出し命令を実行したことに応答して、サブルーチンハンドラ５０は、復帰アドレスをスタック記憶構造５２内のスタック上にプッシュし得る。復帰アドレスは、呼出し側プログラム中の呼出し命令の後の次順の命令に対応するプログラムカウンタ値を示し得る。
【０１２３】
[0136]いくつかの例では、ＭＩＮＲＣ値がプッシュされるスタックは、復帰アドレスがプッシュされるスタックと同じスタックであり得る。たとえば、サブルーチンハンドラ５０は、スタック記憶構造５２中のスタック上にスタックフレームをプッシュし得、ここで、スタックフレームは、呼出し命令に対応するＭＩＮＲＣ値と、呼出し命令に対応する復帰アドレスの両方を含む。追加の例では、サブルーチンハンドラ５０は、ＭＩＮＲＣ値をスタック記憶構造５２中の第１のスタック上にプッシュし、復帰アドレスをスタック記憶構造５２中の第２のスタック上にプッシュし得る。そのような例では、第１のスタックは第２のスタックとは異なり得る。
【０１２４】
[0137]また、呼出し命令を実行したことに応答して、サブルーチンハンドラ５０は、サブルーチンに対応するＭＩＮＲＣに基づいてサブルーチンの実行を制御するように処理システム１０を構成し得る。たとえば、サブルーチンハンドラ５０は、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値をサブルーチンに対応するＭＩＮＲＣの初期値で上書きし得る。言い換えれば、サブルーチンハンドラ５０は、サブルーチンの実行のためにデフォルトＭＩＮＲＣ値を記憶するようにＭＩＮＲＣレジスタ４２を初期化し得る。デフォルト値は、いくつかの例では、ＭＩＮＲＣレジスタ４２中で表され得る最も大きい値であり得る。
【０１２５】
[0138]復帰命令を実行したことに応答して、サブルーチンハンドラ５０は、呼出し側プログラムに対応するＭＩＮＲＣの保存状態を復元し得る。たとえば、サブルーチンハンドラ５０は、スタック記憶構造５２中のスタックから呼出し側プログラムに対応するＭＩＮＲＣの保存状態をポップし得る。スタックからＭＩＮＲＣの保存状態をポップすることは、ＭＩＮＲＣの保存状態に対応するスタックからＭＩＮＲＣ値をポップすることを含み得る。スタックからＭＩＮＲＣ値をポップすることは、スタック記憶構造５２から直近に記憶されたＭＩＮＲＣ値を取り出すことを伴い得る。また、復帰命令を実行したことに応答して、サブルーチンハンドラ５０は、スタック記憶構造５２内のスタックから復帰アドレスをポップオフし得る。復帰アドレスは、呼出し側プログラム中の呼出し命令の後の次順の命令に対応するプログラムカウンタ値を示し得る。
【０１２６】
[0139]サブルーチンハンドラ５０が、復帰アドレスがプッシュされたスタックと同じスタック上にＭＩＮＲＣ値をプッシュする例では、サブルーチンハンドラ５０は、同じスタックからＭＩＮＲＣ値と復帰アドレスとをポップし得る。たとえば、サブルーチンハンドラ５０は、スタック記憶構造５２中のスタックからスタックフレームをポップオフし得、ここで、スタックフレームは、ＭＩＮＲＣ値と復帰アドレスの両方を含む。サブルーチンハンドラ５０がＭＩＮＲＣ値と復帰アドレスとを異なるスタック上にプッシュする例では、サブルーチンハンドラ５０は、スタック記憶構造５２中の第１のスタックからＭＩＮＲＣ値をポップオフし、スタック記憶構造５２中の第２のスタックから復帰アドレスをポップオフし得る。
【０１２７】
[0140]サブルーチンハンドラ５０は、スタック記憶構造５２からポップされた復帰アドレスを次命令生成器４４に与え得、次命令生成器４４は、その復帰アドレスを使用して、プログラムカウンタ２８にロードすべき次のプログラムカウンタ値としてプログラムカウンタ値を選択し得る。選択されたプログラムカウンタ値は、サブルーチンの実行を開始した呼出し側プログラム中の呼出し命令の後の次順の命令を示し得る。
【０１２８】
[0141]また、復帰命令を実行したことに応答して、サブルーチンハンドラ５０は、呼出し側プログラムに対応するＭＩＮＲＣの保存状態に基づいて呼出し側プログラムの実行を制御するように処理システム１０を構成し得る。たとえば、サブルーチンハンドラ５０は、ＭＩＮＲＣレジスタ４２に記憶されたＭＩＮＲＣ値を、スタック記憶構造５２からポップされたＭＩＮＲＣ値の保存状態に対応する値で上書きし得る。
【０１２９】
[0142]スタック記憶構造５２は、ＭＩＮＲＣ値と復帰アドレスとのための記憶域を与えるように構成される。いくつかの例では、スタック記憶構造５２は、復帰アドレスを記憶するように構成された第１のスタック記憶構造と、ＭＩＮＲＣ値を記憶するように構成された第２のスタック記憶構造とを含み得る。そのような例では、第１のスタック記憶構造は第２のスタック記憶構造とは異なり得る。追加の例では、スタック記憶構造５２は、スタックフレームを記憶するように構成されたスタック記憶構造を含み得、ここで、各スタックフレームは、特定の呼出し命令に対応する復帰アドレスと、特定の呼出し命令に対応するＭＩＮＲＣ値とを含み得る。
【０１３０】
[0143]スタック記憶構造は、後入れ先出し（ＬＩＦＯ：Last In, First Out）処理方式に従ってデータを記憶し、取り出すように構成され得る。ＬＩＦＯ処理方式によれば、スタック記憶構造が、スタック記憶構造からデータユニット（たとえば、スタックフレーム、復帰アドレス、ＭＩＮＲＣ値など）を取り出すようにとの要求（たとえば、ポップ要求）を受信したときはいつでも、スタック記憶構造は、スタック上に記憶された直近のデータユニット（たとえば、スタック上にプッシュされることになる直近のデータユニット）を戻し得る。スタック記憶構造は、データユニットを記憶すべきであるのか取り出すべきであるのかを指定するが、必ずしもデータユニットをそこに記憶すべきまたはデータユニットをそこから取り出すべき特定のデータアドレスを指定するとは限らない、プッシュコマンドとポップコマンドとを処理するように構成され得る。
【０１３１】
[0144]いくつかの例では、スタック記憶構造５２は、ハードウェアベースのスタック記憶構造５２であり得る。たとえば、スタック記憶構造５２は、１つまたは複数のレジスタおよび／またはシフトレジスタとして実装され得る。スタック記憶構造５２は、図３では、制御フローモジュール３４と同じプロセッサ上に実装されるものとして示されているが、他の例では、スタック記憶構造５２の全部または一部がオンチップキャッシュにおいてまたは外部メモリデバイスにおいて実装され得る。たとえば、スタック記憶構造５２は、有限数のスタック記憶スロットのための記憶空間を含み得る。そのような例においてオーバフロー条件が発生した場合、サブルーチンハンドラ５０は、スタック記憶構造５２中に含まれる有限数のスタック記憶スロットに加えて追加のデータを記憶するために、オンチップキャッシュまたは外部メモリを利用し得る。
【０１３２】
[0145]図４は、本開示のサブルーチン実行技法のための例示的な制御フローを示す概念図である。図４に示されているように、呼出し側プログラム空間６０は呼出し側プログラムモジュールに関連付けられ、被呼出し側プログラム空間６２はサブルーチンプログラムモジュールに関連付けられる。呼出し側プログラムモジュールはメインプログラムまたは呼出し側サブルーチンのいずれかであり得る。呼出し側プログラム空間６０は、開始命令６４で開始し終了命令６６で終了する、プログラム命令のシーケンスを含む。プログラム命令のシーケンス中の開始命令６４と終了命令６６との間には呼出し命令６８があり、呼出し命令６８は、制御を呼出し側プログラムモジュールから被呼出し側サブルーチンモジュールに受け渡すように処理システム１０に指示する。プログラム命令のシーケンス中の呼出し命令６８の直後の命令は、任意のタイプの命令であり得る、命令７０である。被呼出し側プログラム空間６２は、開始命令７２で開始し復帰命令７４で終了する、プログラム命令のシーケンスを含む。復帰命令７４は、制御を被呼出し側サブルーチンモジュールから呼出し側プログラムモジュールに戻すように処理システム１０に指示する。開始命令６４は、本明細書では呼出し側プログラムモジュールのエントリポイントと呼ぶことがあり、開始命令７２は、本明細書では被呼出し側サブルーチンモジュールのエントリポイントと呼ぶことがある。
【０１３３】
[0146]呼出し側プログラムモジュールは、開始命令６４において命令を実行し始め、呼出し命令６８に遭遇するまで呼出し側プログラム空間６０中の命令を実行し続ける。呼出し命令６８は、制御を呼出し側プログラムモジュールから被呼出し側サブルーチンに受け渡すように処理システム１０に指示する。呼出し命令６８は、開始命令７２に対応するプログラムカウンタ値を示す値を含む。呼出し命令６８を実行したことに応答して、命令７０（すなわち、呼出し側プログラム中の呼出し命令６８の後の次順の命令）に対応する復帰アドレスが呼出しスタック上にプッシュされる（すなわち、それに記憶される）。また、呼出し命令６８を実行したことに応答して、呼出し側プログラムモジュールに対応するＭＩＮＲＣ値がスタック上にプッシュされる。また、呼出し命令６８を実行したことに応答して、被呼出し側サブルーチンプログラムモジュールに対応するＭＩＮＲＣがデフォルト値に初期化される。また、呼出し命令６８を実行したことに応答して、処理システム１０のためのプログラムカウンタは、被呼出し側サブルーチンの開始命令７２に対応するプログラムカウンタ値をロードされる。開始命令７２に対応するプログラムカウンタ値は、呼出し命令６８中に含まれている値によって指定され得る。
【０１３４】
[0147]被呼出し側サブルーチンモジュールは、開始命令７２において命令を実行し始め、復帰命令７４に遭遇するまで被呼出し側プログラム空間６２中の命令を実行し続ける。復帰命令７４を実行したことに応答して、復帰アドレスが呼出しスタックからポップオフされ（すなわち、取り出され）、プログラムカウンタにロードされる。再び、復帰アドレスは呼出し側プログラム空間６０中の命令７０に対応する。また、復帰命令７４を実行したことに応答して、呼出し側プログラムモジュールに対応するＭＩＮＲＣ値がスタックからポップオフされる。呼出し側プログラムモジュールは、プログラムの終了を示す終了命令６６に遭遇するまで、命令７０において命令を実行することをレジュームする。
【０１３５】
[0148]図５は、本開示のサブルーチン実行技法のための別の例示的な制御フローを示す概念図である。呼出し側プログラムモジュール７６と被呼出し側プログラムモジュール７８とが図５に示されている。呼出し側プログラムモジュール７６および被呼出し側プログラムモジュール７８は同じプログラムの一部であり得、被呼出し側プログラムモジュール７８はプログラムのサブルーチンであり得る。呼出し側プログラムモジュール７６はメインプログラムモジュールまたはサブルーチンプログラムモジュールであり得る。呼出し側プログラムモジュール７６は、呼出し命令８０と、呼出し命令８０の直後の次命令８２とを含む。呼出し命令８０と次命令８２との各々の実行よりも前に、レジュームチェック動作８４とレジュームチェック動作８６とがそれぞれ実行される。実行中に、呼出し命令８０は、後続の命令の実行のために、処理システムの制御を被呼出し側プログラムモジュール７８に移動し得る。被呼出し側プログラムモジュール７８中で最後の命令が実行された後に、制御は、次命令８２のためのレジュームチェック動作８６よりも前のポイントにおいて呼出し側プログラムモジュール７６に戻され得る。
【０１３６】
[0149]図５中のポイントＡおよびＢは、プログラムの実行中の２つの異なる時点を示している。ポイントＡは、呼出し命令８０のためのレジュームチェック動作８４の完了後の、および呼出し側プログラムモジュール７６から被呼出し側プログラムモジュール７８への制御の移動よりも前の、呼出し命令８０の命令サイクル中にある時点を定義する。ポイントＢは、次命令８２のためのレジュームチェック動作８６の開始よりも前の、および被呼出し側プログラムモジュール７８から呼出し側プログラムモジュール７６への制御の復帰後の、次命令８２の命令サイクル中にある時点を定義する。
【０１３７】
[0150]ポイントＡにおいてアクティブであるスレッドは、被呼出し側プログラムモジュールの実行を開始する直前にアクティブであるスレッドのセットを定義する。同様に、ポイントＢにおいてアクティブであるスレッドは、被呼出し側プログラムモジュール７８の実行を完了した直後にアクティブであるスレッドのセットを定義する。
【０１３８】
[0151]サブルーチンコンバージェンス（subroutine convergence）は、サブルーチンの実行を開始する直前の処理システム１０中のスレッドのすべてのためのスレッド状態が、サブルーチンの実行を完了した直後のスレッド状態と同じである特性を指す。すなわち、スレッドが図５のポイントＡにおいてアクティブである場合、サブルーチンコンバージェンスは、スレッドが図５のポイントＢにおいてもアクティブでなければならないことを要求する。同様に、スレッドが図５のポイントＡにおいて非アクティブである場合、サブルーチンコンバージェンスは、スレッドが図５のポイントＢにおいても非アクティブでなければならないことを要求する。本開示の技法は、いくつかの例では、サブルーチンコンバージェンスを保証し、それによって、処理システム１０におけるサブルーチンステートメントの安定した動作を保証することが可能であり得る。
【０１３９】
[0152]概して、サブルーチン環境における適切な動作を保証するために、呼出し側と被呼出し側との間の制御フローは、呼出し命令と復帰命令とを通して受け渡されなければならない。言い換えれば、呼出し側は、呼出し命令の外の被呼出し側に分岐またはジャンプすることができず、被呼出し側は、復帰命令の外の呼出し側に分岐またはジャンプすることができない。この理由は、呼出し命令および復帰命令が、単にプログラムカウンタを変更するだけでなく、たとえば、スタック上に復帰アドレスおよび／または他の変数をプッシュおよびポップすることによって、システムの状態をも変更するからである。呼出し命令および復帰命令の外で動的な呼出し側と被呼出し側との間の分岐が可能にされた場合、システム状態は正しくなることが保証されず、プログラムは、スレッドのすべてが実行を完了することなしに早期に終了する可能性がある。しかしながら、本開示のプログラムモジュール固有ＭＩＮＲＣ技法は、図６に関して以下で説明するように、そのような動的な呼出し側と被呼出し側との間の分岐が呼出し命令および復帰命令の外で発生するのを防止する。
【０１４０】
[0153]図６は、本開示の技法による、例示的なプログラム空間構成８８、９０を示す概念図である。プログラム空間構成８８、９０の各々は、呼出し側プログラムと被呼出し側プログラムとを含む。図６に示されているように、呼出し側のプログラム空間と被呼出し側のプログラム空間はプログラムメモリ中で重複しない。したがって、呼出し側プログラム空間は、図３に示されているように、被呼出し側プログラム空間の上方または下方のいずれかにある。呼出し側プログラム空間が被呼出し側プログラム空間の上方にある左側の場合について考える。図６は、呼出し側プログラム空間中の３つの異なる命令（Ａ，Ｂ，Ｃ）を示している。命令Ｂは、呼出し側プログラムのための命令のシーケンスにおいて命令Ａの後に行われ、命令Ｃは、呼出し側プログラムのための命令のシーケンスにおいて命令Ｂの後に行われる。命令Ａにおいて、呼出し側プログラムが、ダイバージェント分岐命令の実行に応答して１つまたは複数のスレッドを非アクティブ化すると仮定し、非アクティブ化スレッドのＭＩＮＲＣが命令Ｃを指し示すと仮定する。命令Ｃを実行するよりも前に、呼出し側プログラムは、呼出し命令である命令Ｂを実行する。命令Ｂを実行したことに応答して、制御は被呼出し側サブルーチンに移される。
【０１４１】
[0154]呼出し側プログラムの実行を制御することと、被呼出し側サブルーチンの実行を制御することとのために同じＭＩＮＲＣが使用される場合について考える。そのような場合、被呼出し側サブルーチンが、前方ジャンプ命令または一様に満たされる前方分岐命令を含む場合、そのような命令は、ＭＩＮＲＣとターゲット命令とのうちのより小さいほうにジャンプするように構成される。この場合、ＭＩＮＲＣは呼出し側プログラム空間中の命令（すなわち、命令Ｃ）を指し示すので、ＭＩＮＲＣは、常に被呼出し側プログラム空間中のどんなターゲットプログラム命令よりも小さい。したがって、前方ジャンプ命令または一様に満たされる前方分岐命令は、被呼出し側プログラムを復帰命令の外の呼出し側プログラム空間中に分岐させる。上記で説明したように、そのような分岐は、システムの適正な動作を保証しない。
【０１４２】
[0155]しかしながら、本開示のプログラムモジュール固有ＭＩＮＲＣ技法は、呼出し側と被呼出し側との間の分岐が呼出し命令および復帰命令の外で発生するのを防止する。たとえば、被呼出し側プログラムのためのサブルーチン固有ＭＩＮＲＣは、この例では命令Ｃを指す値を記憶しない。代わりに、サブルーチンの実行が開始したとき、サブルーチンの実行を制御するために使用される新しいサブルーチン固有ＭＩＮＲＣが初期化される。サブルーチン固有ＭＩＮＲＣは、サブルーチンの実行が開始されたときにアクティブであるすべてのスレッドの最も小さいレジュームカウンタ値を示す。命令Ｃを指すレジュームカウンタ値を有するスレッドは、サブルーチンの実行が開始したときにすでに非アクティブ化されているので、そのようなレジュームカウンタ値は、サブルーチン固有ＭＩＮＲＣに影響を及ぼさない。このようにして、本開示の技法は、呼出し側と被呼出し側との間の制御フローが呼出し命令と復帰命令とを通して受け渡されることを保証する。
【０１４３】
[0156]図７〜図１８は、本開示のサブルーチン実行技法を利用する例示的な命令処理技法を示す流れ図である。図７〜図１８に示された例示的な技法は、いくつかの例では、図２および図３のいずれかの制御フローユニット３４中で、および／または図１〜図３のいずれかの処理システム１０内で実装され得る。説明を簡単にするために、それらの技法について、図２に示された制御フローユニット３４に関して説明するが、それらの技法は、同じまたは異なる構成で同じまたは異なる構成要素をもつ他のシステムにおいて実施され得ることを理解されたい。
【０１４４】
[0157]図７は、本開示による、実行されるべき次命令についてのプログラムカウンタ値を決定するための例示的な技法を示す流れ図である。制御フローモジュール３４が、命令および／または命令に関連する制御情報を受信する（１００）。制御フローモジュール３４は、命令が制御フロー命令であるかどうかを判定する（１０２）。命令は制御フロー命令ではない、との判定に応答して、制御フローモジュール３４はプログラムカウンタ２８をインクリメントする（１０４）。たとえば、制御フローモジュール３４は、次順の命令を示すプログラムカウンタ２８にロードすべきプログラムカウンタ値を選択し得る。
【０１４５】
[0158]一方、命令は制御フロー命令である、との判定に応答して、制御フローモジュール３４は、制御フロー命令がサブルーチン命令であるかどうかを判定する（１０６）。例示的なサブルーチン命令は、呼出し命令および復帰命令を含み得る。命令はサブルーチン命令である、との判定に応答して、制御フローモジュール３４は、命令が呼出し命令であるかどうかを判定する（１０８）。命令は呼出し命令である、との判定に応答して、制御フローモジュール３４は、図８で説明する技法に従って呼出し命令を処理する（１１０）。一方、命令は呼出し命令ではない、との判定（すなわち、命令は復帰命令である、との判定）に応答して、制御フローモジュール３４は、図９で説明する技法に従って復帰命令を処理する（１１２）。
【０１４６】
[0159]判定ボックス１０６に戻ると、命令はサブルーチン命令ではない、との判定に応答して、制御フローモジュール３４は、制御フロー命令がジャンプ命令であるかどうかを判定する（１１４）。ジャンプ命令は代替的に無条件分岐命令と呼ばれることがある。制御フロー命令はジャンプ命令である、との判定に応答して、制御フローモジュール３４は、図１０で説明する技法に従ってジャンプ命令を処理する（１１６）。さもなければ、制御フロー命令はジャンプ命令ではない（すなわち、制御フロー命令が条件付き分岐命令である）、との判定に応答して、制御フローモジュール３４は、図１２および図１３で説明する技法に従って条件付き分岐命令を処理する（１１８）。
【０１４７】
[0160]図８は、本開示のプログラムモジュール固有ＭＩＮＲＣ実行技法に従って呼出し命令を処理するための例示的な技法を示す流れ図である。制御フローモジュール３４は、呼出し側プログラムに関連するＭＩＮＲＣのためのＭＩＮＲＣレジスタに記憶された値をＭＩＮＲＣスタック上にプッシュする（１２０）。制御フローモジュール３４は、ＭＩＮＲＣレジスタをサブルーチンプログラムモジュールに対応する初期値に初期化する（１２２）。言い換えれば、制御フローモジュール３４は、ＭＩＮＲＣレジスタに記憶された値を被呼出し側プログラムに関連するＭＩＮＲＣの初期値で上書きし得る。制御フローモジュール３４は、復帰アドレスを呼出しスタック上にプッシュする（１２４）。復帰アドレスは、呼出し命令の直後に行われる呼出し側プログラム中の次順の命令を示し得る。制御フローモジュール３４は、プログラムカウンタを、ターゲット命令を示す値（すなわち、ターゲットプログラムカウンタ値）に設定する（１２６）。ターゲット命令および／またはターゲットプログラムカウンタは呼出し命令中で指定され得る。
【０１４８】
[0161]図９は、本開示のプログラムモジュール固有ＭＩＮＲＣ実行技法に従って復帰命令を処理するための例示的な技法を示す流れ図である。制御フローモジュール３４は、呼出しスタックが空であるかどうかを判定する（１２８）。呼出しスタックは空である、との判定に応答して、制御フローモジュール３４はプロセスを終了する（１３０）。呼出しスタックが空である場合、これは、復帰命令がトップレベルプログラム（すなわち、メインプログラム）の終了命令であることを意味し得る。呼出しスタックは空ではない、との判定に応答して、制御フローモジュール３４は、ＭＩＮＲＣスタックからＭＩＮＲＣ値をポップオフし（１３２）、ＭＩＮＲＣレジスタをポップされたＭＩＮＲＣ値に等しく設定する（１３４）。制御フローモジュール３４は、呼出しスタックから復帰アドレスをポップオフし（１３６）、プログラムカウンタレジスタをポップされた復帰アドレスに等しく設定する（１３８）。復帰アドレスは、現在実行されている復帰命令を含むサブルーチンの実行を開始した呼出し命令の直後に行われる命令を示し得る。
【０１４９】
[0162]図１０は、本開示による、ジャンプ命令を処理するための例示的な技法を示す流れ図である。制御フローモジュール３４は、ジャンプ命令が後方ジャンプ命令であるかどうかを判定する（１４０）。いくつかの例では、制御フローモジュール３４は、ジャンプ命令についてのターゲットプログラムカウンタ値が、ジャンプ命令を識別するプログラムカウンタ値よりも大きいかどうかを判定することによって、ジャンプ命令が後方ジャンプ命令であるかどうかを判定し得る。さらなる例では、ジャンプ命令についてのターゲットプログラムカウンタ値は、ターゲット命令とジャンプ命令を識別するプログラムカウンタ値との間の差分を示し得る、相対ターゲットプログラムカウンタ値であり得る。そのような例では、制御フローモジュール３４は、ジャンプ命令についての相対ターゲットプログラムカウンタ値が０よりも小さいかどうかを判定することによって、ジャンプ命令が後方ジャンプ命令であるかどうかを判定し得る。追加の例では、前方ジャンプ命令と後方ジャンプ命令は、異なる動作コード、すなわち、オペコードを含み得る。そのような例では、制御フローモジュール３４は、命令のオペコードに基づいて、ジャンプ命令が後方ジャンプ命令であるかどうかを判定し得る。
【０１５０】
[0163]制御フローモジュール３４が、ジャンプ命令が後方ジャンプ命令であると判定した場合、制御フローモジュール３４は、少なくとも１つのスレッドがアクティブであるかどうかを判定する（１４２）。制御フローモジュール３４がどのスレッドもアクティブでないと判定した場合、制御フローモジュール３４はプログラムカウンタ２８をインクリメントする（１４４）。たとえば、制御フローモジュール３４は、次順の命令を示すプログラムカウンタ２８にロードすべきプログラムカウンタ値を選択し得る。一方、制御フローモジュール３４が、少なくとも１つのスレッドがアクティブであると判定した場合、制御フローモジュール３４はターゲット命令にジャンプする（１４６）。たとえば、制御フローモジュール３４は、プログラムカウンタ２８にロードすべき、ジャンプ命令によって識別されるターゲット命令を示すターゲットプログラムカウンタ値を選択し得る。
【０１５１】
[0164]制御フローモジュール３４が、ジャンプ命令は後方ジャンプ命令ではないと（すなわち、ジャンプ命令は前方ジャンプ命令であると）判定した場合、制御フローモジュール３４は、ターゲットプログラムカウンタ値がＭＩＮＲＣ値以下であるかどうかを判定する（１４８）。制御フローモジュール３４が、ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さくなくそれに等しくもないと判定した場合、制御フローモジュール３４はすべてのアクティブスレッドを非アクティブ化する（１５０）。いくつかの例では、制御フローモジュール３４は、アクティブスレッドのすべてを非アクティブ化するために図１１に示された技法を使用し得る。さらなる例では、アクティブスレッドを非アクティブ化することは、非アクティブ化されている各スレッドについて、それぞれのスレッドのための命令を処理するために割り当てられた処理要素１４を非アクティブ化および／または無効にすることを含み得る。制御フローモジュール３４は、続いて、ＭＩＮＲＣ値によって識別される命令にジャンプする（１５２）。たとえば、制御フローモジュール３４は、ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さくなくそれに等しくもないと判定したことに応答して、ＭＩＮＲＣ値を、プログラムカウンタ２８にロードすべき値として選択し得る。一方、制御フローモジュール３４が、ターゲットプログラムカウンタ値がＭＩＮＲＣ値以下であると判定した場合、制御フローモジュール３４はターゲット命令にジャンプする（１５４）。たとえば、制御フローモジュール３４は、ターゲットプログラムカウンタ値がＭＩＮＲＣ値以下であると判定したことに応答して、ジャンプ命令によって識別されるターゲット命令を示すターゲットプログラムカウンタ値を、プログラムカウンタ２８にロードすべき値として選択し得る。
【０１５２】
[0165]この例では、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドよりも前に実行すること（すなわち、「最小値アドレス優先」スレッド処理順序）を保証するために、制御フローモジュール３４は、ＭＩＮＲＣがターゲットプログラムカウンタ値よりも小さいとき、プログラムカウンタ２８にロードすべきＭＩＮＲＣ値を選択する。
【０１５３】
[0166]図１１は、本開示による、すべてのスレッドを非アクティブ化するための例示的な技法を示す流れ図である。いくつかの例では、図１１に示された技法は、図１０に示されたプロセスボックス１５０または図１３に示されたプロセスボックス１９８を実装するために使用され得る。制御フローモジュール３４はスレッドを選択する（１５６）。制御フローモジュール３４は、選択されたスレッドがアクティブであるかどうかを判定する（１５８）。制御フローモジュール３４が、選択されたスレッドがアクティブであると判定した場合、制御フローモジュール３４は、スレッドに関連するアクティブフラグを偽（false）の値にリセットし（１６０）、スレッドに関連するレジュームカウンタを、ジャンプ命令または分岐命令によって識別されるターゲット命令を示すターゲットプログラムカウンタ値に設定し（１６２）、判定ボックス１６４に進む。一方、制御フローモジュール３４が、選択されたスレッドがアクティブでないと判定した場合、制御フローモジュール３４は、スレッドのためのアクティブフラグをリセットすることなしに、およびスレッドのレジュームカウンタを設定することなしに、判定ボックス１６４に進む。いずれの場合も、制御フローモジュール３４は、処理すべきさらなるスレッドがあるかどうかを判定する（１６４）。制御フローモジュール３４が、処理すべきさらなるスレッドがあると判定した場合、制御フローモジュール３４は、別のスレッドを処理するためにプロセスボックス１５６に戻る。
【０１５４】
[0167]そうではなく、制御フローモジュール３４が、処理すべきさらなるアクティブスレッドがないと判定した場合、制御フローモジュール３４はＭＩＮＲＣを更新する（１６６）。たとえば、制御フローモジュール３４は、現在実行中のプログラムモジュールの実行が開始されたときにアクティブであるスレッドに対応するレジュームカウンタ値のセットからの最も小さいレジュームカウンタ値を判定し、ＭＩＮＲＣを最も小さいレジュームカウンタ値を示す値に設定し得る。いくつかの例では、制御フローモジュール３４は、ＭＩＮＲＣを更新するために図１７および図１８に示された技法のいずれかを使用し得る。
【０１５５】
[0168]ＭＩＮＲＣ値を更新した後に、制御フローモジュール３４は、非アクティブ化プロセスを終了し、呼出し側プロセス、たとえば、図１０のプロセスボックス１５２または図１３のプロセスボックス２００に戻る。図１１は、スレッドの各々を順次に非アクティブ化することによって複数のスレッドを非アクティブ化する例示的な技法を示しているが、他の例では、複数のスレッドは、たとえば、ストローブ（strobe）または共通制御ラインを使用することによって、部分的にまたは完全に並列に非アクティブ化され得る。
【０１５６】
[0169]図１２および図１３は、本開示による、分岐命令を処理するための例示的な技法を示す流れ図である。制御フローモジュール３４は、分岐命令が後方分岐命令であるかどうかを判定する（１６８）。制御フローモジュール３４が、分岐命令が後方分岐命令であるかどうかを判定し得る方式は、ジャンプ命令が後方ジャンプ命令であるかどうかを判定することについて図１０に関して上記で説明した方式と実質的に同様であり得、簡潔のために、これ以上詳細には説明しない。
【０１５７】
[0170]制御フローモジュール３４が、分岐命令が後方分岐命令であると判定した場合、制御フローモジュール３４は、少なくとも１つのスレッドがアクティブであるかどうかを判定する（１７０）。制御フローモジュール３４がどのスレッドもアクティブでないと判定した場合、制御フローモジュール３４は、プログラムカウンタ２８をインクリメントする（１７２）。たとえば、制御フローモジュール３４は、次順の命令を示すプログラムカウンタ２８にロードすべきプログラムカウンタ値を選択し得る。この例では、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドよりも前に実行することを保証するために、制御フローモジュール３４は、最低値のレジュームカウンタが検出されるまで、プログラムカウンタ値を順次に巡回し得る。
【０１５８】
[0171]一方、制御フローモジュール３４が、少なくとも１つのスレッドがアクティブであると判定した場合、制御フローモジュール３４は、ダイバージェンス条件が一様であるかどうか（すなわち、分岐条件が一様に満たされるかまたは一様に満たされないかどうか）を判定する（１７４）。制御フローモジュール３４が、ダイバージェンス条件が一様でない（すなわち、分岐がダイバージェントである）と判定した場合、制御フローモジュール３４は、分岐条件を満たさないアクティブスレッドを非アクティブ化する（１７６）。いくつかの例では、制御フローモジュール３４は、分岐条件を満たさないアクティブスレッドを非アクティブ化するために図１４に示された技法を使用し得る。さらなる例では、分岐条件を満たさないアクティブスレッドを非アクティブ化することは、非アクティブ化されている各スレッドについて、それぞれのスレッドのための命令を処理するために割り当てられた処理要素１４を非アクティブ化および／または無効にすることを含み得る。制御フローモジュール３４は、続いてターゲット命令にジャンプする（１７８）。たとえば、制御フローモジュール３４は、プログラムカウンタ２８にロードすべき、分岐命令によって識別されるターゲット命令を示すターゲットプログラムカウンタ値を選択し得る。
【０１５９】
[0172]この例では、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドよりも前に実行すること（すなわち、「最小値アドレス優先」スレッド処理順序）を保証するために、制御フローモジュール３４は、分岐条件を満たさないスレッドを非アクティブ化する。より詳細には、分岐条件を満たさないアクティブスレッドは、次順の命令を実行するようにスケジュールされ、次順の命令のプログラムカウンタ値は、ターゲット命令に関連するターゲットプログラムカウンタ値よりも大きい。したがって、後方分岐命令において、分岐条件を満たすアクティブスレッドは、分岐条件を満たさないスレッドよりも前に実行するようにスケジュールされる。
【０１６０】
[0173]判定ボックス１７４に戻ると、制御フローモジュール３４が、ダイバージェンス条件が一様であると判定した場合、制御フローモジュール３４は、分岐条件が満たされるかどうかを判定する（１８０）。制御フローモジュール３４が、分岐条件が満たされないと判定した場合、制御フローモジュール３４はプログラムカウンタ２８をインクリメントする（１８２）。たとえば、制御フローモジュール３４は、次順の命令を示すプログラムカウンタ２８にロードすべきプログラムカウンタ値を選択し得る。この場合、すべてのアクティブスレッドは、一様に満たされない分岐条件により、次順の命令を実行するようにスケジュールされるので、制御フローモジュール３４はプログラムカウンタ２８をインクリメントする。一方、制御フローモジュール３４が、分岐条件が満たされると判定した場合、制御フローモジュール３４はターゲット命令にジャンプする（１８４）。たとえば、制御フローモジュール３４は、プログラムカウンタ２８にロードすべき、分岐命令によって識別されるターゲット命令を示すターゲットプログラムカウンタ値を選択し得る。この場合、すべてのアクティブスレッドは、一様に満たされる分岐条件により、ターゲット命令を実行するようにスケジュールされるので、制御フローモジュール３４はターゲット命令にジャンプする。
【０１６１】
[0174]判定ボックス１６８に戻ると、制御フローモジュール３４が、分岐命令が後方分岐命令でないと（すなわち、分岐命令が前方分岐命令であると）判定した場合、制御フローモジュール３４は図１３の判定ボックス１８６に進み、そこで、制御フローモジュール３４は、ダイバージェンス条件が一様であるかどうか（すなわち、分岐条件が一様に満たされるかまたは一様に満たされないかどうか）を判定する（１８６）。制御フローモジュール３４が、ダイバージェンス条件が一様でない（すなわち、分岐がダイバージェントである）と判定した場合、制御フローモジュール３４は、分岐条件を満たすアクティブスレッドを非アクティブ化し得る（１８８）。いくつかの例では、制御フローモジュール３４は、分岐条件を満たすアクティブスレッドを非アクティブ化するために図１５に示された技法を使用し得る。さらなる例では、分岐条件を満たすアクティブスレッドを非アクティブ化することは、非アクティブ化されている各スレッドについて、それぞれのスレッドのための命令を処理するために割り当てられた処理要素１４を非アクティブ化および／または無効にすることを含み得る。制御フローモジュール３４はプログラムカウンタ２８をインクリメントする（１９０）。
【０１６２】
[0175]この例では、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドよりも前に実行すること（すなわち、「最小値アドレス優先」スレッド処理順序）を保証するために、制御フローモジュール３４は、分岐条件を満たすスレッドを非アクティブ化する。より詳細には、分岐条件を満たさないアクティブスレッドは、次順の命令を実行するようにスケジュールされ、次順の命令のプログラムカウンタ値は、ターゲット命令に関連するターゲットプログラムカウンタ値よりも小さい。したがって、前方分岐命令において、分岐条件を満たさないアクティブスレッドは、分岐条件を満たすスレッドよりも前に実行するようにスケジュールされる。
【０１６３】
[0176]判定ボックス１８６に戻ると、制御フローモジュール３４が、ダイバージェンス条件が一様であると判定した場合、制御フローモジュール３４は、分岐条件が満たされるかどうかを判定する（１９２）。制御フローモジュール３４が、分岐条件が満たされないと判定した場合、制御フローモジュール３４はプログラムカウンタ２８をインクリメントする（１９４）。たとえば、制御フローモジュール３４は、次順の命令を示すプログラムカウンタ２８にロードすべきプログラムカウンタ値を選択し得る。この場合、すべてのアクティブスレッドは、一様に満たされない分岐条件により、次順の命令を実行するようにスケジュールされるので、制御フローモジュール３４はプログラムカウンタ２８をインクリメントする。
【０１６４】
[0177]一方、制御フローモジュール３４が、分岐条件が満たされると判定した場合、制御フローモジュール３４は、ターゲットプログラムカウンタ値がＭＩＮＲＣ値以下であるかどうかを判定する（１９６）。制御フローモジュール３４が、ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さくなくそれに等しくもないと判定した場合、制御フローモジュール３４はすべてのアクティブスレッドを非アクティブ化する（１９８）。いくつかの例では、制御フローモジュール３４は、アクティブスレッドのすべてを非アクティブ化するために図１１に示された技法を使用し得る。さらなる例では、アクティブスレッドを非アクティブ化することは、非アクティブ化されている各スレッドについて、それぞれのスレッドのための命令を処理するために割り当てられた処理要素１４を非アクティブ化および／または無効にすることを含み得る。制御フローモジュール３４は、続いて、ＭＩＮＲＣ値によって識別される命令にジャンプする（２００）。たとえば、制御フローモジュール３４は、ターゲットプログラムカウンタ値がＭＩＮＲＣ値よりも小さくなくそれに等しくもないと判定したことに応答して、ＭＩＮＲＣ値を、プログラムカウンタ２８にロードすべき値として選択し得る。一方、制御フローモジュール３４が、ターゲットプログラムカウンタ値がＭＩＮＲＣ値以下であると判定した場合、制御フローモジュール３４はターゲット命令にジャンプする（２０２）。たとえば、制御フローモジュール３４は、ターゲットプログラムカウンタ値がＭＩＮＲＣ値以下であると判定したことに応答して、分岐命令によって識別されるターゲット命令を示すターゲットプログラムカウンタ値を、プログラムカウンタ２８にロードすべき値として選択し得る。
【０１６５】
[0178]この例では、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドよりも前に実行すること（すなわち、「最小値アドレス優先」スレッド処理順序）を保証するために、制御フローモジュール３４は、ＭＩＮＲＣがターゲットプログラムカウンタ値よりも小さいとき、プログラムカウンタ２８にロードすべきＭＩＮＲＣ値を選択する。
【０１６６】
[0179]図１４は、本開示による、分岐条件を満たさないアクティブスレッドを非アクティブ化するための例示的な技法を示す流れ図である。いくつかの例では、図１４に示された技法は、図１２に示されたプロセスボックス１７６を実装するために使用され得る。制御フローモジュール３４はアクティブスレッドを選択する（２０４）。制御フローモジュール３４は、選択されたスレッドについて分岐条件が満たされるかどうかを判定する（２０６）。制御フローモジュール３４が、選択されたスレッドについて分岐条件が満たされないと判定した場合、制御フローモジュール３４は、スレッドに関連するアクティブフラグを偽の値にリセットし（２０８）、スレッドに関連するレジュームカウンタを、次順の命令を示すプログラムカウンタ値（たとえば、「ＰＣ＋１」）に設定し（２１０）、判定ボックス２１２に進む。この場合、スレッドについて分岐条件が満たされなかったので、レジュームカウンタは次順の命令を示す値に設定される。
【０１６７】
[0180]一方、制御フローモジュール３４が、選択されたスレッドについて分岐条件が満たされると判定した場合、制御フローモジュール３４は、スレッドのためのアクティブフラグをリセットすることなしに、およびスレッドのレジュームカウンタを設定することなしに、判定ボックス２１２に進む。いずれの場合も、制御フローモジュール３４は、処理すべきさらなるアクティブスレッドがあるかどうかを判定する（２１２）。制御フローモジュール３４が、処理すべきさらなるアクティブスレッドがあると判定した場合、制御フローモジュール３４は、別のアクティブスレッドを処理するためにプロセスボックス２０４に戻る。そうではなく、制御フローモジュール３４が、処理すべきさらなるアクティブスレッドがないと判定した場合、制御フローモジュール３４はＭＩＮＲＣを更新する（２１４）。制御フローモジュール３４は、図１１のプロセスボックス１６６に関して上記で説明した方式と同様の方式でＭＩＮＲＣを更新し得る。ＭＩＮＲＣを更新した後に、制御フローモジュール３４は、非アクティブ化プロセスを終了し、呼出し側プロセス、たとえば、図１２のプロセスボックス１７８に戻る。
【０１６８】
[0181]図１５は、本開示による、分岐条件を満たすアクティブスレッドを非アクティブ化するための例示的な技法を示す流れ図である。いくつかの例では、図１５に示された技法は、図１３に示されたプロセスボックス１８８を実装するために使用され得る。制御フローモジュール３４はアクティブスレッドを選択する（２１６）。制御フローモジュール３４は、選択されたスレッドについて分岐条件が満たされるかどうかを判定する（２１８）。制御フローモジュール３４が、選択されたスレッドについて分岐条件が満たされると判定した場合、制御フローモジュール３４は、スレッドに関連するアクティブフラグを偽の値にリセットし（２２０）、スレッドに関連するレジュームカウンタを、分岐命令によって識別されるターゲット命令を示すターゲットプログラムカウンタ値に設定し（２２２）、判定ボックス２２４に進む。この場合、スレッドについて分岐条件が満たされたので、レジュームカウンタはターゲット命令を示す値に設定される。
【０１６９】
[0182]一方、制御フローモジュール３４が、選択されたスレッドについて分岐条件が満たされないと判定した場合、制御フローモジュール３４は、スレッドのためのアクティブフラグをリセットすることなしに、およびスレッドのレジュームカウンタを設定することなしに、判定ボックス２２４に進む。いずれの場合も、制御フローモジュール３４は、処理すべきさらなるアクティブスレッドがあるかどうかを判定する（２２４）。制御フローモジュール３４が、処理すべきさらなるアクティブスレッドがあると判定した場合、制御フローモジュール３４は、別のアクティブスレッドを処理するためにプロセスボックス２１６に戻る。そうではなく、制御フローモジュール３４が、処理すべきさらなるアクティブスレッドがないと判定した場合、制御フローモジュール３４はＭＩＮＲＣを更新する（２２６）。制御フローモジュール３４は、図１１のプロセスボックス１６６に関して上記で説明した方式と同様の方式でＭＩＮＲＣを更新し得る。ＭＩＮＲＣを更新した後に、制御フローモジュール３４は、非アクティブ化プロセスを終了し、呼出し側プロセス、たとえば、図１３のプロセスボックス１９０に戻る。
【０１７０】
[0183]図１６は、本開示による、スレッドを再アクティブ化するための例示的なレジュームチェック技法を示す流れ図である。いくつかの例では、図１６に示された技法は、プログラムカウンタ２８に新しいプログラムカウンタ値がロードされるたびに実行され得る。制御フローモジュール３４は非アクティブスレッドを選択する（２２８）。制御フローモジュール３４は、非アクティブスレッドのレジュームカウンタ値がプログラムカウンタ値に等しいかどうかを判定する（２３０）。制御フローモジュール３４が、非アクティブスレッドのレジュームカウンタ値がプログラムカウンタ値に等しいと判定した場合、制御フローモジュール３４は、スレッドに関連するアクティブフラグを真の値に設定し（２３２）、スレッドに関連するレジュームカウンタを最大値にし（２３４）、判定ボックス２３６に進む。最大値は、いくつかの例では、レジュームカウンタのための記憶スロットまたはレジスタ中で表され得る最も大きい値である値であり得る。
【０１７１】
[0184]一方、制御フローモジュール３４が、非アクティブスレッドのレジュームカウンタ値がプログラムカウンタ値に等しくないと判定した場合、制御フローモジュール３４は、スレッドのためのアクティブフラグを設定することなしに、およびスレッドのレジュームカウンタを設定することなしに、判定ボックス２３６に進む。いずれの場合も、制御フローモジュール３４は、処理すべきさらなる非アクティブスレッドがあるかどうかを判定する（２３６）。制御フローモジュール３４が、処理すべきさらなる非アクティブスレッドがあると判定した場合、制御フローモジュール３４は、別の非アクティブスレッドを処理するためにプロセスボックス２２８に戻る。そうではなく、制御フローモジュール３４が、処理すべきさらなる非アクティブスレッドがないと判定した場合、制御フローモジュール３４はＭＩＮＲＣを更新する（２３８）。制御フローモジュール３４は、図１１のプロセスボックス１６６に関して上記で説明した方式と同様の方式でＭＩＮＲＣを更新し得る。ＭＩＮＲＣ値を更新した後に、制御フローモジュール３４はレジュームチェックプロセスを終了する。
【０１７２】
[0185]図１７は、本開示による、ＭＩＮＲＣを更新するための例示的な技法を示す流れ図である。いくつかの例では、図１７に示された技法は、図１１に示されたプロセスボックス１６６、図１４に示されたプロセスボックス２１４、図１５に示されたプロセスボックス２２６および／または図１６に示されたプロセスボックス２３８を実装するために使用され得る。概して、図１７に示された技法は、レジュームチェック動作の一部として１つまたは複数のスレッドをアクティブ化したことに応答しておよび／またはダイバージェント分岐条件に応答して１つまたは複数のスレッドを非アクティブ化したことに応答して行われ得る、１つまたは複数のレジュームカウンタを更新したことに応答して実施され得る。
【０１７３】
[0186]制御フローモジュール３４は非アクティブスレッドを選択する（２４０）。制御フローモジュール３４は、非アクティブスレッドのレジュームカウンタ値がＭＩＮＲＣ値よりも小さいかどうかを判定する（２４２）。制御フローモジュール３４が、非アクティブスレッドのレジュームカウンタ値がＭＩＮＲＣ値よりも小さいと判定した場合、制御フローモジュール３４は、非アクティブスレッドのレジュームカウンタ値が、現在実行中のプログラムモジュールのためのエントリポイントよりも大きいかまたはそれに等しいかどうかを判定する（２４４）。現在実行中のプログラムモジュールのためのエントリポイントは、現在実行されているプログラムモジュールの開始アドレスに対応するプログラムカウンタ値を参照し得る。制御フローモジュール３４が、非アクティブスレッドのレジュームカウンタ値が、現在実行中のプログラムモジュールのためのエントリポイントよりも大きいかまたはそれに等しいと判定した場合、制御フローモジュール３４は、ＭＩＮＲＣを非アクティブスレッドのレジュームカウンタ値に等しく設定し（２４６）、判定ボックス２４８に進む。
【０１７４】
[0187]判定ボックス２４２に戻ると、制御フローモジュール３４が、非アクティブスレッドのレジュームカウンタ値がＭＩＮＲＣ値以上である（すなわち、非アクティブスレッドのレジュームカウンタ値がＭＩＮＲＣ値よりも大きいかまたはそれに等しい）と判定した場合、制御フローモジュール３４は、ＭＩＮＲＣを非アクティブスレッドのレジュームカウンタ値に等しく設定することなしに、判定ボックス２４８に進み得る。判定ボックス２４４に戻ると、制御フローモジュール３４が、非アクティブスレッドのレジュームカウンタ値が、現在実行中のプログラムモジュールのためのエントリポイントよりも大きくなくそれに等しくもない（すなわち、レジュームカウンタがエントリポイントよりも小さい）と判定した場合、制御フローモジュール３４は、ＭＩＮＲＣを非アクティブスレッドのレジュームカウンタ値に等しく設定することなしに、判定ボックス２４８に進み得る。
【０１７５】
[0188]いずれの場合も、制御フローモジュール３４は、処理すべきさらなる非アクティブスレッドがあるかどうかを判定する（２４８）。制御フローモジュール３４が、処理すべきさらなる非アクティブスレッドがあると判定した場合、制御フローモジュール３４は、別の非アクティブスレッドを処理するためにプロセスボックス２４０に戻る。そうではなく、制御フローモジュール３４が、処理すべきさらなる非アクティブスレッドがないと判定した場合、制御フローモジュール３４はＭＩＮＲＣ更新プロセスを終了する（２５０）。
【０１７６】
[0189]図１７に示された流れ図は、現在処理されているプログラミングモジュールのエントリポイントとのレジュームカウンタ値の比較に基づいてＭＩＮＲＣを更新するための技法の一例にすぎないことに留意されたい。追加の例では、判定ボックス２４２と判定ボックス２４４との順序が交換され得るか、または判定ボックス２４２と判定ボックス２４４とが同時に実施され得る。
【０１７７】
[0190]図１８は、本開示による、ＭＩＮＲＣを更新するための別の例示的な技法を示す流れ図である。いくつかの例では、図１８に示された技法は、図１１に示されたプロセスボックス１６６、図１４に示されたプロセスボックス２１４、図１５に示されたプロセスボックス２２６および／または図１６に示されたプロセスボックス２３８を実装するために使用され得る。概して、図１８に示された技法は、レジュームチェック動作の一部として１つまたは複数のスレッドをアクティブ化したことに応答しておよび／またはダイバージェント分岐条件に応答して１つまたは複数のスレッドを非アクティブ化したことに応答して行われ得る、１つまたは複数のレジュームカウンタを更新したことに応答して実施され得る。
【０１７８】
[0191]制御フローモジュール３４は非アクティブスレッドを選択する（２５２）。制御フローモジュール３４は、非アクティブスレッドのレジュームカウンタ値がＭＩＮＲＣ値よりも小さいかどうかを判定する（２５４）。制御フローモジュール３４が、非アクティブスレッドのレジュームカウンタ値がＭＩＮＲＣ値よりも小さいと判定した場合、制御フローモジュール３４は、現在実行中のプログラムモジュールの実行が開始されたとき、非アクティブスレッドが初めはアクティブであったかどうかを判定する（２５６）。たとえば、制御フローモジュール３４は、各フラグが、現在実行中のプログラムモジュールの実行が開始されたとき、それぞれのフラグに対応するスレッドがアクティブであったかどうかを示す値を記憶する、フラグのセットを維持し得る。そのような例では、制御フローモジュール３４は、現在処理されている非アクティブスレッドに対応するフラグ値が、現在実行中のプログラムモジュールの実行が開始されたとき、スレッドがアクティブであったことを示すかどうかを判定し得る。制御フローモジュール３４が、現在実行中のプログラムモジュールの実行が開始されたとき、非アクティブスレッドが初めはアクティブであったと判定した場合、制御フローモジュール３４は、ＭＩＮＲＣを非アクティブスレッドのレジュームカウンタ値に等しく設定し（２５８）、判定ボックス２６０に進む。
【０１７９】
[0192]判定ボックス２５４に戻ると、制御フローモジュール３４が、非アクティブスレッドのレジュームカウンタ値がＭＩＮＲＣ値以上である（すなわち、非アクティブスレッドのレジュームカウンタ値がＭＩＮＲＣ値よりも大きいかまたはそれに等しい）と判定した場合、制御フローモジュール３４は、ＭＩＮＲＣを非アクティブスレッドのレジュームカウンタ値に等しく設定することなしに、判定ボックス２６０に進み得る。判定ボックス２５６に戻ると、制御フローモジュール３４が、現在実行中のプログラムモジュールの実行が開始されたとき、非アクティブスレッドが初めはアクティブでなかったと判定した場合、制御フローモジュール３４は、ＭＩＮＲＣを非アクティブスレッドのレジュームカウンタ値に等しく設定することなしに、判定ボックス２６０に進み得る。
【０１８０】
[0193]いずれの場合も、制御フローモジュール３４は、処理すべきさらなる非アクティブスレッドがあるかどうかを判定する（２６０）。制御フローモジュール３４が、処理すべきさらなる非アクティブスレッドがあると判定した場合、制御フローモジュール３４は、別の非アクティブスレッドを処理するためにプロセスボックス２５２に戻る。そうではなく、制御フローモジュール３４が、処理すべきさらなる非アクティブスレッドがないと判定した場合、制御フローモジュール３４はＭＩＮＲＣ更新プロセスを終了する（２６２）。
【０１８１】
[0194]図１８に示された流れ図は、現在処理されているプログラミングモジュールのエントリポイントとのレジュームカウンタ値の比較に基づいてＭＩＮＲＣを更新するための技法の一例にすぎないことに留意されたい。追加の例では、判定ボックス２５４と判定ボックス２５６との順序が交換され得るか、または判定ボックス２５４と判定ボックス２５６とが同時に実施され得る。
【０１８２】
[0195]図１９は、本開示のサブルーチン実行技法を実装するために使用され得る例示的な制御フローモジュール３４を示すブロック図である。いくつかの例では、図１９に示された例示的な制御フローモジュール３４は、図７〜図１８に関して上記で説明した技法を実装するために使用され得る。制御フローモジュール３４は、スレッドレジスタ３０２と、アクティブフラグ３０４Ａ〜３０４Ｄ（まとめて「アクティブフラグ３０４」）と、レジュームカウンタ３０６Ａ〜３０６Ｄ（まとめて「レジュームカウンタ３０６」）と、最小レジュームカウンタ（ＭＩＮＲＣ）３０８と、レジュームチェックモジュール３１０と、分岐条件評価器３１２と、イベント情報生成器３１４と、プログラム状態レジスタ３１６と、状態遷移ブロック３１８と、スレッドディアクティベータ３２０と、サブルーチンハンドラ３２２と、呼出しスタック３２４と、ＭＩＮＲＣスタック３２６と、次命令ブロック３２８とを含む。
【０１８３】
[0196]いくつかの例では、図１９に示された例示的な制御フローモジュール３４は、図３に示された例示的な制御フローモジュール３４を実装するために使用され得る。そのような例では、図１９に示されたレジュームカウンタ３０６は図３に示されたレジュームカウンタ４６に対応し得、図１９に示されたＭＩＮＲＣ３０８は図３に示されたＭＩＮＲＣレジスタ４２に対応し得、図１９に示された分岐条件評価器３１２は図３に示された分岐条件評価器４０に対応し得、図１９に示されたサブルーチンハンドラ３２２は図３に示されたサブルーチンハンドラ５０に対応し得る。したがって、簡潔のために、および冗長を回避するために、これらの共有構成要素の構造および動作についてはさらに詳細には説明しない。その上、イベント情報生成器３１４と、プログラム状態レジスタ３１６と、状態遷移ブロック３１８と、次命令ブロック３２８とは、図３に示された次命令生成器４４の機能を実装するように構成され得る。同様に、レジュームチェックモジュール３１０と、イベント情報生成器３１４と、プログラム状態レジスタ３１６と、状態遷移ブロック３１８と、スレッドディアクティベータ３２０とは、図３に示されたスレッド状態マネージャ４８の機能を実装するように構成され得る。さらに、呼出しスタック３２４とＭＩＮＲＣスタック３２６とは、図３に示されたスタック記憶構造５２に対応し得る。
【０１８４】
[0197]スレッドレジスタ３０２は、処理システム１０中で実行しているスレッドの各々のスレッド状態を記憶するように構成される。図１９に示されているように、スレッドレジスタ３０２はアクティブフラグ３０４とレジュームカウンタ３０６とを含む。アクティブフラグ３０４の各々は、それぞれのアクティブフラグ３０４Ａ〜３０４Ｄに対応するスレッドのステータスがアクティブであるかどうかを示すアクティブフラグを記憶する。レジュームカウンタ３０６の各々は、それぞれのスレッドのレジュームカウンタ値を記憶する。いくつかの例では、各スレッドは処理要素１４の各々に割り当てられ得る。そのような例では、アクティブフラグ３０４とレジュームカウンタ３０６との各々は処理要素１４の各々に対応し得る。たとえば、アクティブフラグ３０４Ａおよびレジュームカウンタ３０６Ａは、図１に示された処理要素１４Ａにそれぞれ対応し得、アクティブフラグ３０４Ｂおよびレジュームカウンタ３０６Ｂは、図１に示された処理要素１４Ｂにそれぞれ対応し得る。図１９に示された例示的な制御フローモジュール３４は、４つのアクティブフラグ３０４と４つのレジュームカウンタ３０６とを有するシステムを示しているが、他の例では、制御フローモジュール３４は、同じまたは異なる数のアクティブフラグ３０４とレジュームカウンタ３０６とを有し得る。
【０１８５】
[0198]スレッドレジスタ３０２は、また、ＭＩＮＲＣ３０８も含む。ＭＩＮＲＣ３０８は、現在実行中のプログラムモジュールの実行が開始されたときにアクティブであったレジュームカウンタ３０６のセットからの最も小さい値を示す値を記憶するように構成される。
【０１８６】
[0199]レジュームチェックモジュール３１０は、プログラムカウンタ２８に新しいプログラムカウンタ値がロードされたことに応答してレジュームチェック動作を実施するように構成される。いくつかの例では、レジュームチェックモジュール３１０は、図１６に示されたレジュームチェック技法に従ってレジュームチェック動作を実施し得る。レジュームチェックモジュール３１０は、レジュームチェック動作を実施するために、プログラムカウンタ２８から現在プログラムカウンタ値を受信し、スレッドレジスタ３０２から現在アクティブフラグ３０４とレジュームカウンタ値３０６とを受信し得る。レジュームチェックモジュール３１０はまた、レジュームチェック動作の一部として、アクティブフラグ３０４と、レジュームカウンタ３０６と、ＭＩＮＲＣ３０８とを変更し得る。さらに、レジュームチェックモジュール３１０は、レジュームチェック動作の結果に基づいてプログラム状態レジスタ３１６を更新し得る。
【０１８７】
[0200]いくつかの例では、レジュームチェック動作を完了した後に、レジュームチェックモジュール３１０は、レジュームチェック動作が完了したことを示す信号をフェッチモジュール３０と復号モジュール３２の一方または両方に送り得る。フェッチモジュール３０が、レジュームチェック動作が完了したという信号を受信したとき、フェッチモジュール３０は、さらなる処理のために、フェッチされた命令を復号モジュール３２にフォワーディングし得る。命令を受信したことに応答して、復号モジュール３２は、アクティブフラグ３０４をチェックし、レジュームチェック動作によって変更されていることがあるアクティブフラグ３０４の現在状態に基づいて処理要素１４のアクティブおよび非アクティブステータスを更新し得る。命令が、処理要素１４に発行可能であるタイプの命令である場合、復号モジュール３２は、処理要素１４のアクティブおよび非アクティブステータスを更新するとともにまたはその後に、処理要素１４に命令を発行し得る。例示的な制御フローモジュール３４では、レジュームチェック動作の完了時にフェッチモジュール３０にシグナリングするものとしてレジュームチェックモジュール３１０を示しているが、他の例では、レジュームチェックモジュール１５８は、レジュームチェックが完了したことを示す信号を復号モジュール３２に送り得る。そのような例では、復号モジュール３２が信号を受信したとき、復号モジュール３２は、アクティブフラグ３０４をチェックし、アクティブフラグ３０４の現在状態に基づいて処理要素１４のアクティブおよび非アクティブステータスを更新し得る。
【０１８８】
[0201]復号モジュール３２が命令を復号するとき、復号モジュール３２が、命令が分岐命令（すなわち、条件付き分岐命令）であると判定した場合、復号モジュール３２は、現在命令が条件付き分岐命令であることを示す信号を分岐条件評価器３１２に送り、さらなる処理のために、分岐条件を示す情報を分岐条件評価器３１２に与え得る。いくつかの例では、復号モジュール３２が、命令が分岐命令でない（たとえば、ジャンプ命令、サブルーチン命令、またはシーケンシャル命令）と判定した場合、復号モジュール３２は、現在命令が条件付き分岐命令でないことを示す信号を分岐条件評価器１６０に送り得る。
【０１８９】
[0202]復号モジュール３２は、さらなる処理のためにイベント情報生成器１６２に制御情報を与える。いくつかの例では、制御情報は命令自体であり得る。さらなる例では、制御情報は、たとえば、命令が制御フロー命令であるのかシーケンシャル命令であるのかを示す情報、命令が制御フロー命令である場合、命令が分岐命令であるのかジャンプ命令であるのか呼出し命令であるのか復帰命令であるのかを示す情報、および命令が分岐命令またはジャンプ命令である場合、分岐命令またはジャンプ命令が、前方分岐命令または前方ジャンプ命令であるのか後方分岐命令または後方ジャンプ命令であるのかを示す情報、および命令が分岐命令である場合、分岐条件を指定する情報などの情報を含み得る。
【０１９０】
[0203]現在処理されている命令が条件付き分岐命令である場合、分岐条件評価器３１２は、各アクティブスレッドについて分岐条件を評価し得る。いくつかの例では、分岐条件評価器３１２は、通信経路２２を介して処理要素１４から比較演算またはゼロチェック演算の結果を受信し得る。さらなる例では、分岐条件評価器３１２は、通信経路２４を介してデータストア１８中の１つまたは複数のレジスタにアクセスし、比較演算またはゼロチェック演算を実施し得る。いずれの場合も、分岐条件評価器３１２は、各アクティブスレッドについて分岐条件が満たされるのか満たされないのかを判定し得る。いくつかの例では、分岐条件評価器３１２は、各アクティブスレッドについて分岐条件が満たされるのか満たされないのかを示す情報をイベント情報生成器３１４にフォワーディングし得る。追加の例では、分岐条件評価器３１２は、現在命令の分岐ダイバージェンスが一様であるのかダイバージェントであるのかを判定し、分岐ダイバージェンスが一様であるのかダイバージェントであるのかを示す情報をイベント情報生成器３１４にフォワーディングし得る。さらなる例では、分岐命令についての分岐ダイバージェンスが一様である場合、分岐条件評価器３１２は、分岐条件が一様に満たされるのか一様に満たされないのかを判定し、分岐条件が一様に満たされるのか一様に満たされないのかを示す情報をイベント情報生成器３１４にフォワーディングし得る。
【０１９１】
[0204]イベント情報生成器３１４は、復号モジュール３２から制御情報を受信し、現在処理されている命令が分岐命令である場合、分岐条件評価器３１２から分岐条件情報を受信する。いくつかの例では、イベント情報生成器３１４は、また、現在処理されている命令が分岐命令である場合、分岐条件評価器３１２から分岐ダイバージェンス情報を受信し得る。イベント情報生成器３１４が分岐条件評価器３１２から分岐ダイバージェンス情報を受信しない場合、イベント情報生成器３１４は、現在命令の分岐ダイバージェンスが一様であるのかダイバージェントであるのかを判定し得る。イベント情報生成器３１４はまた、現在処理されている命令のターゲットプログラムカウンタ値がＭＩＮＲＣ３０８以下であるかどうかを判定し得る。イベント情報生成器３１４は、受信した情報に基づいてイベントを生成し、それらのイベントを状態遷移ブロック３１８と、スレッドディアクティベータ３２０と、サブルーチンハンドラ３２２と、次命令ブロック３２８とに与える。
【０１９２】
[0205]いくつかの例では、イベント情報生成器３１４は以下のイベントを生成し得る。  
Ｊｂ：ジャンプ後方（Jump backward）命令  
ＪｆＬ：ジャンプ前方（Jump forward）命令、ターゲットがＭＩＮＲＣよりも小さいかまたはそれに等しい  
ＪｆＧ：ジャンプ前方命令、ターゲットがＭＩＮＲＣよりも大きい  
ＢｂｕＴ：分岐後方（Branch backward）命令、すべてのスレッドが一様であり、条件が真である  
ＢｂｕＦ：分岐後方命令、すべてのスレッドが一様であり、条件が偽である  
ＢｆｕＴＬ： 分岐前方（Branch forward）命令、すべてのスレッドが一様であり、条件が真であり、ターゲットがＭＩＮＲＣよりも小さいかまたはそれに等しい  
ＢｆｕＴＧ：分岐前方命令、すべてのスレッドが一様であり、条件が真であり、ターゲットがＭＩＮＲＣよりも大きい  
ＢｆｕＦ：分岐前方命令、すべてのスレッドが一様であり、条件が偽である  
Ｂｂｄ：分岐後方命令、スレッドがダイバージェントである  
Ｂｆｄ：分岐前方命令、スレッドがダイバージェントである  
Ｓ：シーケンシャル命令  
Ｃａｌｌ：サブルーチンエントリロケーションにジャンプする  
Ｒｅｔ：呼出し側における呼出しの直後に次命令にジャンプする  
上記で特定されたイベントによれば、命令は、シーケンシャル命令（Ｓ）、ジャンプ命令（Ｊ）、分岐命令（Ｂ）、呼出し命令（Ｃａｌｌ）、または復帰命令（Ｒｅｔ）であり得る。ジャンプ命令または分岐命令の場合、ジャンプ方向または分岐方向は、後方（ｂ）または前方（ｆ）のいずれかであり得る。分岐命令の場合、分岐ダイバージェンスは、一様（ｕ）またはダイバージェント（ｄ）のいずれかであり得る。分岐命令の場合、分岐条件は、真（Ｔ）または偽（Ｆ）のいずれかであり得る。真の分岐条件は、満たされる分岐条件に対応し得、偽の分岐条件は、満たされない分岐条件に対応し得る。前方ジャンプ範囲は、ターゲットがＭＩＮＲＣよりも大きいかどうかに依存し得る。したがって、比較結果は、ターゲットがＭＩＮＲＣ（Ｌ）よりも小さいかまたはそれに等しいこと、あるいはターゲットがＭＩＮＲＣ（Ｇ）よりも大きいことを示すように定義され得る。
【０１９３】
[0206]プログラム状態レジスタ３１６は、処理システム１０中で実行しているプログラムのプログラム状態を記憶し得る。いくつかの例では、プログラム状態レジスタ３１６は以下の３つの状態を記憶し得る。  
状態０：すべてのスレッドがアクティブである。  
状態１：少なくとも１つのスレッドがアクティブであり、少なくとも１つのスレッドが非アクティブである。  
状態２：すべてのスレッドが非アクティブである。  
いくつかの例では、処理システム１０は、プログラムの初期状態および最終状態がそれぞれ状態０であるように構成され得る。
【０１９４】
[0207]状態遷移ブロック３１８は、イベント情報生成器３１４からのイベントと、プログラム状態レジスタ３１６からの現在プログラム状態とを受信し、受信したイベントと現在プログラム状態とに基づいて新しいプログラム状態を生成し、新しいプログラム状態をプログラム状態レジスタ３１６に記憶し得る。状態遷移ブロック３１８は、図２０に関してさらに詳細に説明する状態遷移図に従って、および／または図２１に関してさらに詳細に説明する状態遷移表に従って新しいプログラム状態を生成し得る。
【０１９５】
[0208]スレッドディアクティベータ３２０は、イベント情報生成器３１４からのイベントと、プログラム状態レジスタ３１６からの現在プログラム状態とを受信し、イベントと現在プログラム状態とに基づいて１つまたは複数のスレッドを非アクティブ化すべきかどうかを判定し、イベントと現在プログラム状態とのいくつかの組合せに応答して１つまたは複数のスレッドを非アクティブ化し得る。スレッドを非アクティブ化するとき、スレッドディアクティベータ３２０は、非アクティブ化されているスレッドについてアクティブフラグ３０４とレジュームカウンタ３０６とを更新し得る。スレッドディアクティベータ３２０は、図２１に関してさらに詳細に説明する状態遷移表に従ってスレッドを非アクティブ化し得る。
【０１９６】
[0209]サブルーチンハンドラ３２２は、イベント情報生成器３１４からイベントを受信し、受信したイベントに基づいて呼出しスタック３２４と、ＭＩＮＲＣスタック３２６と、ＭＩＮＲＣ３０８とを管理し得る。たとえば、Ｃａｌｌイベントを受信したことに応答して、サブルーチンハンドラ３２２は、ＭＩＮＲＣ３０８に現在記憶されているＭＩＮＲＣ値をＭＩＮＲＣスタック３２６上にプッシュし、ＭＩＮＲＣ３０８をデフォルト値に初期化し得る。ＭＩＮＲＣ３０８をデフォルト値に初期化することは、ＭＩＮＲＣ３０８に以前に記憶されていた呼出し側プログラムに対応するＭＩＮＲＣ値を上書きすることを含み得る。また、Ｃａｌｌイベントを受信したことに応答して、サブルーチンハンドラ３２２は、復帰アドレスを呼出しスタック３２４上にプッシュし得る。復帰アドレスは、現在処理されている呼出し命令の直後に行われる呼出し側プログラム中の次順の命令に対応し得る。
【０１９７】
[0210]Ｒｅｔイベントを受信したことに応答して、サブルーチンハンドラ３２２は、ＭＩＮＲＣスタック３２６から直近に記憶されたＭＩＮＲＣ値をポップオフし、ポップされたＭＩＮＲＣ値をＭＩＮＲＣ３０８に記憶し得る。ポップされたＭＩＮＲＣ値をＭＩＮＲＣ３０８に記憶することは、ＭＩＮＲＣ３０８に以前に記憶されていた被呼出し側サブルーチンプログラムに対応するＭＩＮＲＣ値を上書きすることを含み得る。また、Ｒｅｔイベントを受信したことに応答して、サブルーチンハンドラ３２２は、呼出しスタック３２４から直近に記憶された復帰アドレスをポップオフし、ポップされた復帰アドレスに対応する値をプログラムカウンタ２８にロードさせ得る。たとえば、サブルーチンハンドラ３２２は、ポップされた復帰アドレスを次命令ブロック３２８に受け渡し得、次命令ブロック３２８は、次命令サイクルでプログラムカウンタ２８にロードすべき、ポップされた復帰アドレスに対応するプログラムカウンタ値を選択し得る。
【０１９８】
[0211]次命令ブロック３２８は、イベント情報生成器３１４からのイベントと、プログラム状態レジスタ３１６からの現在プログラム状態とを受信し、プログラムカウンタ２８にロードすべき新しいプログラムカウンタ値を判定し、新しいプログラムカウンタ値をプログラムカウンタ２８にロードし得る。新しいプログラムカウンタ値は、制御ユニット１２によって処理されるべき次命令を示し得る。次命令ブロック３２８は、図２１に関してさらに詳細に説明する状態遷移表に従って新しいプログラムカウンタ値を判定し得る。
【０１９９】
[0212]上記で説明したように、レジュームチェックモジュール３１０は、レジュームチェック動作の結果に基づいてプログラム状態レジスタ３１６を更新し得る。この更新は、非同期的にレジュームチェックモジュール３１０によって実施され得る。たとえば、レジュームチェック動作を実施する前にプログラム状態が状態１であり、すべての非アクティブスレッドが再アクティブ化された場合、プログラム状態レジスタ３１６は、すべてのスレッドがアクティブ化されたことを反映するために、非同期的にプログラム状態レジスタ３１６を状態０に変更し得る。状態遷移ブロック３１８は、レジュームチェックモジュール３１０による更新の後に利用可能である現在プログラム状態に基づいて新しいプログラム状態を生成することに留意されたい。同様に、スレッドディアクティベータ３２０は、レジュームチェックモジュール３１０による更新の後に利用可能である現在プログラム状態に基づいて、１つまたは複数のスレッドを非アクティブ化すべきかどうかを判定し、次命令ブロック３２８は、レジュームチェックモジュール３１０による更新の後に利用可能である現在プログラム状態に基づいて新しいプログラムカウンタ値を判定する。したがって、プログラム状態は、レジュームチェックにより単一の処理サイクル中に２つの異なる状態間で変化し得るが、処理サイクルの最終状態、すなわち、レジュームチェックが完了した後に発生する状態が、状態遷移ブロック３１８と、スレッドディアクティベータ３２０と、次命令ブロック３２８との各々による処理のために現在プログラム状態として使用される。
【０２００】
[0213]いくつかの例では、制御フローモジュール３４中の構成要素の各々は、プロセッサ内の１つまたは複数のハードウェア構成要素として実装され得る。たとえば、スレッドレジスタ３０２、アクティブフラグ３０４、レジュームカウンタ３０６、ＭＩＮＲＣ３０８、プログラム状態レジスタ３１６、呼出しスタック３２４、および／またはＭＩＮＲＣスタック３２６は、それぞれ１つまたは複数のハードウェアレジスタとして実装され得る。別の例として、レジュームチェックモジュール３１０、分岐条件評価器３１２、イベント情報生成器３１４、状態遷移ブロック３１８、スレッドディアクティベータ３２０、サブルーチンハンドラ３２２および／または次命令ブロック３２８は、組合せ論理ハードウェアとして、および／または組合せ論理ハードウェアおよびハードウェアレジスタの組合せとして実装され得る。
【０２０１】
[0214]図２０は、本開示による、図１９に示された制御フローモジュール３４の例示的な動作を特徴づける状態遷移図である。図２０に示された矢印は、円によって識別される異なる状態間の遷移を表す。矢印は、イベント情報生成器３１４によって生成されるイベントとレジュームイベントの一方または両方に関連する。レジュームイベントは、１つまたは複数のスレッドが再アクティブ化されるレジュームチェック動作の結果として起こる非同期状態遷移であり得る。イベント情報生成器３１４によって生成される残りのイベントに関連する状態遷移は同期状態遷移であり得る。同期状態遷移は、処理サイクルと処理サイクルの間に起こり得、非同期状態遷移は処理サイクル中に起こり得る。レジュームチェックに起因して処理サイクル中に非同期状態遷移が起きた場合、非同期遷移の後に発生する状態は、次処理サイクルについての次状態を決定するために使用される。
【０２０２】
[0215]図２１は、本開示による、図１９に示された制御フローモジュール３４の例示的な動作を特徴づける状態遷移表である。図２１の状態遷移表は、現在のプログラム状態を表す「古い状態（OLD STATE）」列と、次処理サイクルについての新しいプログラム状態またはレジュームチェック動作に起因する非同期遷移の後に発生するプログラム状態のいずれかを表す「新しい状態（NEW STATE）」列とを含む。状態遷移表は、また、イベント情報生成器３１４によって生成されるイベントを含む「イベント（EVENT）」列をも含む。「イベント」列中のインジケータ「ｎ／ａ」は、レジュームチェック動作に起因して状態遷移およびアクションが起こることと、イベントがそのような遷移に関して無関係であることとを意味する。状態遷移表は、また、現在のプログラム状態とイベントとの特定の組合せに応答してどんなアクションが行われるかを示す「アクション（ACTION）」列をも含む。「アクション」列中の「レジューム」と標示されたアクションは、レジュームチェック動作に起因して非同期状態遷移が起こることを意味する。
【０２０３】
[0216]図２０および図２１に示されているように、状態遷移ブロック３１８は、現在の状態が状態０であることと、Ｓイベント、Ｊｂイベント、ＢｆｕＦイベント、ＢｂｕＴイベント、ＢｂｕＦイベント、ＪｆＬイベント、ＢｆｕＴＬイベント、Ｃａｌｌイベント、またはＲｅｔイベントを受信したこととに応答して、プログラム状態レジスタ３１６にロードすべき新しい状態として状態０を選択する。状態遷移ブロック３１８は、現在の状態が状態０であることと、ＢｂｄイベントまたはＢｆｄイベントを受信したこととに応答して、プログラム状態レジスタ３１６にロードすべき新しい状態として状態１を選択する。状態遷移ブロック３１８はまた、現在の状態が状態１であることと、Ｓイベント、Ｊｂイベント、ＢｂｕＦイベント、ＢｂｕＴイベント、ＢｆｕＦイベント、Ｂｂｄイベント、Ｂｆｄイベント、ＪｆＬイベント、ＢｆｕＴＬイベント、Ｃａｌｌイベント、またはＲｅｔイベントを受信したこととに応答して、プログラム状態レジスタ３１６にロードすべき新しい状態として状態１を選択する。状態遷移ブロック３１８は、現在状態が状態１であることと、ＪｆＧイベントまたはＢｆｕＴＧイベントを受信したこととに応答して、プログラム状態レジスタ３１６にロードすべき新しい状態として状態２を選択する。状態遷移ブロック３１８はまた、現在状態が状態２であることと、何らかのイベントを受信したこととに応答して、プログラム状態レジスタ３１６にロードすべき新しい状態として状態２を選択する。レジュームチェック動作の一部として１つまたは複数のスレッドを再アクティブ化したことに応答して、状態遷移ブロック３１８は、非同期的に状態０または状態１に遷移し得る。
【０２０４】
[0217]図２４に示されているように、スレッドディアクティベータ３２０は、現在状態が状態０または状態１のいずれかであることと、ＢｂｄイベントまたはＢｆｄイベントを受信したこととに応答して、１つまたは複数のスレッドを非アクティブ化することを決定し得る。ＢｂｄイベントおよびＢｆｄイベントは、分岐命令についての分岐条件の評価に起因するダイバージェンスイベントと呼ばれることがある。スレッドディアクティベータ３２０は、Ｂｂｄイベントを受信したことに応答して、分岐条件を満たさない（すなわち、偽の条件の）すべてのアクティブスレッドを非アクティブ化することと、Ｂｆｄイベントを受信したことに応答して、分岐条件を満たす（すなわち、真の条件の）すべてのアクティブスレッドを非アクティブ化することとを決定し得る。スレッドディアクティベータ３２０は、分岐条件を満たさないすべてのアクティブスレッドを非アクティブ化するために図１４に示された技法を利用し、分岐条件を満たすすべてのアクティブスレッドを非アクティブ化するために図１５に示された技法を利用し得る。スレッドディアクティベータ３２０は、現在状態が状態１であることと、ＪｆＧイベントまたはＢｆｕＴＧイベントを受信したこととに応答して、すべてのアクティブスレッドを非アクティブ化することを決定し得る。スレッドディアクティベータ３２０は、すべてのアクティブスレッドを非アクティブ化するために図１１に示された技法を利用し得る。
【０２０５】
[0218]図２４に示されているように、次命令ブロック３２８は、現在プログラム状態およびイベントの様々な組合せに応答して、プログラムカウンタ２８にロードすべき、以下のプログラムカウンタ値、すなわち、（１）次順の命令を示すプログラムカウンタ値（すなわち、「ＰＣ＋１」）と、（２）ターゲット命令を示すプログラムカウンタ値（すなわち、ターゲットプログラムカウンタ値）と、（３）最小レジュームカウンタ値（ＭＩＮＲＣ）、または復帰アドレスを示すプログラムカウンタ値と、のうちの１つを選択し得る。たとえば、次命令ブロック３２８は、現在状態が状態０であることと、Ｓイベント、ＢｆｕＦイベント、ＢｂｕＦイベント、またはＢｆｄイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、次順の命令を示すプログラムカウンタ値（すなわち、「ＰＣ＋１」）を選択し得る。次命令ブロック３２８はまた、現在状態が状態１であることと、Ｓイベント、ＢｂｕＦイベント、ＢｆｕＦイベント、またはＢｆｄイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、次順の命令を示すプログラムカウンタ値を選択し得る。次命令ブロック３２８はまた、現在状態が状態２であることと、ＪｆＬイベントまたはＪｆＧイベント以外の何らかのイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、次順の命令を示すプログラムカウンタ値を選択し得る。
【０２０６】
[0219]次命令ブロック３２８は、現在状態が状態０であることと、Ｊｂイベント、ＢｂｕＴイベント、ＪｆＬイベント、ＢｆｕＴＬイベント、Ｂｂｄイベント、またはＣａｌｌイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、ターゲット命令を示すプログラムカウンタ値（すなわち、ターゲットプログラムカウンタ値）を選択し得る。イベントがＣａｌｌイベントである場合、ターゲット命令はサブルーチンエントリポイントに対応し得る。次命令ブロック３２８はまた、現在状態が状態１であることと、Ｊｂイベント、ＢｂｕＴイベント、Ｂｂｄイベント、ＪｆＬイベント、ＢｆｕＴＬイベント、またはＣａｌｌイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、ターゲット命令を示すプログラムカウンタ値を選択し得る。次命令ブロック３２８はまた、現在状態が状態２であることと、ＪｆＬイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、ターゲット命令を示すプログラムカウンタ値を選択し得る。
【０２０７】
[0220]次命令ブロック３２８は、現在状態が状態１であることと、ＪｆＧイベントまたはＢｆｕＴＧイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべきＭＩＮＲＣ値を選択し得る。次命令ブロック３２８はまた、現在状態が状態２であることと、ＪｆＧイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべきＭＩＮＲＣ値を選択し得る。
【０２０８】
[0221]次命令ブロック３２８は、現在状態が状態０であることと、Ｒｅｔイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、復帰アドレスを示すプログラムカウンタ値を選択し得る。次命令ブロック３２８はまた、現在状態が状態１であることと、Ｒｅｔイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、復帰アドレスを示すプログラムカウンタ値を選択し得る。
【０２０９】
[0222]図２２〜図２８に、本開示のサブルーチン実行技法を実装するための例示的な擬似コードを示す。詳細には、図２２は、本開示による、レジュームチェック動作を実装するための例示的な擬似コードを示している。いくつかの例では、図２２に示された擬似コードは、図１６に示された流れ図に対応し得る。図２３は、本開示による、ジャンプ命令処理を実装するための例示的な擬似コードを示している。いくつかの例では、図２３に示された擬似コードは、図１０および図１１に示された流れ図に対応し得る。図２４は、本開示による、分岐命令処理を実装するための例示的な擬似コードを示している。いくつかの例では、図２４に示された擬似コードは、図１１〜図１５に示された流れ図に対応し得る。
【０２１０】
[0223]図２５は、本開示による、呼出し命令処理を実装するための例示的な擬似コードを示している。いくつかの例では、図２５に示された擬似コードは、図８に示された流れ図に対応し得る。図２５に示されているように、制御フローユニット３４は、呼出し側プログラムに対応するＭＩＮＲＣの状態を保存するために、呼出し側プログラムのためのＭＩＮＲＣレジスタ４２に記憶された値をスタック記憶構造５２中のＭＩＮＲＣスタック上にプッシュし得る。さらに、制御フローユニット３４は、ＭＩＮＲＣレジスタ４２に記憶された値をデフォルト値（すなわち、「ＭＡＸ」）で上書きし得る。デフォルト値は、被呼出し側プログラムのためのＭＩＮＲＣを初期化するために使用され得る。被呼出し側プログラムのＭＩＮＲＣは、サブルーチンの実行が開始されたときにアクティブであるすべてのスレッドのための最も小さいレジュームカウンタに対応するので、被呼出し側プログラムのためのＭＩＮＲＣを計算するために使用されるすべてのレジュームカウンタは、被呼出し側プログラムのＭＩＮＲＣが初期化されたとき、アクティブスレッドに関連付けられる。上記で説明したように、スレッドがアクティブであるとき、レジュームカウンタは、この事例では「ＭＡＸ」によって示されている、「無限値」（たとえば、最大レジスタ値）に等しくなり得る。したがって、初期化されたときに、被呼出し側プログラムのためのＭＩＮＲＣは「ＭＡＸ」に等しく、それは、被呼出し側プログラムが実行を開始したときにアクティブスレッドに関連するすべてのレジュームカウンタの値である。被呼出し側プログラムの実行が進むにつれて、１つまたは複数のスレッドが非アクティブ化され、それにより、ＭＩＮＲＣが次いで他の値に更新され得る。
【０２１１】
[0224]呼出し命令は、被呼出し側サブルーチンの第１の命令に対応するターゲットプログラム命令を示すターゲット値を含み得る。呼出し命令を実行するとき、制御フローユニット３４は、プログラムカウンタ２８に、被呼出し側サブルーチンのターゲット命令に対応する値をロードし得る。また、呼出し命令を実行するとき、制御フローユニット３４は、呼出し側プログラム中の呼出し命令の後の次順の命令に対応する復帰アドレスをスタック記憶構造５２中の呼出しスタック上にプッシュし得る。
【０２１２】
[0225]擬似コードにおいて指定された呼出しスタックは、はじめは、メインプログラムへのエントリポイントにおいて空であり得る。復帰アドレスを呼出しスタック上にプッシュすることに加えて、他の状態変数も、呼出し命令の実行時に呼出しスタック上にプッシュされ、復帰命令の実行後に呼出しスタックからポップオフされ得る。
【０２１３】
[0226]図２６は、本開示による、復帰命令処理を実装するための例示的な擬似コードを示している。いくつかの例では、図２６に示された擬似コードは、図９に示された流れ図に対応し得る。図２６に示されているように、制御フローユニット３４は、スタック記憶構造５２中のＭＩＮＲＣスタックから直近に保存されたＭＩＮＲＣ値をポップオフし得る。直近に保存されたＭＩＮＲＣ値は、呼出し側プログラムに対応するＭＩＮＲＣの保存状態に対応し得る。制御フローユニット３４は、ＭＩＮＲＣレジスタ４２に記憶された値をポップされたＭＩＮＲＣ値で上書きし得る。さらに、制御フローユニット３４は、スタック記憶構造５２中の呼出しスタックから直近に保存された復帰アドレスをポップし、ポップされた復帰アドレスに対応する値をプログラムカウンタ２８にロードし得る。
【０２１４】
[0227]復帰命令を実行した後、ＭＩＮＲＣレジスタ４２は、サブルーチン呼出し命令を実行する前の状態に復元される。上記で説明したように、スタック上にＭＩＮＲＣ値をプッシュし、スタックからＭＩＮＲＣ値をポップオフすることによって、本開示の技法は、いくつかの例では、わずか１つのＭＩＮＲＣレジスタ４２を維持しながら、サブルーチン固有ＭＩＮＲＣを実装することが可能であり得る。
【０２１５】
[0228]上記に再現した例示的な擬似コードは、復帰アドレスの状態とＭＩＮＲＣの状態とを２つの異なるスタックに保存する。すなわち、復帰アドレスは呼出しスタック上にプッシュされ、ＭＩＮＲＣはＭＩＮＲＣスタック上にプッシュされる。他の例では、しかしながら、復帰アドレスおよびＭＩＮＲＣは、単一のスタックフレームの一部として同じスタック上にプッシュされ得る。
【０２１６】
[0229]図２７は、本開示による、ＭＩＮＲＣ更新動作を実施するための例示的な擬似コードを示している。いくつかの例では、図２７に示された擬似コードは、図１７に示された流れ図に対応し得る。図２７に示されているように、制御フローユニット３４は、処理システム１０中で実行しているすべての非アクティブスレッドに関連するレジュームカウンタのすべてを巡回する。各非アクティブスレッドについて、以下の条件の両方、すなわち、（１）非アクティブスレッドのレジュームカウンタ値が現在ＭＩＮＲＣ値よりも小さいことと、（２）非アクティブスレッドのレジュームカウンタ値がサブルーチンのエントリポイント（すなわち、サブルーチンの開始アドレスに対応するプログラムカウンタ値）よりも大きいかまたはそれに等しいこととが満たされる場合、制御フローユニット３４は、ＭＩＮＲＣをそれぞれの非アクティブスレッドに対応するレジュームカウンタ値に等しく設定し得る。非アクティブスレッドのレジュームカウンタ値がサブルーチンのエントリポイントよりも大きいかまたはそれに等しいかどうかをＭＩＮＲＣの更新の条件とすることによって、図２７に示されたＭＩＮＲＣ更新動作は、サブルーチンの実行を開始するよりも前に非アクティブであったスレッドに関連する１つまたは複数のレジュームカウンタが、得られたＭＩＮＲＣ値に影響を及ぼすのを防止し得る。このようにして、制御フローユニット３４は、サブルーチン固有ＭＩＮＲＣのための更新されたＭＩＮＲＣ値が、サブルーチンのために割り当てられたプログラム空間内にあることを保証し得る。
【０２１７】
[0230]図２８は、本開示による、ＭＩＮＲＣ更新動作を実施するための例示的な擬似コードを示している。いくつかの例では、図２７に示された擬似コードは、図１８に示された流れ図に対応し得る。図２８に示されているように、制御フローユニット３４は、処理システム１０中で実行しているすべての非アクティブスレッドに関連するレジュームカウンタのすべてを巡回する。各非アクティブスレッドについて、以下の条件の両方、すなわち、（１）非アクティブスレッドのレジュームカウンタ値が現在ＭＩＮＲＣ値よりも小さいことと、（２）それぞれの非アクティブスレッドに関連するフラグが、サブルーチンプログラムの実行が開始されたときにスレッドがアクティブであったことを示すこととが満たされる場合、制御フローユニット３４は、ＭＩＮＲＣをそれぞれの非アクティブスレッドに対応するレジュームカウンタ値に等しく設定し得る。したがって、上記で説明したＭＩＮＲＣ更新動作は、サブルーチンプログラムの実行が開始されたときに非アクティブであったスレッドに関連するレジュームカウンタを効果的に除外する。このようにして、制御フローユニット３４は、サブルーチン固有ＭＩＮＲＣのための更新されたＭＩＮＲＣ値が、サブルーチンのために割り当てられたプログラム空間内にあることを保証し得る。
【０２１８】
[0231]図２９は、本開示による、プログラムモジュール固有ＭＩＮＲＣに基づいて処理システムを制御するための例示的な技法を示す流れ図である。制御ユニット１２が、第１のＭＩＮＲＣに基づいてプログラムの実行を制御する（３３０）。第１のＭＩＮＲＣは、複数のスレッドに関連する複数のレジュームカウンタ値のうちの最も小さいレジュームカウンタ値を示す値を指定する。制御ユニット１２は、サブルーチンに関連する第２のＭＩＮＲＣに基づいてプログラムのサブルーチンの実行を制御する（３３２）。第２のＭＩＮＲＣは、サブルーチンの実行が開始されたときにアクティブであるスレッドのすべてに対応する複数のレジュームカウンタ値のサブセットからの最も小さいレジュームカウンタ値を示す値を指定する。いくつかの例では、ＭＩＮＲＣに基づいてプログラムモジュール（たとえば、メインプログラムまたはサブルーチン）の実行を制御することは、ＭＩＮＲＣに基づいてすべてのアクティブスレッドについて分岐条件が満たされる前方ジャンプ命令または前方分岐命令に応答して実行すべき次命令を選択することを含み得る。
【０２１９】
[0232]いくつかの例では、レジュームカウンタ値の各々は、それぞれのレジュームカウンタ値に対応するスレッドの各々が非アクティブである場合、スレッドの各々がアクティブ化されるようにスケジュールされたプログラムカウンタ値を示し得る。さらなる例では、それぞれのレジュームカウンタ値に対応するスレッドの各々がアクティブである場合、レジュームカウンタ値の各々はデフォルト値に等しい。
【０２２０】
[0233]図３０は、本開示による、サブルーチン呼出し命令を実行するための例示的な技法を示す流れ図である。制御ユニット１２が呼出し命令を実行する（３３４）。呼出し命令を実行したことに応答して、制御ユニット１２は、呼出し側プログラムに対応する第１のＭＩＮＲＣの状態を保存する（３３６）。たとえば、制御ユニット１２は、ＭＩＮＲＣレジスタ４２に記憶された値をスタック記憶構造５２上にプッシュし得る。呼出し命令を実行したことに応答して、制御ユニット１２は、被呼出し側サブルーチンプログラムに対応する第２のＭＩＮＲＣに基づいて被呼出し側サブルーチンプログラムの実行を制御させる（３３８）。すなわち、制御ユニット１２は、サブルーチンプログラムの実行を制御するために（たとえば、すべてのアクティブスレッドについて分岐条件が満たされる前方ジャンプ命令または前方分岐命令に応答して次命令の選択を制御するために）第２のＭＩＮＲＣを使用させ得る。いくつかの例では、サブルーチンプログラムの実行を制御するために第２のＭＩＮＲＣを使用させるために、制御ユニット１２は、ＭＩＮＲＣレジスタ４２が、被呼出し側プログラムに対応する第２のＭＩＮＲＣのための初期ＭＩＮＲＣ値を記憶するように、ＭＩＮＲＣレジスタ４２を初期化し得る。ＭＩＮＲＣレジスタ４２を初期化することは、いくつかの例では、第１のＭＩＮＲＣに対応するＭＩＮＲＣレジスタ４２に記憶された値を第２のＭＩＮＲＣに対応する初期ＭＩＮＲＣ値で上書きすることを含み得る。ＭＩＮＲＣレジスタ４２に記憶された初期ＭＩＮＲＣ値はデフォルトＭＩＮＲＣ値（たとえば、最大レジスタ値、またはプログラムのために必要とされるプログラムカウンタ範囲よりも大きい値）であり得る。
【０２２１】
[0234]図３１は、本開示による、サブルーチン復帰命令を実行するための例示的な技法を示す流れ図である。制御ユニット１２が復帰命令を実行する（３４０）。復帰命令を実行したことに応答して、制御ユニット１２は、現在実行されているサブルーチンの呼出し側プログラムに対応する第１のＭＩＮＲＣの保存状態を復元する（３４２）。たとえば、制御ユニット１２は、第１のＭＩＮＲＣの保存状態に対応するスタック記憶構造５２に記憶されたＭＩＮＲＣ値をポップし得る。復帰命令を実行したことに応答して、制御ユニット１２は、呼出し側プログラムに対応する第１のＭＩＮＲＣに基づいて呼出し側プログラムの実行を制御させる（３４４）。すなわち、制御ユニット１２は、呼出し側プログラムの実行を制御するために（たとえば、すべてのアクティブスレッドについて分岐条件が満たされる前方ジャンプ命令または前方分岐命令に応答して次命令の選択を制御するために）第１のＭＩＮＲＣを使用させ得る。いくつかの例では、呼出し側プログラムに対応する第１のＭＩＮＲＣに基づいて呼出し側プログラムの実行を制御させるために、制御ユニット１２は、ポップされたＭＩＮＲＣ値をＭＩＮＲＣレジスタ４２に記憶し得る。ポップされたＭＩＮＲＣ値をＭＩＮＲＣレジスタ４２に記憶することは、いくつかの例では、サブルーチンのためのＭＩＮＲＣに対応するＭＩＮＲＣレジスタ４２に記憶された値をポップされたＭＩＮＲＣ値に対応する値で上書きすることを含み得る。
【０２２２】
[0235]本開示で説明した技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。たとえば、説明した技法の様々な態様は、１つまたは複数のマイクロプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、あるいは他の等価な集積回路またはディスクリート論理回路を含む、１つまたは複数のプロセッサ、ならびにそのような構成要素の任意の組合せ内で実装され得る。「プロセッサ」または「処理回路」という用語は、概して、単独で、あるいは他の論理回路、または処理を実施するディスクリートハードウェアなどの他の等価回路との組合せで、上記の論理回路のいずれかを指すことがある。
【０２２３】
[0236]そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明した様々な動作および機能をサポートするために、同じデバイス内で、または別々のデバイス内で実装され得る。さらに、説明したユニット、モジュールまたは構成要素のいずれも、個別であるが相互運用可能な論理デバイスとして、一緒にまたは別々に実装され得る。モジュールまたはユニットとしての様々な機能の図は、様々な機能的態様を強調するものであり、そのようなモジュールまたはユニットが別々のハードウェアまたはソフトウェア構成要素によって実現されなければならないことを必ずしも暗示するとは限らない。そうではなく、１つまたは複数のモジュールあるいはユニットに関連する機能は、別々のハードウェア、ファームウェア、および／またはソフトウェア構成要素によって実施されるか、あるいは共通または別々のハードウェアもしくはソフトウェア構成要素内に組み込まれることがある。
【０２２４】
[0237]また、本開示で説明した技法は、命令を記憶するコンピュータ可読記憶媒体などのコンピュータ可読媒体中に記憶、実施または符号化され得る。コンピュータ可読媒体中に埋め込まれたまたは符号化された命令は、たとえば、その命令が１つまたは複数のプロセッサによって実行されたとき、１つまたは複数のプロセッサに本明細書で説明した技法を実施させ得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、プログラマブル読取り専用メモリ（ＰＲＯＭ）、消去可能プログラマブル読取り専用メモリ（ＥＰＲＯＭ）、電子的に消去可能なプログラマブル読取り専用メモリ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、ハードディスク、ＣＤ−ＲＯＭ、フロッピー（登録商標）ディスク、カセット、磁気媒体、光媒体、または有形である他のコンピュータ可読記憶媒体を含み得る。
【０２２５】
[0238]コンピュータ可読媒体は、上記に記載した有形記憶媒体などの有形記憶媒体に対応するコンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、たとえば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を可能にする任意の媒体を含む通信媒体を備え得る。このようにして、「コンピュータ可読媒体」という句は、概して、（１）非一時的である有形コンピュータ可読記憶媒体、および（２）一時的な信号または搬送波などの非有形コンピュータ可読通信媒体に対応し得る。
【０２２６】
[0239]様々な態様および例について説明した。しかしながら、以下の特許請求の範囲から逸脱することなく本開示の構造または技法に変更を行うことができる。
【図１】
2015531945.tif 000003
【図２】
2015531945.tif 000004
【図３】
2015531945.tif 000005
【図４】
2015531945.tif 000006
【図５】
2015531945.tif 000007
【図６】
2015531945.tif 000008
【図７】
2015531945.tif 000009
【図８】
2015531945.tif 000010
【図９】
2015531945.tif 000011
【図１０】
2015531945.tif 000012
【図１１】
2015531945.tif 000013
【図１２】
2015531945.tif 000014
【図１３】
2015531945.tif 000015
【図１４】
2015531945.tif 000016
【図１５】
2015531945.tif 000017
【図１６】
2015531945.tif 000018
【図１７】
2015531945.tif 000019
【図１８】
2015531945.tif 000020
【図１９】
2015531945.tif 000021
【図２０】
2015531945.tif 000022
【図２１】
2015531945.tif 000023
【図２２】
2015531945.tif 000024
【図２３】
2015531945.tif 000025
【図２４】
2015531945.tif 000026
【図２５】
2015531945.tif 000027
【図２６】
2015531945.tif 000028
【図２７】
2015531945.tif 000029
【図２８】
2015531945.tif 000030
【図２９】
2015531945.tif 000031
【図３０】
2015531945.tif 000032
【図３１】
2015531945.tif 000033
【国際調査報告】
2015531945.tif 000034
2015531945.tif 000035
2015531945.tif 000036