(57)【要約】本開示で、単一命令複数データ（ＳＩＭＤ）処理システムにおけるレジュームチェック動作を選択的にアクティブ化するための技法について説明する。特定の命令についてレジュームチェック動作が実施されるべきであるかどうかを示す、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にするように構成されたプロセッサについて説明する。実行されたとき、特定の命令についてレジュームチェック動作を選択的に有効または無効にさせるコンパイルドコードを生成するように構成されたコンパイラについても説明する。本開示の技法は、非アクティブ化されたスレッドの再アクティブ化を管理するためにレジュームチェック動作を利用するＳＩＭＤシステムの電力消費を低減し、および／またはそれの性能を改善するために使用され得る。【選択図】図７
2015531124.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサを用いて、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む前記命令を実行することと、
前記プロセッサを用いて、前記命令中に含まれる前記情報に基づいて、前記命令について前記レジュームチェック動作を選択的に有効または無効にすることと、前記レジュームチェック動作が、複数のレジュームカウンタ値の各々を前記命令に関連付けられたプログラムカウンタ値と比較することを備える動作であり、前記レジュームカウンタ値の各々が、前記プロセッサ上で実行している複数のスレッドの該当する１つに関連付けられる、
を備える方法。
【請求項２】
前記命令を実行することが、命令サイクル中に前記命令を実行することを備え、
前記レジュームチェック動作を選択的に有効または無効にすることは、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すかどうかを判断することと、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、前記命令サイクルについて前記レジュームチェック動作を有効にすることと、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、前記命令サイクルについて前記レジュームチェック動作を無効にすることと
を備える、請求項１に記載の方法。
【請求項３】
前記レジュームチェック動作は、前記複数のレジュームカウンタ値の各々について、前記該当するレジュームカウンタ値が前記プログラムカウンタ値に等しい場合、前記該当するレジュームカウンタ値に関連付けられた前記複数のスレッドの該当する１つをアクティブ化することをさらに備える、請求項１に記載の方法。
【請求項４】
前記プロセッサが第１のプロセッサであり、前記方法は、
第２のプロセッサを用いて、プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記プログラムの１つまたは複数の命令を選択することと、
前記第２のプロセッサを用いて、前記プログラムのためのコンパイルドコードが前記選択された１つまたは複数の命令を含むように、および前記選択された１つまたは複数の命令が、前記選択された１つまたは複数の命令について前記レジュームチェック動作が実施されるべきであることを示す情報を含むように、前記コンパイルドコードを生成することと
をさらに備える、請求項１に記載の方法。
【請求項５】
前記１つまたは複数の命令を選択することは、
命令が、分岐命令またはジャンプ命令のうちの少なくとも１つを実行することに応答して非アクティブ化された１つまたは複数のスレッドによって実行されるべき候補次命令である場合、前記プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記命令を選択すること
を備える、請求項４に記載の方法。
【請求項６】
前記１つまたは複数の命令を選択することは、
命令が順方向分岐命令および順方向ジャンプ命令のうちの少なくとも１つのターゲット命令である場合、前記プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記命令を選択すること
を備える、請求項４に記載の方法。
【請求項７】
前記１つまたは複数の命令を選択することは、
命令が逆方向分岐命令の後の次連続命令である場合、前記プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記命令を選択すること
を備える、請求項４に記載の方法。
【請求項８】
前記第１のプロセッサが前記第２のプロセッサとは異なる、請求項４に記載の方法。
【請求項９】
前記レジュームカウンタ値の各々は、前記該当するレジュームカウンタ値に対応するスレッドが非アクティブである場合、前記スレッドがアクティブ化されるようにスケジュールされるプログラムカウンタ値を示す、請求項１に記載の方法。
【請求項１０】
前記レジュームカウンタ値の各々は、前記該当するレジュームカウンタ値に対応する前記スレッドがアクティブである場合、デフォルト値に等しい、請求項９に記載の方法。
【請求項１１】
前記プロセッサが１つまたは複数のレジスタを備え、前記プロセッサが、前記レジュームカウンタ値を前記１つまたは複数のレジスタに記憶する、請求項１に記載の方法。
【請求項１２】
前記命令が、前記レジュームチェック動作を実施すべきかどうかを示すことに加えて、実施されるべき主動作を指定する、請求項１に記載の方法。
【請求項１３】
前記レジュームチェック動作が実施されるとき、前記レジュームチェック動作が、前記主動作を実施するより前に実施される、請求項１２に記載の方法。
【請求項１４】
前記命令について前記レジュームチェック動作を実施すべきかどうかを示す前記情報が１ビットフラグを備える、請求項１に記載の方法。
【請求項１５】
前記命令を実行することが、前記プロセッサを用いて、命令サイクル中に前記命令を実行することを備え、
前記レジュームチェック動作を選択的に有効または無効にすることは、
前記プロセッサを用いて、前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すかどうかを判断することと、
前記プロセッサを用いて、前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、前記レジュームチェック動作を実施することと、
前記プロセッサを用いて、前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、前記レジュームチェック動作を実施しないことと
を備える、
をさらに備える、請求項１に記載の方法。
【請求項１６】
前記プロセッサを用いて、前記レジュームチェック動作を実施することは、
前記複数のレジュームカウンタ値の各々を前記命令に関連付けられたプログラムカウンタ値と比較することと、
前記複数のレジュームカウンタ値の各々について、前記該当するレジュームカウンタ値が前記プログラムカウンタ値に等しい場合、前記該当するレジュームカウンタ値に関連付けられた前記複数のスレッドの該当する１つをアクティブ化することと
を備える、請求項１５に記載の方法。
【請求項１７】
命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む前記命令を実行することと、前記命令中に含まれる前記情報に基づいて、前記命令について前記レジュームチェック動作を選択的に有効または無効にすることと、前記レジュームチェック動作が、複数のレジュームカウンタ値の各々を前記命令に関連付けられたプログラムカウンタ値と比較することを備える動作であり、前記レジュームカウンタ値の各々が、前記プロセッサ上で実行している複数のスレッドの該当する１つに関連付けられる、を行うように構成されたプロセッサ
を備えるデバイス。
【請求項１８】
前記プロセッサは、命令サイクル中に前記命令を実行することと、前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すかどうかを判断することと、前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、前記命令サイクルについて前記レジュームチェック動作を有効にすることと、前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、前記命令サイクルについて前記レジュームチェック動作を無効にすることとを行うようにさらに構成された、請求項１７に記載のデバイス。
【請求項１９】
前記レジュームチェック動作は、前記複数のレジュームカウンタ値の各々について、前記該当するレジュームカウンタ値が前記プログラムカウンタ値に等しい場合、前記該当するレジュームカウンタ値に関連付けられた前記複数のスレッドの該当する１つをアクティブ化することをさらに備える、請求項１７に記載のデバイス。
【請求項２０】
前記プロセッサが第１のプロセッサであり、前記デバイスは、
プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記プログラムの１つまたは複数の命令を選択することと、前記プログラムのためのコンパイルドコードが前記選択された１つまたは複数の命令を含むように、および前記選択された１つまたは複数の命令が、前記選択された１つまたは複数の命令について前記レジュームチェック動作が実施されるべきであることを示す情報を含むように、前記コンパイルドコードを生成することとを行うように構成された第２のプロセッサ
をさらに備える、請求項１７に記載のデバイス。
【請求項２１】
前記第２のプロセッサは、命令が、分岐命令またはジャンプ命令のうちの少なくとも１つの後の１つまたは複数の非アクティブ化されたスレッドによって実行されるべき候補次命令である場合、前記プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記命令を選択するようにさらに構成された、請求項２０に記載のデバイス。
【請求項２２】
前記第２のプロセッサは、命令が順方向分岐命令および順方向ジャンプ命令のうちの少なくとも１つのターゲット命令である場合、前記プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記命令を選択するようにさらに構成された、請求項２０に記載のデバイス。
【請求項２３】
前記第２のプロセッサは、命令が逆方向分岐命令の後の次連続命令である場合、前記プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記命令を選択するようにさらに構成された、請求項２０に記載のデバイス。
【請求項２４】
前記第１のプロセッサが前記第２のプロセッサとは異なる、請求項２０に記載のデバイス。
【請求項２５】
前記レジュームカウンタ値の各々は、前記該当するレジュームカウンタ値に対応するスレッドが非アクティブである場合、前記スレッドがアクティブ化されるべきであるプログラムカウンタ値を示す、請求項１７に記載のデバイス。
【請求項２６】
前記レジュームカウンタ値の各々は、前記該当するレジュームカウンタ値に対応する前記スレッドがアクティブである場合、デフォルト値に等しい、請求項２５に記載のデバイス。
【請求項２７】
前記プロセッサが１つまたは複数のレジスタを備え、前記プロセッサが、前記レジュームカウンタ値を前記１つまたは複数のレジスタに記憶する、請求項１７に記載のデバイス。
【請求項２８】
前記命令が、前記レジュームチェック動作を実施すべきかどうかを示すことに加えて、実施されるべき主動作を指定する、請求項１７に記載のデバイス。
【請求項２９】
前記レジュームチェック動作が実施されるとき、前記レジュームチェック動作が、前記主動作を実施するより前に実施される、請求項２８に記載のデバイス。
【請求項３０】
前記命令について前記レジュームチェック動作を実施すべきかどうかを示す前記情報が１ビットフラグを備える、請求項１７に記載のデバイス。
【請求項３１】
前記プロセッサは、命令サイクル中に前記命令を実行することと、前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すかどうかを判断することと、前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、前記命令サイクル中に前記レジュームチェック動作を実施することと、前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、前記命令サイクル中に前記レジュームチェック動作を実施しないこととを行うようにさらに構成された、請求項１７に記載のデバイス。
【請求項３２】
前記プロセッサが、前記複数のレジュームカウンタ値の各々を前記命令に関連付けられたプログラムカウンタ値と比較することと、前記複数のレジュームカウンタ値の各々について、前記該当するレジュームカウンタ値が前記プログラムカウンタ値に等しい場合、前記該当するレジュームカウンタ値に関連付けられた前記複数のスレッドの該当する１つをアクティブ化することとを行うようにさらに構成された、請求項３１に記載のデバイス。
【請求項３３】
前記デバイスがワイヤレス通信デバイスを備える、請求項１７に記載のデバイス。
【請求項３４】
前記デバイスがモバイルフォンハンドセットを備える、請求項１７に記載のデバイス。
【請求項３５】
命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む前記命令を実行するための手段と、
前記命令中に含まれる前記情報に基づいて、前記命令について前記レジュームチェック動作を選択的に有効または無効にするための手段と、前記レジュームチェック動作が、複数のレジュームカウンタ値の各々を前記命令に関連付けられたプログラムカウンタ値と比較することを備える動作であり、前記レジュームカウンタ値の各々が、プロセッサ上で実行している複数のスレッドの該当する１つに関連付けられる、
を備える装置。
【請求項３６】
前記命令を実行するための前記手段が、命令サイクル中に前記命令を実行するための手段を備え、
前記レジュームチェック動作を選択的に有効または無効にするための前記手段は、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すかどうかを判断するための手段と、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、前記命令サイクルについて前記レジュームチェック動作を有効にするための手段と、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、前記命令サイクルについて前記レジュームチェック動作を無効にするための手段と
を備える、請求項３５に記載の装置。
【請求項３７】
プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記プログラムの１つまたは複数の命令を選択するための手段と、
前記プログラムのためのコンパイルドコードが前記選択された１つまたは複数の命令を含むように、および前記選択された１つまたは複数の命令が、前記選択された１つまたは複数の命令について前記レジュームチェック動作が実施されるべきであることを示す情報を含むように、前記コンパイルドコードを生成するための手段と
をさらに備える、請求項３５に記載の装置。
【請求項３８】
前記１つまたは複数の命令を選択するための前記手段は、
命令が、分岐命令またはジャンプ命令のうちの少なくとも１つを実行することに応答して非アクティブ化された１つまたは複数のスレッドによって実行されるべき候補次命令である場合、前記プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記命令を選択するための手段
を備える、請求項３７に記載の装置。
【請求項３９】
前記レジュームカウンタ値の各々は、前記該当するレジュームカウンタ値に対応するスレッドが非アクティブである場合、前記スレッドがアクティブ化されるようにスケジュールされるプログラムカウンタ値を示し、前記該当するレジュームカウンタ値に対応する前記スレッドがアクティブである場合、デフォルト値に等しい、請求項３５に記載の装置。
【請求項４０】
前記命令が、前記レジュームチェック動作を実施すべきかどうかを示すことに加えて、実施されるべき主動作を指定し、前記レジュームチェック動作が実施されるとき、前記レジュームチェック動作が、前記主動作を実施するより前に実施される、請求項３５に記載の装置。
【請求項４１】
前記命令を実行するための前記手段が、命令サイクル中に前記命令を実行するための手段を備え、
前記レジュームチェック動作を選択的に有効または無効にするための前記手段は、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すかどうかを判断するための手段と、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、前記レジュームチェック動作を実施するための手段と、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、前記レジュームチェック動作を実施しないための手段と
を備える、
をさらに備える、請求項３５に記載の装置。
【請求項４２】
前記レジュームチェック動作を実施するための前記手段は、
前記複数のレジュームカウンタ値の各々を前記命令に関連付けられたプログラムカウンタ値と比較するための手段と、
前記複数のレジュームカウンタ値の各々について、前記該当するレジュームカウンタ値が前記プログラムカウンタ値に等しい場合、前記該当するレジュームカウンタ値に関連付けられた前記複数のスレッドの該当する１つをアクティブ化するための手段と
を備える、請求項４１に記載の装置。
【請求項４３】
実行されたとき、１つまたは複数のプロセッサに、
命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む前記命令を実行することと、
前記命令中に含まれる前記情報に基づいて、前記命令について前記レジュームチェック動作を選択的に有効または無効にすることと、前記レジュームチェック動作が、複数のレジュームカウンタ値の各々を前記命令に関連付けられたプログラムカウンタ値と比較することを備える動作であり、前記レジュームカウンタ値の各々が、前記１つまたは複数のプロセッサ上で実行している複数のスレッドの該当する１つに関連付けられる、
を行わせる命令を記憶したコンピュータ可読記憶媒体。
【請求項４４】
実行されたとき、１つまたは複数のプロセッサに前記命令を実行させる前記命令が、実行されたとき、１つまたは複数のプロセッサに、命令サイクル中に前記命令を実行させる命令を備え、
実行されたとき、１つまたは複数のプロセッサに前記レジュームチェック動作を選択的に有効または無効にさせる前記命令は、実行されたとき、１つまたは複数のプロセッサに、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すかどうかを判断することと、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、前記命令サイクルについて前記レジュームチェック動作を有効にすることと、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、前記命令サイクルについて前記レジュームチェック動作を無効にすることと
を行わせる命令を備える、請求項４３に記載のコンピュータ可読記憶媒体。
【請求項４５】
実行されたとき、１つまたは複数のプロセッサに、
プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記プログラムの１つまたは複数の命令を選択することと、
前記プログラムのためのコンパイルドコードが前記選択された１つまたは複数の命令を含むように、および前記選択された１つまたは複数の命令が、前記選択された１つまたは複数の命令について前記レジュームチェック動作が実施されるべきであることを示す情報を含むように、前記コンパイルドコードを生成することと
を行わせる命令をさらに備える、請求項４３に記載のコンピュータ可読記憶媒体。
【請求項４６】
実行されたとき、１つまたは複数のプロセッサに前記１つまたは複数の命令を選択させる前記命令は、実行されたとき、１つまたは複数のプロセッサに、
命令が、分岐命令またはジャンプ命令のうちの少なくとも１つを実行することに応答して非アクティブ化された１つまたは複数のスレッドによって実行されるべき候補次命令である場合、前記プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして前記命令を選択すること
を行わせる命令を備える、請求項４５に記載のコンピュータ可読記憶媒体。
【請求項４７】
前記レジュームカウンタ値の各々は、前記該当するレジュームカウンタ値に対応するスレッドが非アクティブである場合、前記スレッドがアクティブ化されるようにスケジュールされるプログラムカウンタ値を示し、前記該当するレジュームカウンタ値に対応する前記スレッドがアクティブである場合、デフォルト値に等しい、請求項４３に記載のコンピュータ可読記憶媒体。
【請求項４８】
前記命令が、前記レジュームチェック動作を実施すべきかどうかを示すことに加えて、実施されるべき主動作を指定し、前記レジュームチェック動作が実施されるとき、前記レジュームチェック動作が、前記主動作を実施するより前に実施される、請求項４３に記載のコンピュータ可読記憶媒体。
【請求項４９】
実行されたとき、１つまたは複数のプロセッサに前記命令を実行させる前記命令が、実行されたとき、１つまたは複数のプロセッサに、命令サイクル中に前記命令を実行させる命令を備え、
実行されたとき、１つまたは複数のプロセッサに前記レジュームチェック動作を選択的に有効または無効にさせる前記命令は、実行されたとき、１つまたは複数のプロセッサに、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すかどうかを判断することと、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、前記レジュームチェック動作を実施することと、
前記命令中に含まれる前記情報が、前記命令について前記レジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、前記レジュームチェック動作を実施しないことと
を備える、
をさらに備える、請求項４３に記載のコンピュータ可読記憶媒体。
【請求項５０】
実行されたとき、１つまたは複数のプロセッサに前記レジュームチェック動作を実施させる前記命令は、実行されたとき、１つまたは複数のプロセッサに、
前記複数のレジュームカウンタ値の各々を前記命令に関連付けられたプログラムカウンタ値と比較することと、
前記複数のレジュームカウンタ値の各々について、前記該当するレジュームカウンタ値が前記プログラムカウンタ値に等しい場合、前記該当するレジュームカウンタ値に関連付けられた前記複数のスレッドの該当する１つをアクティブ化することと
を行わせる命令を備える、請求項４９に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]  本出願は、その内容全体が参照により本明細書に組み込まれる、２０１２年８月８日に出願された米国仮出願第６１／６８０，９９０号の利益を主張する。
【０００２】
[0002]  本開示はマルチスレッド処理に関し、より詳細には、マルチスレッド処理システムにおけるダイバージェント分岐命令（divergent branch instruction）を管理するための技法に関する。
【背景技術】
【０００３】
[0003]  単一命令複数データ（ＳＩＭＤ：single instruction, multiple data）処理システムは、複数のデータに対して同じ命令を実行する複数の処理要素を含む並列コンピューティングシステムのタイプである。ＳＩＭＤシステムは、スタンドアロンコンピュータ、またはコンピューティングシステムのサブシステムであり得る。例えば、１つまたは複数のＳＩＭＤ実行ユニットは、プログラマブルシェーディングをサポートするプログラマブルシェーディングユニットを実装するためのグラフィックス処理ユニット（ＧＰＵ：graphics processing unit）中で使用され得る。
【０００４】
[0004]  ＳＩＭＤ処理システムは、プログラムのための複数の実行スレッドが、並列に複数の処理要素上で同期的に実行することを可能にし、それによって、動作の同じセットが複数のデータに対して実施される必要があるプログラムのためのスループットを増加させる。各スレッドが異なるデータに対して動作するので、プログラムが条件付き分岐命令を含む場合、分岐条件は、システム中で実行しているスレッドのうちのいくつかについて満たされ、システム中で実行している他のスレッドについて満たされないことがあることが可能である。そのような命令は、ダイバージェント分岐命令と呼ばれることがあり、ＳＩＭＤシステムが複数の処理要素上で同期的にスレッドのすべてを実行することが可能であるとは限らないことになる。
【発明の概要】
【０００５】
[0005]  本開示は、ダイバージェント分岐命令を扱うための技法を対象とし、より詳細には、ダイバージェント分岐命令に応答して非アクティブ化されていることがあるスレッドの再アクティブ化を管理するための技法を対象とする。より詳細には、本開示は、単一命令複数データ（ＳＩＭＤ）処理システムにおけるレジュームチェック動作を選択的にアクティブ化するための技法を対象とする。そのような技法は、非アクティブ化されたスレッドの再アクティブ化を管理するレジュームチェック動作が、命令ごとに選択的に有効または無効にされることを可能にし得る。本開示の技法は、非アクティブ化されたスレッドの再アクティブ化を管理するためにレジュームチェック動作を利用するＳＩＭＤシステムの電力消費を低減し、および／またはそれの性能を改善するために使用され得る。
【０００６】
[0006]  一例で、本開示は、プロセッサを用いて、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む命令を実行することを含む方法について説明する。本方法は、プロセッサを用いて、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にすることをさらに含む。レジュームチェック動作は、複数のレジュームカウンタ値の各々を命令に関連付けられたプログラムカウンタ値と比較することを含む動作である。レジュームカウンタ値の各々は、プロセッサ上で実行している複数のスレッドの該当する１つに関連付けられる。
【０００７】
[0007]  別の例で、本開示は、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む命令を実行するように構成されたプロセッサを含むデバイスについて説明する。プロセッサは、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にするようにさらに構成される。レジュームチェック動作は、複数のレジュームカウンタ値の各々を命令に関連付けられたプログラムカウンタ値と比較することを含む動作である。レジュームカウンタ値の各々は、プロセッサ上で実行している複数のスレッドの該当する１つに関連付けられる。
【０００８】
[0008]  別の例で、本開示は、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む命令を実行するための手段を含む装置について説明する。本装置は、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にするための手段をさらに含む。レジュームチェック動作は、複数のレジュームカウンタ値の各々を命令に関連付けられたプログラムカウンタ値と比較することを含む動作である。レジュームカウンタ値の各々は、プロセッサ上で実行している複数のスレッドの該当する１つに関連付けられる。
【０００９】
[0009]  別の例で、本開示は、実行されたとき、１つまたは複数のプロセッサに、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む命令を実行することを行わせる命令を記憶したコンピュータ可読記憶媒体について説明する。命令は、１つまたは複数のプロセッサに、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にすることをさらに行わせる。レジュームチェック動作は、複数のレジュームカウンタ値の各々を命令に関連付けられたプログラムカウンタ値と比較することを含む動作である。レジュームカウンタ値の各々は、１つまたは複数のプロセッサ上で実行している複数のスレッドの該当する１つに関連付けられる。
【００１０】
[0010]  本開示の１つまたは複数の例の詳細が、添付の図面および以下の説明に記載される。本開示の他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【００１１】
【図１】本開示の選択的レジュームチェックアクティブ化技法を実装するために使用され得る例示的な処理システムを示すブロック図。
【図２】本開示による、図１の例示的な処理システム中の制御ユニットをより詳細に示すブロック図。
【図３】本開示の選択的レジュームチェックアクティブ化技法を実装するために使用され得る例示的な制御フローモジュールを示すブロック図。
【図４】本開示の選択的レジュームチェックアクティブ化技法を実装するために使用され得る別の例示的な制御フローモジュールを示すブロック図。
【図５】本開示による、図４に示された制御フローモジュールの例示的な動作を特徴づける状態遷移表。
【図６】本開示の選択的レジュームチェックアクティブ化技法を実装するために使用され得る例示的なコンピューティングシステムを示すブロック図。
【図７】本開示による、レジュームチェック動作を選択的にアクティブ化するための例示的な技法を示す流れ図。
【図８】本開示による、レジュームチェック動作を選択的にアクティブ化するための別の例示的な技法を示す流れ図。
【図９】本開示による、レジュームチェック動作を実施するための例示的な技法を示す流れ図。
【図１０】本開示による、レジュームチェック動作を実施するための別の例示的な技法を示す流れ図。
【図１１】本開示による、レジュームチェック動作を選択的にアクティブ化するコンパイルドコード（compiled code）を生成するための例示的な技法を示す流れ図。
【図１２】本開示による、レジュームチェック動作を選択的にアクティブ化するコンパイルドコードを生成するための別の例示的な技法を示す流れ図。
【図１３】本開示の選択的レジュームチェックアクティブ化技法を使用せずに実行され得る例示的なプログラムを示す図。
【図１４】本開示による、図１３中の例示的なプログラムのための例示的な実行シーケンスを示す表。
【図１５】本開示の選択的レジュームチェックアクティブ化技法を使用して実行され得る例示的なプログラムを示す図。
【図１６】本開示による、図１５中の例示的なプログラムのための例示的な実行シーケンスを示す表。
【発明を実施するための形態】
【００１２】
[0027]  本開示は、単一命令複数データ（ＳＩＭＤ）処理システムにおけるレジュームチェック動作を選択的にアクティブ化するための技法を対象とする。特に、本開示の技法は、非アクティブ化されたスレッドの再アクティブ化を管理するレジュームチェック動作が、命令ごとに選択的に有効または無効にされることを可能にし得る。本開示の技法は、非アクティブ化されたスレッドの再アクティブ化を管理するためにレジュームチェック動作を利用するＳＩＭＤシステムの電力消費を低減し、および／またはそれの性能を改善するために使用され得る。
【００１３】
[0028]  ＳＩＭＤ処理システムでは、すべてのスレッドが、単一のプログラムカウンタを含む単一の制御フローユニットによって制御され得る。これは、プログラムのための複数の実行スレッドが、並列に複数の処理要素上で同期的に実行することを可能にし、それによって、動作の同じセットが複数のデータに対して実施される必要があるプログラムのためのスループットを増加させ得る。しかしながら、各スレッドが異なるデータに対して動作するので、ＳＩＭＤ処理システムの命令セットアーキテクチャ（ＩＳＡ：instruction set architecture）が条件付き分岐命令をサポートする場合、分岐条件は、システム中で実行しているスレッドのうちのいくつかについて満たされ、システム中で実行している他のスレッドについて満たされないことがあることが可能である。そのような分岐命令は、ダイバージェント分岐命令と呼ばれることがある。ダイバージェント分岐命令が行われる場合、アクティブスレッドのうちのいくつかについて実行されるようにスケジュールされる次命令は、アクティブスレッドのうちの他のスレッドについて実行されるようにスケジュールされる次命令とは異なり得る。これは、スレッドのすべてを同期的なロックステップ（lockstep）方式で実行することが可能であるとは限らないＳＩＭＤ処理システムを生じ得る。
【００１４】
[0029]  ダイバージェント分岐命令に対処するための１つの手法は、残りのアクティブスレッドが同じ次命令を実行するためにすべて同期させられるように、分岐条件を満たしたかまたはそれを満たさなかったかのいずれかのスレッドのすべてを非アクティブ化することに関与する。スレッドが所与の命令サイクル中に非アクティブ化されたとき、スレッドはその命令サイクル中に命令を実行しない。従って、残りのスレッドは、ロックステップ方式で実行し続け得る。そのような非アクティブ化されたスレッドの再アクティブ化を制御するために、処理システム中で実行している各スレッドにレジュームカウンタを割り振ることと、非アクティブ化されている各スレッドのためのレジュームカウンタを、該当するスレッドが再アクティブ化されるべきであるプログラムカウンタ値を示す値にセットすることと、あらゆる命令の実行より前にレジュームチェック動作を自動的に実施することとに関与するレジュームカウンタベースの手法が使用され得る。あらゆる命令についてレジュームチェック動作を自動的に実施する１つの欠点は、レジュームチェック動作が、動作が実施されるたびにかなりの電力量を消費し得、ＳＩＭＤ処理システム中で命令を処理するのにかかる時間に著しく寄与し得るということである。
【００１５】
[0030]  本開示によれば、レジュームチェック動作が命令ごとに選択的に有効または無効にされることを可能にするための技法について説明する。レジュームチェック動作は、ＳＩＭＤ処理システムにおけるプログラムの適切な実行のためにプログラム中のあらゆる命令について必ずしも実施される必要があるとは限らないことがある。例えば、プログラム中のいくつかの命令について、コンパイラは、プログラムの実行中にスレッド再アクティブ化がそのような命令において行われる必要がないであろうと判断することが可能であり得る。従って、本開示の技法に従ってレジュームチェック動作が命令ごとに選択的に有効および無効にされることを可能にすることによって、レジュームチェック動作は、スレッド再アクティブ化が行われる必要がないであろうと判断されたそのような命令について無効にされ得る。このようにして、本開示の技法は、プログラム中の各命令についてレジュームチェック動作が自動的に実施される処理システムと比較して、ＳＩＭＤ処理システムの電力消費を低減し、および／またはそれの性能を高めるために使用され得る。
【００１６】
[0031]  本開示のいくつかの態様によれば、命令についてレジュームチェックが実施されるべきであるかどうかを示す、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にするように構成されたプロセッサについて説明する。命令が、命令についてレジュームチェック動作が実施されるべきであることを示す場合、プロセッサは、命令を実行するために使用される命令サイクル中にレジュームチェック動作を実施し得る。同様に、命令が、命令についてレジュームチェック動作が実施されるべきでないことを示す場合、プロセッサは、命令を実行するために使用される命令サイクル中にレジュームチェック動作を実施し得ない。
【００１７】
[0032]  レジュームチェック動作は、例えば、複数のレジュームカウンタ値の各々を現在処理されている命令に関連付けられたプログラムカウンタ値と比較することを含む動作であり得る。レジュームカウンタ値の各々は、プロセッサ上で実行している複数のスレッドの該当する１つに関連付けられ得る。非アクティブ化されたスレッドのためのレジュームカウンタ値が現在プログラムカウンタ値に等しい場合、スレッドは再アクティブ化され得る。さもなければ、非アクティブ化されたスレッドのためのレジュームカウンタ値が現在プログラムカウンタ値に等しくない場合、スレッドは非アクティブ化されたままであり得る。レジュームチェック動作を実施するより前にすでにアクティブであったスレッドは、レジュームチェック動作を実施した後にアクティブなままであり得る。
【００１８】
[0033]  本開示の追加の態様によれば、レジュームチェック動作が命令ごとに選択的に有効または無効にされることを可能にする命令セットアーキテクチャ（ＩＳＡ）について説明する。例えば、ＩＳＡは、該当する命令が（例えば、命令に関連付けられた命令サイクル中に）実行されるとき、レジュームチェック動作が実施されるべきであるかどうかを指定する情報フィールドを命令の各々が有する１つまたは複数の命令を含み得る。いくつかの例で、情報フィールドは、命令についてレジュームチェックが実施されるべきであるかどうかに応じてセットされるかまたはリセットされるかのいずれかであるシングルビットであり得る。
【００１９】
[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]  条件付き分岐命令は、１つまたは複数のデータ項目値に関して指定される条件を含み得る。例えば、１つのタイプの条件は、処理システム１０中で実行している各アクティブスレッドについて、第１のデータ項目値を第２のデータ項目値と比較する比較条件であり得る。データ項目値を比較することは、例えば、第１のデータ項目値が第２のデータ項目値よりも大きいのか、それよりも小さいのか、それ以下であるのか、それ以上であるのか、それに等しいのか、またはそれに等しくないのかを判断することを含み得る。別のタイプの条件は、処理システム１０中で実行している各アクティブスレッドについてのデータ項目値がゼロに等しいのかゼロに等しくないのかを判断するゼロチェック条件であり得る。
【００４５】
[0060]  処理要素１４の各々は、異なるデータ項目に対して動作するので、条件を評価した結果は、処理システム１０中で実行している各アクティブスレッドについて異なり得る。処理システム１０中で実行しているアクティブスレッドのすべてが分岐条件を満たすか、または処理システム１０中で実行しているアクティブスレッドのすべてが分岐条件を満たさないかのいずれかの場合、一様な分岐条件が発生し、分岐命令のための分岐ダイバージェンスは一様であると言われる。一方、処理システム１０中で実行しているアクティブスレッドのうちの少なくとも１つが分岐条件を満たし、処理システム１０中で実行しているアクティブスレッドのうちの少なくとも１つが分岐条件を満たさない場合、ダイバージェント分岐条件が発生し、分岐命令のための分岐ダイバージェンスは、ダイバージェントであると言われる。
【００４６】
[0061]  処理システム１０中で実行しているスレッドは、同じ命令をロックステップ方式で実行し得る。言い換えれば、処理要素１４の各々は、処理サイクル中にすべてのアクティブスレッドについて同じ命令を一緒に実行し得る。しかしながら、ダイバージェント分岐条件が発生したとき、その分岐条件を満たしたスレッドは、分岐条件を満たさなかったスレッドによって実行されるようにスケジュールされた次命令とは異なる次命令を実行するようにスケジュールされ得る。これは、処理システム１０中のスレッドが単一の命令をロックステップ方式で実行することを妨害し得る。
【００４７】
[0062]  ダイバージェント分岐命令に対処するために、制御ユニット１２は、いくつかの例では、残りのアクティブスレッドがすべて同じ次命令を実行するように同期させられるように、分岐条件を満たしたかまたはそれを満たさなかったかのいずれかのスレッドの１つのサブセットを非アクティブ化し得る。非アクティブ化されたスレッドの再アクティブ化を制御するために、制御ユニット１２は、処理システム中で実行している各スレッドにレジュームカウンタを割り振ることと、非アクティブ化されている各スレッドのためのレジュームカウンタを、該当するスレッドが再アクティブ化されるようにスケジュールされるプログラムカウンタ値を示す値にセットすることと、スレッドを再アクティブ化するためにプログラム中の様々なチェックポイントにおいてレジュームチェック動作を実施することとに関与するレジュームカウンタベースの手法を使用し得る。
【００４８】
[0063]  所与の命令サイクル中に、レジュームチェック動作は、所与の命令サイクルについて現在プログラムカウンタ値において再アクティブ化されるようにスケジュールされた、非アクティブ化されたスレッドをアクティブ化し得る。レジュームチェック動作は、１つまたは複数のスレッドに関連付けられた１つまたは複数のレジュームカウンタ値に基づいて、１つまたは複数のスレッドが、現在プログラムカウンタ値において再アクティブ化されるようにスケジュールされるかどうかを判断し得る。例えば、レジュームチェック動作は、複数のレジュームカウンタ値の各々を現在プログラムカウンタ値と比較し、複数のレジュームカウンタ値の各々について、該当するレジュームカウンタ値が現在プログラムカウンタ値に等しい場合、該当するレジュームカウンタ値に対応するスレッドをアクティブ化し得る。
【００４９】
[0064]  レジュームカウンタ値の各々は、処理システム１０上で実行している複数のスレッドの各々に関連付けられ得、スレッドが非アクティブである場合、スレッドがアクティブ化されるようにスケジュールされるプログラムカウンタ値を示し得る。いくつかの例で、レジュームカウンタ値の各々は、該当するレジュームカウンタ値に対応するスレッドがアクティブである場合、デフォルト値に等しい。デフォルト値は、プログラムのアドレス範囲よりも大きい値に対応し得る。例えば、デフォルト値は、最大レジスタ値（すなわち、レジュームカウンタストレージスロットまたはレジュームカウンタレジスタ中で表され得る最も大きい値である値）であり得る。
【００５０】
[0065]  本開示によれば、制御ユニット１２は、レジュームチェック動作の性能を命令ごとに選択的に有効および無効にするように構成され得る。例えば、制御ユニット１２は、制御ユニット１２によって命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報を含む命令を実行することと、命令中に含まれる情報に基づいて、命令についてレジュームチェック動作を選択的に有効または無効にすることとを行うように構成され得る。レジュームチェック動作は、複数のレジュームカウンタ値の各々を命令に関連付けられたプログラムカウンタ値と比較することと、複数のレジュームカウンタ値の各々について、該当するレジュームカウンタ値がプログラムカウンタ値に等しい場合、該当するレジュームカウンタ値に関連付けられた複数のスレッドの該当する１つをアクティブ化することとを含む動作であり得る。
【００５１】
[0066]  レジュームチェック動作を選択的に有効または無効にするために、制御ユニット１２は、いくつかの例で、命令サイクル中に命令を実行することと、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきであることを示すかどうかを判断することと、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきであることを示すと判断したことに応答して、命令サイクルについてレジュームチェック動作を有効にすることと、命令中に含まれる情報が、命令についてレジュームチェック動作が実施されるべきでないことを示すと判断したことに応答して、命令サイクルについてレジュームチェック動作を無効にすることとを行うように構成され得る。
【００５２】
[0067]  いくつかの例で、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報は、命令中に情報フィールドを含み得る。場合によっては、情報フィールドは、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す１ビットフラグであり得る。さらなる例で、命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報は動作コード（例えば、オペコード）を含み得る。例えば、動作コードのあるサブセットは、レジュームチェック動作が実施されるべきである動作を指定し得、動作コードの別のサブセットは、レジュームチェック動作が実施されるべきでない動作を指定し得る。
【００５３】
[0068]  さらなる例で、命令は、レジュームチェック動作が実施されるべきであるかどうかに加えて、処理システム１０によって実施されるべき主動作を指定し得る。そのような例で、レジュームチェック動作は、主動作を実施するより前に実施され得る。このようにして、主動作は、レジュームチェック動作の一部として再アクティブ化されるスレッドについて実施され得る。場合によっては、レジュームチェック動作および主動作は、同じ命令サイクルの一部として実施され得る。
【００５４】
[0069]  レジュームチェック動作は、いくつかの例で、動作が実施されるたびにかなりの電力量を消費し得、処理システム１０中で命令を処理するのにかかる時間に著しく寄与し得る、複数の比較演算の性能に関与し得る。本開示の技法に従ってレジュームチェック動作が選択的に有効および無効にされることを可能にすることによって、レジュームチェック動作は、スレッド再アクティブ化が行われる必要がないであろうと判断された命令について無効にされ得る。従って、レジュームチェック動作の数は、あらゆる命令についてレジュームチェック動作を実施するシステム中で行われることになるレジュームチェック動作の数と比較して低減され得る。このようにして、本開示の技法は、プログラム中の各命令についてレジュームチェック動作が自動的に実施される処理システムと比較して、処理システムの電力消費を低減し、および／またはそれの性能を高めるために使用され得る。
【００５５】
[0070]  スレッド再アクティブ化のための上記で説明したレジュームカウンタベースの手法を使用するときに、適切な制御フローが維持されることを保証するために、制御ユニット１２は「最小値アドレス第１（least-valued address first）」スレッド処理順序を使用し得る。概して、「最小値アドレス第１」スレッド処理順序は、より低い値のアドレスにおける命令を処理するようにスケジュールされたスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドより前に実行される処理順序を指すことがある。そのような処理順序は、制御フローが、最初にそのようなスレッドを再アクティブ化することなく非アクティブスレッドのためのレジュームポイントを越えてジャンプするのを防ぎ得る。言い換えれば、そのような処理順序は、すべてのスレッドがアクティブになり、最後のプログラムステートメントが実行を完了した時間までには処理を完了していることになることを保証し得る。
【００５６】
[0071]  「最小値アドレス第１」スレッド処理順序は、分岐命令の方向（すなわち、順方向または逆方向）に基づいて、ダイバージェント分岐命令に応答してどのスレッドが非アクティブ化されるかを区別し得る。例えば、ダイバージェント逆方向分岐命令の場合、制御ユニット１２は、分岐条件が満たされないスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令の後に行われる次連続命令に関連付けられた値にセットし、分岐命令によって指定されたターゲット命令に関連付けられた値をプログラムカウンタにロードし、続いて分岐条件が満たされるスレッドを実行し得る。ダイバージェント順方向分岐命令の場合、制御ユニット１２は、分岐条件が満たされるスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令によって指定されたターゲット命令に関連付けられた値にセットし、分岐命令の後に行われる次連続命令に関連付けられた値をプログラムカウンタにロードし、続いて分岐条件が満たされないスレッドを実行し得る。このようにしてスレッドを非アクティブ化することは、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドより前に実行すること（すなわち、「最小値アドレス第１」スレッド処理順序）を保証する。
【００５７】
[0072]  制御ユニット１２は、通信経路２０を介して命令ストア１６に通信可能に結合され、通信経路２２を介して処理要素１４に通信可能に結合され、通信経路２４を介してデータストア１８に通信可能に結合される。制御ユニット１２は、通信経路２０を使用して、命令ストア１６に読取り命令を送り得る。読取り命令は、命令がそこから取り出されるべきである命令ストア１６中の命令アドレスを指定し得る。制御ユニット１２は、読取り命令を送ったことに応答して、命令ストア１６から１つまたは複数のプログラム命令を受信し得る。制御ユニット１２は、通信経路２２を使用して、命令を処理要素１４に与え、いくつかの例で、処理要素１４からデータ（例えば、分岐条件を評価するための比較命令の結果）を受信し得る。いくつかの例で、制御ユニット１２は、通信経路２４を使用して、（例えば、分岐条件を評価するために）データストア１８から直接データ項目値を取り出し得る。図１は、通信経路２４を含むものとして処理システム１０を示しているが、他の例で、処理システム１０は通信経路２４を含まないことがある。
【００５８】
[0073]  処理要素１４の各々は、命令ストア１６に記憶されたプログラムのための命令を処理する際に処理システム１０を支援するための演算を実施するように構成され得る。いくつかの例で、処理要素１４の各々は、演算の同じセットを実施するように構成され得る。例えば、処理要素１４の各々は、同じ命令セットアーキテクチャ（ＩＳＡ）を実装し得る。追加の例で、処理要素１４の各々は算術論理ユニット（ＡＬＵ：arithmetic logic unit）であり得る。さらなる例で、処理システム１０はベクトルプロセッサ（例えば、ＧＰＵベクトルプロセッサ）であり得、処理要素１４の各々はベクトルプロセッサ内の処理要素であり得る。追加の例で、処理システム１０はＳＩＭＤ実行ユニットであり得、処理要素１４の各々はＳＩＭＤ実行ユニット内のＳＩＭＤ処理要素であり得る。
【００５９】
[0074]  処理要素１４によって実行される演算は、算術演算、論理演算、比較演算などを含み得る。算術演算は、例えば、加算演算、減算演算、乗算演算、除算演算などの演算を含み得る。算術演算はまた、例えば、整数算術演算および／または浮動小数点算術演算を含み得る。論理演算は、例えば、ビット単位ＡＮＤ演算、ビット単位ＯＲ演算、ビット単位ＸＯＲ演算などの演算を含み得る。比較演算は、例えば、大なり演算、小なり演算、ゼロに等しい演算、ゼロに等しくない演算などの演算を含み得る。大なり演算および小なり演算は、第１のデータ項目が第２のデータ項目よりも大きいのか、それよりも小さいのかを判断し得る。ゼロに等しい演算およびゼロに等しくない演算は、データ項目がゼロに等しいのか、ゼロに等しくないのかを判断し得る。演算のために使用されるオペランドは、データストア１８中に含まれているレジスタに記憶され得る。
【００６０】
[0075]  処理要素１４の各々は、通信経路２２を介して制御ユニット１２から命令を受信したことに応答して演算を実施するように構成され得る。いくつかの例で、処理要素１４の各々は、他の処理要素１４とは無関係にアクティブ化および／または非アクティブ化されるように構成され得る。そのような例で、処理要素１４の各々は、該当する処理要素１４Ａ〜１４Ｄがアクティブ化されるとき制御ユニット１２から命令を受信したことに応答して命令によって指定された演算を実施し、該当する処理要素１４Ａ〜１４Ｄが非アクティブ化される（すなわち、アクティブ化されない）とき制御ユニット１２から命令を受信したことに応答して演算を実施しないことがある。
【００６１】
[0076]  処理要素１４Ａ〜１４Ｄの各々は、該当する通信経路２６Ａ〜２６Ｄを介してデータストア１８に通信可能に結合され得る。処理要素１４は、通信経路２６を介して、データストア１８からデータを取り出し、データストア１８にデータを記憶するように構成され得る。データストア１８から取り出されたデータは、いくつかの例で、処理要素１４によって実行される演算のためのオペランドであり得る。データストア１８に記憶されたデータは、いくつかの例で、処理要素１４によって実行される演算の結果であり得る。
【００６２】
[0077]  命令ストア１６は、処理システム１０が実行するためのプログラムを記憶するように構成される。プログラムは命令の順序付きシーケンスとして記憶され得る。いくつかの例で、各命令は一意の命令アドレスによってアドレス指定され得る。そのような例で、命令のシーケンス中で後の命令についての命令アドレスは、命令のシーケンス中で前の命令についての命令アドレスよりも大きい。そのような例で、命令のシーケンス中で後の命令に関連付けられたプログラムカウンタ値は、いくつかの例で、命令のシーケンス中で前の命令に関連付けられたプログラムカウンタ値よりも大きくなり得る。プログラム命令は、いくつかの例で、機械レベル命令であり得る。すなわち、そのような例で、命令は、処理システム１０のＩＳＡに対応するフォーマットであり得る。命令ストア１６は、通信経路２０を介して制御ユニット１２から読取り命令を受信することと、読取り命令を受信したことに応答して、通信経路２０を介して、読取り命令中で指定された命令アドレスに対応する命令を制御ユニット１２に与えることとを行うように構成され得る。読取り命令は、命令ストア１６中で命令がそこから取り出されるべきである命令アドレスを指定し得る。
【００６３】
[0078]  命令ストア１６は、任意のタイプのメモリ、キャッシュまたはそれらの組合せであり得る。命令ストア１６がキャッシュであるとき、命令ストア１６は、処理システム１０の外部のプログラムメモリに記憶されたプログラムをキャッシュし得る。命令ストア１６は処理システム１０内にあるものとして示されているが、他の例で、命令ストア１６は処理システム１０の外部にあり得る。
【００６４】
[0079]  データストア１８は、処理要素１４によって使用されるデータ項目を記憶するように構成される。いくつかの例で、データストア１８は複数のレジスタを備え、レジスタの各々は、処理システム１０によって演算される複数のデータ項目内に該当するデータ項目を記憶するように構成され得る。データストア１８は、データストア１８のレジスタとメモリまたはキャッシュ（図示せず）との間でデータを転送するように構成された１つまたは複数の通信経路（図示せず）に結合され得る。
【００６５】
[0080]  図１は、処理要素１４によって使用されるデータを記憶するための単一のデータストア１８を示しているが、他の例で、処理システム１０は、処理要素１４の各々について別個の専用データストアを含み得る。図１は、例示のために４つの処理要素１４を有する処理システム１０を示している。他の例で、処理システム１０は、同じまたは異なる構成で同じまたは異なる数の処理要素１４を有し得る。
【００６６】
[0081]  図２は、本開示による、図１の例示的な処理システム１０中の制御ユニット１２をより詳細に示すブロック図である。制御ユニット１２は、プログラムカウンタ２８と、フェッチモジュール３０と、復号モジュール３２と、制御フローモジュール３４とを含む。制御フローモジュール３４は、本明細書で、代替的に制御フローユニットと呼ぶことがある。
【００６７】
[0082]  プログラムカウンタ２８は、プログラムカウンタ値を記憶するように構成される。いくつかの例で、プログラムカウンタ２８は、例えば、プログラムカウンタレジスタなどのハードウェアレジスタであり得る。プログラムカウンタ値は、命令ストア１６に記憶された命令を示し得る。プログラムカウンタ値は、場合によっては、命令ストア１６に記憶された命令の命令アドレスに等しくなり得る。さらなる場合で、プログラムカウンタ値は、命令ストア１６に記憶された命令の命令アドレスを計算するために使用され得る。例えば、プログラムカウンタ値は、命令アドレスを生成するためにオフセット値に加算され得る。プログラムカウンタ２８は、処理要素１４のすべてについて単一のプログラムカウンタとして使用され得るので、プログラムカウンタ２８は、本明細書では「グローバルプログラムカウンタ」または「グローバルプログラムカウンタレジスタ」と呼ぶことがある。
【００６８】
[0083]  フェッチモジュール３０は、プログラムカウンタ２８に記憶されたプログラムカウンタ値に基づいて命令ストア１６から命令をフェッチする（例えば、取り出す）ように構成される。例えば、フェッチモジュール３０は、プログラムカウンタ２８に記憶されたプログラムカウンタ値によって識別される命令アドレスから命令をフェッチし得る。フェッチモジュール３０は、さらなる処理のために、フェッチされた命令を復号モジュール３２に与え得る。
【００６９】
[0084]  復号モジュール３２は、フェッチモジュール３０から受信した命令を復号するように構成される。命令を復号することは、命令が処理要素１４によって処理され得る命令のタイプであるかどうかを判断することに関与し得る。命令が、処理要素１４によって処理され得る命令のタイプである場合、復号モジュール３２は、命令を処理要素１４のうちの１つまたは複数の上で実行させ得る。いくつかの例で、復号モジュール３２は、命令を処理要素１４のすべての上で実行させ得る。他の例で、復号モジュール３２は、命令を処理要素１４のすべてよりも少ないものの上で実行させ得る。命令を処理要素１４のうちの１つまたは複数の上で実行させることは、場合によっては、実行のための処理要素１４のうちの１つまたは複数に命令を発行することを含み得る。例えば、復号モジュール３２は、処理のためのアクティブスレッドに対応するすべての処理要素１４に連続命令を発行し得る。命令が、処理要素１４によって処理され得る命令のタイプでない場合、制御ユニット１２は、処理のために処理要素１４のいずれかに命令を発行することなしに命令を処理し得る。例えば、命令は、処理要素１４による処理を必要としないタイプの制御フロー命令であり得、その場合、制御ユニット１２は、処理要素１４のいずれかに命令を発行することなしに命令を処理し得る。
【００７０】
[0085]  いずれの場合も、復号モジュール３２は、さらなる処理のために制御フローモジュール３４に制御情報をフォワーディングし得る。いくつかの例で、制御情報は命令自体であり得る。さらなる例で、制御情報は、例えば、命令が制御フロー命令であるのか連続命令であるのかを示す情報、命令が制御フロー命令である場合、命令が分岐命令であるのかジャンプ命令であるのかを示す情報、命令が分岐命令またはジャンプ命令である場合、分岐命令またはジャンプ命令が、順方向分岐命令またはジャンプ命令であるのか逆方向分岐命令またはジャンプ命令であるのかを示す情報、および命令が分岐命令である場合、分岐条件を指定する情報を含み得る。
【００７１】
[0086]  処理要素１４によって処理され得るタイプである命令は、算術命令と論理命令とを含み得る。算術命令は、処理要素１４に算術演算を実施するように命令する命令を指すことがあり、論理命令は、処理要素１４に論理演算を実施するように命令する命令を指すことがある。いくつかの例で、制御フロー命令は、処理要素１４によって処理され得るタイプの命令であり得る（例えば、制御フロー命令は、処理要素１４によって評価される分岐条件を含み得る）。処理要素１４によって処理され得るタイプでない命令は、分岐条件が制御ユニット１２によって評価される制御フロー命令、および／または分岐条件を有しない制御フロー命令を含み得る。
【００７２】
[0087]  制御フローモジュール３４は、制御ユニット１２によって処理されるべき次命令に関連付けられたプログラムカウンタ値を判断し、プログラムカウンタ値をプログラムカウンタ２８にロードし得る。前にフェッチされた命令が連続命令である場合、制御フローモジュール３４は、プログラムカウンタ２８にロードすべき、次連続命令を示すプログラムカウンタ値を選択し得る。前にフェッチされた命令が分岐命令またはジャンプ命令である場合、制御フローモジュール３４は、いくつかの例で、制御フロー命令によって識別されるターゲット命令に関連付けられたターゲットプログラムカウンタ値、またはプログラムカウンタ２８にロードすべき、次連続命令を示すプログラムカウンタ値のうちの１つを選択し得る。
【００７３】
[0088]  いくつかの例で、制御フローモジュール３４は、プログラムカウンタ２８にロードすべき新しいプログラムカウンタ値を選択するために最小レジュームカウンタ（ＭＩＮＲＣ：minimum resume counter）を利用し得る。ＭＩＮＲＣ値は、レジュームカウンタ値のセットからの最も小さいレジュームカウンタ値を示し得る。場合によっては、レジュームカウンタ値のセットは、システム中で実行しているすべてのスレッドのためのレジュームカウンタ値を含み得る。さらなる場合で、レジュームカウンタ値のセットは、現在実行中の処理モジュールの実行が開始されたとき、アクティブであったすべてのスレッドのためのレジュームカウンタ値を含み得る。現在実行中の処理モジュールは、例えば、主要なプログラムモジュールまたはサブルーチンプログラムモジュールであり得る。ＭＩＮＲＣが使用される例で、制御フローモジュール３４は、制御フロー命令によって指定されたターゲット命令に関連付けられたターゲットプログラムカウンタ値、次連続命令を示すプログラムカウンタ値、または次の命令サイクルを実行するためのプログラムカウンタ２８にロードすべきＭＩＮＲＣ値のうちの１つを選択し得る。
【００７４】
[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]  上記で説明したように、レジュームチェックモジュール６６は、レジュームチェック動作の結果に基づいてプログラム状態レジスタ７４を更新し得る。この更新は、非同期的にレジュームチェックモジュール６６によって実施され得る。例えば、レジュームチェック動作を実施するより前にプログラム状態が状態１であり、すべての非アクティブスレッドが再アクティブ化された場合、プログラム状態レジスタ７４は、すべてのスレッドがアクティブ化されたことを反映するために、非同期的にプログラム状態レジスタ７４を状態０に変更し得る。状態遷移ブロック７６は、レジュームチェックモジュール６６による更新の後に利用可能である現在プログラム状態に基づいて新しいプログラム状態を生成することに留意されたい。同様に、スレッドディアクティベータ７８は、レジュームチェックモジュール６６による更新の後に利用可能である現在プログラム状態に基づいて、１つまたは複数のスレッドを非アクティブ化すべきかどうかを判断し、次命令ブロック８０は、レジュームチェックモジュール６６による更新の後に利用可能である現在プログラム状態に基づいて新しいプログラムカウンタ値を判断する。従って、プログラム状態は、レジュームチェックにより単一の処理サイクル中に２つの異なる状態間で変化し得るが、処理サイクルの最終状態、すなわち、レジュームチェックが完了した後に発生する状態が、状態遷移ブロック７６、スレッドディアクティベータ７８および次命令ブロック８０の各々による処理のために現在プログラム状態として使用される。
【０１３４】
[0144]  図５は、本開示による、図４に示された制御フローモジュール３４の例示的な動作を特徴づける状態遷移表である。図５の状態遷移表は、現在プログラム状態を表す「古い状態」列と、次の処理サイクルについての新しいプログラム状態またはレジュームチェック動作による非同期遷移の後に発生したプログラム状態のいずれかを表す「新しい状態」列とを含む。状態遷移表は、イベント情報生成器７２によって生成されたイベントを含む「イベント」列をも含む。「イベント」列中のインジケータ「該当なし」は、レジュームチェック動作により状態遷移およびアクションが行われることと、イベントがそのような遷移とは無関係であることとを意味する。状態遷移表は、現在プログラム状態とイベントとの特定の組合せに応答してどんなアクションが行われるかを示す「アクション」列をも含む。「アクション」列中の「レジューム」と標示されたアクションは、レジュームチェック動作により非同期状態遷移が行われることを意味する。
【０１３５】
[0145]  図５に示されているように、状態遷移ブロック７６は、現在状態が状態０であることと、Ｓイベント、Ｊｆイベント、Ｊｂイベント、ＢｆｕＴイベント、ＢｆｕＦイベント、ＢｂｕＴイベント、またはＢｂｕＦイベントを受信したこととに応答して、プログラム状態レジスタ７４にロードすべき新しい状態として状態０を選択する。状態遷移ブロック７６は、現在状態が状態０であることと、ＢｂｄイベントまたはＢｆｄイベントを受信したこととに応答して、プログラム状態レジスタ７４にロードすべき新しい状態として状態１を選択する。状態遷移ブロック７６はまた、現在状態が状態１であることと、Ｓイベント、Ｊｂイベント、ＢｂｕＦイベント、ＢｂｕＴイベント、ＢｆｕＦイベント、Ｂｂｄイベント、またはＢｆｄイベントを受信したこととに応答して、プログラム状態レジスタ７４にロードすべき新しい状態として状態１を選択する。状態遷移ブロック７６は、現在状態が状態１であることと、ＪｆイベントまたはＢｆｕＴイベントを受信したこととに応答して、プログラム状態レジスタ７４にロードすべき新しい状態として状態２を選択する。状態遷移ブロック７６はまた、現在状態が状態２であることと、何らかイベントを受信したこととに応答して、プログラム状態レジスタ７４にロードすべき新しい状態として状態２を選択する。レジュームチェック動作の一部として１つまたは複数のスレッドを再アクティブ化することに応答して、状態遷移ブロック７６は、非同期的に状態０または状態１に遷移し得る。
【０１３６】
[0146]  同じく図５に示されているように、スレッドディアクティベータ７８は、現在状態が状態０または状態１であることと、ＢｂｄイベントまたはＢｆｄイベントを受信したこととに応答して、１つまたは複数のスレッドを非アクティブ化することを判断し得る。ＢｂｄイベントおよびＢｆｄイベントは、分岐命令についての分岐条件の評価に起因するダイバージェンスイベントと呼ばれることがある。スレッドディアクティベータ７８は、Ｂｂｄイベントを受信したことに応答して、分岐条件を満たさない（すなわち、偽の条件）すべてのアクティブスレッドを非アクティブ化することと、Ｂｆｄイベントを受信したことに応答して、分岐条件を満たす（すなわち、真の条件）すべてのアクティブスレッドを非アクティブ化することとを判断し得る。スレッドディアクティベータ７８は、現在状態が状態１であることと、ＪｆイベントまたはＢｆｕＴイベントを受信したこととに応答して、すべてのアクティブスレッドを非アクティブ化することを判断し得る。
【０１３７】
[0147]  図５に示されているように、次命令ブロック８０は、現在プログラム状態とイベントとの様々な組合せに応答して、プログラムカウンタ２８にロードすべき、次連続命令を示すプログラムカウンタ値（すなわち、「ＰＣ＋１」）、またはターゲット命令を示すプログラムカウンタ値（すなわち、ターゲットプログラムカウンタ値）のうちの１つを選択し得る。例えば、次命令ブロック８０は、現在状態が状態０であることと、Ｓイベント、ＢｆｕＦイベント、ＢｂｕＦイベント、またはＢｆｄイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、次連続命令を示すプログラムカウンタ値（すなわち、「ＰＣ＋１」）を選択し得る。次命令ブロック８０はまた、現在状態が状態１であることと、Ｓイベント、ＢｂｕＦイベント、ＢｆｕＦイベント、Ｂｆｄイベント、Ｊｆイベント、またはＢｆｕＴイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、次連続命令を示すプログラムカウンタ値（すなわち、「ＰＣ＋１」）を選択し得る。次命令ブロック８０はまた、現在状態が状態２であることと、何らかのイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、次連続命令を示すプログラムカウンタ値（すなわち、「ＰＣ＋１」）を選択し得る。次命令ブロック８０は、現在状態が状態０であることと、Ｊｆイベント、Ｊｂイベント、ＢｆｕＴイベント、ＢｂｕＴイベント、またはＢｂｄイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、ターゲット命令を示すプログラムカウンタ値（すなわち、ターゲットプログラムカウンタ値）を選択し得る。次命令ブロック８０はまた、現在状態が状態１であることと、Ｊｂイベント、ＢｂｕＴイベント、またはＢｂｄイベントを受信したこととに応答して、プログラムカウンタ２８にロードすべき、ターゲット命令を示すプログラムカウンタ値（すなわち、ターゲットプログラムカウンタ値）を選択し得る。
【０１３８】
[0148]  図６は、本開示の選択的レジュームチェックアクティブ化技法を実装するために使用され得る例示的なコンピューティングシステム１００を示すブロック図である。コンピューティングシステム１００は、プロセッサ１０２、１０４と、メモリ１０６と、バス１０８とを含む。プロセッサ１０２とプロセッサ１０４とメモリ１０６とはバス１０８を介して互いに通信可能に結合され得る。バス１０８は、例えば、第３世代バス（例えば、ＨｙｐｅｒＴｒａｎｓｐｏｒｔバスまたはＩｎｆｉｎｉＢａｎｄバス）、第２世代バス（例えば、Ａｄｖａｎｃｅｄ  Ｇｒａｐｈｉｃｓ  Ｐｏｒｔバス、Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ（ＰＣＩ）Ｅｘｐｒｅｓｓバス、またはＡｄｖａｎｃｅｄ  ｅＸｅｎｔｉｓｉｂｌｅ  Ｉｎｔｅｒｆａｃｅ（ＡＸＩ）バス）、あるいは別のタイプのバスまたはデバイス相互接続など、様々なバス構造または他の通信構造のいずれかであり得る。図６に示された異なる構成要素間のバスおよび通信インターフェースの特定の構成は例示にすぎず、同じまたは異なる構成要素をもつコンピューティングデバイスおよび／またはコンピューティングシステムの他の構成が、本開示の技法を実装するために使用され得ることに留意されたい。
【０１３９】
[0149]  プロセッサ１０２および１０４は１つまたは複数のプロセッサにそれぞれ対応し得る。１つまたは複数のプロセッサは、任意のタイプの汎用プロセッサまたは専用プロセッサであり得る。いくつかの例で、プロセッサ１０２は、アプリケーションプロセッサ、ホストプロセッサおよび／または中央処理ユニット（ＣＰＵ）であり得る。さらなる例で、プロセッサ１０４はグラフィックス処理ユニット（ＧＰＵ）であり得る。そのような例で、ＧＰＵは、グラフィックス演算の処理を加速すること、および／またはプロセッサ１０２の指示で汎用計算タスク（例えば、グラフィックス処理ユニット上での汎用計算（ＧＰＧＰＵ：general-purpose computing on graphics processing unit）タスク）を実施することを行うように構成され得る。プロセッサ１０２は、コンパイラモジュール１１０を実行するように構成される。プロセッサ１０４は、本開示の図１に記載されている処理システム１０に対応し得る処理システム１０を含み得る。プロセッサ１０２とプロセッサ１０４は異なるプロセッサであるものとして図６に示されているが、他の例で、プロセッサ１０２とプロセッサ１０４は同じプロセッサであり得る。
【０１４０】
[0150]  メモリ１０６は、プロセッサ１０２、１０４が実行するためにアクセス可能であるプログラムモジュールおよび／または命令を記憶すること、ならびに／あるいはプロセッサ１０２および１０４上で実行するプログラムが使用するデータを記憶することを行うように構成され得る。メモリ１０６は、例えば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、読取り専用メモリ（ＲＯＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的消去可能プログラマブルＲＯＭ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、磁気データ媒体または光記憶媒体など、１つまたは複数の揮発性または不揮発性のメモリまたは記憶デバイスから形成され得る。メモリ１０６は、コンパイラコード１１２と、ソースコード１１４と、コンパイルドコード１１６とを含む。
【０１４１】
[0151]  コンパイラモジュール１１０は、コンパイラコード１１２中に含まれるコンパイル技法に基づいて、コンパイルドコード１１６を生成するためにソースコード１１４をコンパイルするように構成され得る。言い換えれば、コンパイラモジュール１１０は、プロセッサ１０２上で実行しているコンパイラコード１１２のランタイム実行インスタンスであり得る。
【０１４２】
[0152]  ソースコード１１４は、プロセッサ１０４および／または処理システム１０によって実行されるべきプログラムに対応し得る。コンパイルドコード１１６はソースコード１１４のコンパイルされたバージョンであり得る。いくつかの例で、コンパイルされたバージョンは、プロセッサ１０４および／または処理システム１０によって実行されることが可能であるオブジェクトコード、バイトコード、および／または機械語コードであり得る。
【０１４３】
[0153]  本開示によれば、コンパイラモジュール１１０は、コンパイルドコード１１６が、コンパイルドコード１１６を実行するプロセッサ（例えば、プロセッサ１０４および／または処理システム１０）によって実行されたとき、該当する命令についてレジュームチェック動作が実施されるべきであるかどうかを示す情報をそれぞれ含む１つまたは複数の命令を含むように、コンパイルドコード１１６を生成するように構成され得る。いくつかの例で、命令中に含まれる情報は、例えば、命令を実行するプロセッサに、命令についてレジュームチェック動作を実施すべきかどうかを命令する１ビットフラグなど、情報フィールドであり得る。追加の例で、命令中に含まれる情報は、特定の動作コード（すなわち、オペコード）パラメータ、ビットの組合せなど、他の形態をとり得る。
【０１４４】
[0154]  いくつかの例で、コンパイラモジュール１１０は、コンパイルドコード１１６の実行中に命令ごとに特定の命令についてレジュームチェック動作が選択的に実施されるように構成され得る。例えば、コンパイラモジュール１１０は、ソースコード１１４によって指定されたプログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして１つまたは複数の命令を選択し、そのプログラムのためのコンパイルドコード１１６が選択された１つまたは複数の命令を含むように、および選択された１つまたは複数の命令が、選択された１つまたは複数の命令についてレジュームチェック動作が実施されるべきであることを示す情報を含むように、コンパイルドコード１１６を生成し得る。別の例として、コンパイルドコード１１６は、ソースコード１１４によって指定されたプログラムが実行されるときにレジュームチェック動作が実施されるべきでない命令であるものとして１つまたは複数の命令を選択し、そのプログラムのためのコンパイルドコード１１６が選択された１つまたは複数の命令を含むように、および選択された１つまたは複数の命令が、選択された１つまたは複数の命令についてレジュームチェック動作が実施されるべきでないことを示す情報を含むように、コンパイルドコード１１６を生成し得る。
【０１４５】
[0155]  さらなる例で、コンパイラモジュール１１０は、命令が、分岐命令またはジャンプ命令のうちの少なくとも１つを実行することに応答して非アクティブ化された１つまたは複数のスレッドによって実行されるべき候補次命令である場合、プログラムが実行されるときにレジュームチェック動作が実施されるべきである命令であるものとして命令を選択するように構成され得る。候補次命令は、そのような非アクティブ化されたスレッドが、分岐命令またはジャンプ命令を実行することに応答して再アクティブ化されるようにスケジュールされるであろう命令を指すことがある。例えば、順方向分岐命令および順方向ジャンプ命令の場合、候補次命令は順方向ジャンプ命令または順方向分岐命令のターゲット命令であり得る。別の例として、逆方向分岐命令の場合、候補次命令は逆方向分岐命令の後の次連続命令であり得る。
【０１４６】
[0156]  分岐命令は、該当するスレッドについて分岐条件が満たされるかどうかに基づいて、１つまたは複数のスレッドの各々について実行されるべき次命令を指定する、制御フロー命令を指すことがある。分岐命令は、ターゲット命令を指定するフィールドと、そのターゲット命令に分岐するための分岐条件を指定するフィールドとを含み得る。分岐命令を実行するスレッドの各々について、該当するスレッドが分岐条件を満たす場合、分岐命令は、該当するスレッドによって実行されるべき次命令としてターゲット命令を指定し得る。一方、該当するスレッドが分岐条件を満たさない場合、分岐命令は、該当するスレッドによって実行されるべき次命令として次連続命令を指定し得る。次連続命令は、命令の順序付きシーケンスで分岐命令の直後に行われ得る。
【０１４７】
[0157]  順方向分岐命令は、分岐命令中で指定されたターゲット命令が、分岐命令を含むプログラムを形成する命令の順序付きシーケンスで分岐命令の後に行われる、分岐命令を指すことがある。逆方向分岐命令は、分岐命令中で指定されたターゲット命令が、分岐命令を含むプログラムを形成する命令の順序付きシーケンスで次連続命令より前に行われる、分岐命令を指すことがある。
【０１４８】
[0158]  ジャンプ命令は、１つまたは複数のスレッドの各々について実行されるべき次命令を無条件に指定する制御フロー命令を指すことがある。ジャンプ命令は、ターゲット命令を指定する情報フィールドを含み得、いくつかの例で、ターゲット命令にジャンプするための条件を指定するフィールドを含まないことがある。ジャンプ命令は、ジャンプ命令を実行するスレッドの各々によって実行されるべき次命令としてターゲット命令を無条件に指定し得る。
【０１４９】
[0159]  順方向および逆方向分岐命令と同様に、順方向ジャンプ命令は、ジャンプ命令中で指定されたターゲット命令が、ジャンプ命令を含むプログラムを形成する命令の順序付きシーケンスでジャンプ命令の後に行われる、ジャンプ命令を指すことがある。逆方向ジャンプ命令は、ジャンプ命令中で指定されたターゲット命令が、ジャンプ命令を含むプログラムを形成する命令の順序付きシーケンスで次連続命令より前に行われる、ジャンプ命令を指すことがある。次連続命令は、命令の順序付きシーケンスでジャンプ命令の直後に行われ得る。
【０１５０】
[0160]  上記で説明したように、スレッド再アクティブ化のためのレジュームカウンタベースの手法を使用する処理システムにおいて適切な制御フローが維持されることを保証するために、処理システム１０は、「最小値アドレス第１」スレッド処理順序を使用し得る。概して、「最小値アドレス第１」スレッド処理順序は、より低い値のアドレスにおける命令を処理するようにスケジュールされたスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドより前に実行される処理順序を指すことがある。「最小値アドレス第１」スレッド処理順序は、分岐命令の方向（すなわち、順方向または逆方向）に基づいて、ダイバージェント分岐命令に応答してどのスレッドが非アクティブ化されるかを区別し得る。
【０１５１】
[0161]  例えば、ダイバージェント逆方向分岐命令の場合、処理システム１０は、分岐条件が満たされないスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令の後に行われる次連続命令に関連付けられた値にセットし、分岐命令によって指定されたターゲット命令に関連付けられた値をプログラムカウンタにロードし、続いて分岐条件が満たされるスレッドを実行し得る。ダイバージェント順方向分岐命令の場合、処理システム１０は、分岐条件が満たされるスレッドを非アクティブ化し、非アクティブ化されている各スレッドのためのレジュームカウンタ値を、分岐命令によって指定されたターゲット命令に関連付けられた値にセットし、分岐命令の後に行われる次連続命令に関連付けられた値をプログラムカウンタにロードし、続いて分岐条件が満たされないスレッドを実行し得る。このようにしてスレッドを非アクティブ化することは、より低い値のアドレスにおける命令を処理するようにスケジュールされたダイバージェントスレッドが、より高い値のアドレスにおける命令を処理するようにスケジュールされたスレッドより前に実行すること（すなわち、「最小値アドレス第１」スレッド処理順序）を保証する。
【０１５２】
[0162]  １つまたは複数のスレッドがすでに非アクティブ化されており、残りのアクティブスレッドが、順方向ジャンプ命令または一様に満たされる順方向分岐命令（すなわち、分岐条件がすべてのアクティブスレッドについて一様に満たされる順方向分岐命令）のいずれかを実行する場合、制御フローを扱う１つの手法は、すべてのアクティブスレッドがアクティブのままになるので、順方向ジャンプ命令または順方向分岐命令中で指定されたターゲット命令に常にジャンプすることであり得る。しかしながら、そのような手法は「最小値アドレス第１」スレッド処理順序を保証しない。特に、１つまたは複数の非アクティブスレッドは、場合によっては、ジャンプ命令または分岐命令の現在プログラムカウンタ値とターゲットプログラムカウンタ値（すなわち、分岐命令またはジャンプ命令中で指定されたターゲット命令に関連付けられたプログラムカウンタ値）との間にあるレジュームカウンタ値を有し得る。制御フローがそのような非アクティブスレッドを越えてジャンプした場合、そのようなスレッドは、プログラムの実行を完了するより前に再アクティブ化されない可能性がある。
【０１５３】
[0163]  そのような状況を回避するために、順方向ジャンプ命令または一様に満たされる順方向分岐命令が実行されるときはいつでも、処理システム１０は、すべてのスレッドを非アクティブ化することと、非アクティブスレッドのためのレジュームカウンタ値の最初の値が到達されるか、あるいはジャンプ命令または分岐命令のためのターゲットプログラムカウンタ値が到達されるまで、プログラムカウンタ値を連続的に増分することとを行うように構成され得る。このようにして、スレッドのための「最小値アドレス第１」処理順序が維持される。
【０１５４】
[0164]  いくつかの例で、コンパイラモジュール１１０は、上記で説明したように「最小値アドレス第１」スレッド処理順序を利用する処理システムにおいて、プログラムの１つまたは複数の命令についてそのプログラムの実行中にレジュームチェック動作が実施される必要があり得るかどうかを判断するように構成され得る。そのような例で、コンパイラモジュール１１０は、プログラムの実行中にレジュームチェック動作が実施される必要があり得ると判断された命令についてレジュームチェック動作を有効にすることと、プログラムの実行中にスレッドが再アクティブ化される必要がないであろうと判断された命令についてレジュームチェック動作を無効にすることとを行うように構成され得る。
【０１５５】
[0165]  １つの具体的な例として、ダイバージェント順方向分岐命令の場合、コンパイラモジュール１１０は、分岐条件を満たすすべてのスレッドが非アクティブ化されることになるので、順方向分岐命令のターゲット命令である命令についてレジュームチェック動作が実施されるべきであると判断し得る。ダイバージェント逆方向分岐命令の場合、コンパイラモジュール１１０は、分岐条件を満たさないすべてのスレッドが非アクティブ化されることになるので、逆方向分岐命令の直後に行われる命令（すなわち、逆方向分岐命令の後の次連続命令）についてレジュームチェック動作が実施されるべきであると判断し得る。順方向ジャンプ命令の場合、コンパイラモジュール１１０は、非アクティブスレッドのためのレジュームカウンタ値の最初の値が到達されるか、またはジャンプ命令のためのターゲットプログラムカウンタ値が到達されるまで、プログラムカウンタ値を巡回するためにすべてのスレッドが非アクティブ化され得るので、順方向ジャンプ命令のターゲット命令である命令についてレジュームチェック動作が実施されるべきであると判断し得る。
【０１５６】
[0166]  この例で、順方向分岐命令または順方向ジャンプ命令のターゲット命令であるものとして、あるいは逆方向分岐命令の後の次連続命令であるものとして識別されなかった他の命令の場合、コンパイラモジュール１１０は、プログラムの実行中に非アクティブ化されたスレッドがそのような命令において再アクティブ化される必要がないことになるので、そのような命令についてレジュームチェック動作が実施される必要がないと判断し得る。そのような命令についてレジュームチェック動作を実施しないことは、あらゆる命令についてレジュームチェック動作が実施される処理システムと比較して、ＳＩＭＤ処理システムの電力消費を低減し、および／またはそれの性能を改善し得る。
【０１５７】
[0167]  プログラムの実行中にレジュームチェック動作が実施される必要があり得ると判断された命令の場合、コンパイラモジュール１１０は、それらの命令についてレジュームチェック動作が実施されるべきであることを示す情報をコンパイルされた命令中に配置し得る。同様に、プログラムの実行中にレジュームチェック動作が実施される必要がないと判断された命令の場合、コンパイラモジュール１１０は、それらの命令についてレジュームチェック動作が実施されるべきでないことを示す情報を命令中に配置し得る。
【０１５８】
[0168]  図７〜図１０は、本開示による、レジュームチェック動作を選択的にアクティブ化および／または実施するための例示的な命令処理技法を示す流れ図である。図７〜図１０に示された例示的な技法は、いくつかの例で、図２〜図４のいずれかの制御フローモジュール３４中で、および／または図１〜図４および図６のいずれかの処理システム１０内で実装され得る。説明を簡単にするために、それらの技法について、図２に示された制御フローモジュール３４に関して説明するが、それらの技法は、同じまたは異なる構成で同じまたは異なる構成要素をもつ他のシステムにおいて実施され得ることを理解されたい。
【０１５９】
[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]  また、本開示で説明した技法は、命令を記憶するコンピュータ可読記憶媒体などのコンピュータ可読媒体中に記憶、実施または符号化され得る。コンピュータ可読媒体中に埋め込まれたまたは符号化された命令は、例えば、その命令が１つまたは複数のプロセッサによって実行されたとき、１つまたは複数のプロセッサに本明細書で説明した技法を実施させ得る。コンピュータ可読記憶媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、プログラマブル読取り専用メモリ（ＰＲＯＭ）、消去可能プログラマブル読取り専用メモリ（ＥＰＲＯＭ）、電子的に消去可能なプログラマブル読取り専用メモリ（ＥＥＰＲＯＭ）、フラッシュメモリ、ハードディスク、ＣＤ−ＲＯＭ、フロッピー（登録商標）ディスク、カセット、磁気媒体、光媒体、または有形である他のコンピュータ可読記憶媒体を含み得る。
【０１９６】
[0206]  コンピュータ可読媒体は、上記に記載した有形記憶媒体などの有形記憶媒体に対応するコンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、例えば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を可能にする任意の媒体を含む通信媒体を備え得る。このようにして、「コンピュータ可読媒体」という句は、概して、（１）非一時的である有形コンピュータ可読記憶媒体、および（２）一時的な信号または搬送波などの非有形コンピュータ可読通信媒体に対応し得る。
【０１９７】
[0207]  様々な態様および例について説明した。しかしながら、以下の特許請求の範囲から逸脱することなく本開示の構造または技法に変更を行うことができる。
【図１】
2015531124.tif 000003
【図２】
2015531124.tif 000004
【図３】
2015531124.tif 000005
【図４】
2015531124.tif 000006
【図５】
2015531124.tif 000007
【図６】
2015531124.tif 000008
【図７】
2015531124.tif 000009
【図８】
2015531124.tif 000010
【図９】
2015531124.tif 000011
【図１０】
2015531124.tif 000012
【図１１】
2015531124.tif 000013
【図１２】
2015531124.tif 000014
【図１３】
2015531124.tif 000015
【図１４】
2015531124.tif 000016
【図１５】
2015531124.tif 000017
【図１６】
2015531124.tif 000018
【国際調査報告】
2015531124.tif 000019
2015531124.tif 000020
2015531124.tif 000021
2015531124.tif 000022