(57)【要約】  SIMDプロセッサは、複数のスレッドから1つまたは複数のアクティブスレッドを決定し、1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択し、選択されたアクティブスレッド上で発散演算を実行するように構成され得る。発散演算は直列演算であり得る。
2017515228.tif 000002
【特許請求の範囲】
【請求項１】
マルチスレッドプロセッサ上で発散演算を実行する方法であって、
複数のスレッドから1つまたは複数のアクティブスレッドを決定するステップと、
前記1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択するステップと、
前記選択されたアクティブスレッド上で発散演算を実行するステップと
を含む、方法。
【請求項２】
前記マルチスレッドプロセッサが単一命令マルチデータ(SIMD)プロセッサである、請求項1に記載の方法。
【請求項３】
前記複数のスレッドが波動を形成し、前記波動が前記SIMDプロセッサによって並行して実行される、請求項2に記載の方法。
【請求項４】
前記選択されたアクティブスレッド上で前記発散演算を前記実行するステップが、前記選択されたアクティブスレッド上で直列演算を実行するステップを含む、請求項1に記載の方法。
【請求項５】
前記発散演算を前記実行するステップが、共有レジスタ内にサブルーチンターゲットを記憶するステップを含み、前記方法が、
前記共有レジスタに対するアクセスを有する前記1つまたは複数のアクティブスレッド上の前記サブルーチンターゲットにおいて記憶されたコードを実行するステップ
をさらに含む、請求項1に記載の方法。
【請求項６】
発散演算を実行するように構成された装置であって、
マルチスレッドプロセッサを備え、前記マルチスレッドプロセッサが、
複数のスレッドから1つまたは複数のアクティブスレッドを決定し、前記1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択するように構成された制御装置と、
複数の処理要素であって、前記選択されたアクティブスレッドに関連する前記複数の処理要素のうち1つの処理要素が、発散演算を実行するように構成される、複数の処理要素と
を備える、装置。
【請求項７】
前記マルチスレッドプロセッサが単一命令マルチデータ(SIMD)プロセッサである、請求項6に記載の装置。
【請求項８】
前記複数のスレッドが波動を形成し、前記波動が前記SIMDプロセッサによって並行して実行される、請求項7に記載の装置。
【請求項９】
前記選択されたアクティブスレッドに関連する前記処理要素が、直列演算を実行するように構成される、請求項6に記載の装置。
【請求項１０】
前記発散演算が、共有レジスタ内にサブルーチンターゲットを記憶し、前記複数の処理要素が、前記1つまたは複数のアクティブスレッドに関連し、かつ前記共有レジスタに対するアクセスを有する前記複数の処理要素のうちのいずれかの処理要素上の前記サブルーチンターゲットにおいて記憶されたコードを実行するようにさらに構成される、請求項6に記載の装置。
【請求項１１】
マルチスレッドプロセッサ上で発散演算を実行するように構成された装置であって、
複数のスレッドから1つまたは複数のアクティブスレッドを決定するための手段と、
前記1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択するための手段と、
前記選択されたアクティブスレッド上で発散演算を実行するための手段と
を備える、装置。
【請求項１２】
前記マルチスレッドプロセッサが単一命令マルチデータ(SIMD)プロセッサである、請求項11に記載の装置。
【請求項１３】
前記複数のスレッドが波動を形成し、前記波動が前記SIMDプロセッサによって並行して実行される、請求項12に記載の装置。
【請求項１４】
前記選択されたアクティブスレッド上で前記発散演算を前記実行するための手段が、前記選択されたアクティブスレッド上で直列演算を実行するための手段を含む、請求項11に記載の装置。
【請求項１５】
前記発散演算が、共有レジスタ内にサブルーチンターゲットを記憶し、前記装置が、
前記共有レジスタに対するアクセスを有する前記1つまたは複数のアクティブスレッド上の前記サブルーチンターゲットにおいて記憶されたコードを実行するための手段
をさらに備える、請求項11に記載の装置。
【請求項１６】
発散演算を実行するように構成されたマルチスレッドプロセッサであって、
複数のスレッドから1つまたは複数のアクティブスレッドを決定し、前記1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択するように構成された制御装置と、
複数の処理要素であって、前記選択されたアクティブスレッドに関連する前記複数の処理要素のうち1つの処理要素が、発散演算を実行するように構成される、複数の処理要素と
を備える、マルチスレッドプロセッサ。
【請求項１７】
前記マルチスレッドプロセッサが単一命令マルチデータ(SIMD)プロセッサである、請求項16に記載のマルチスレッドプロセッサ。
【請求項１８】
前記複数のスレッドが波動を形成し、前記波動が前記SIMDプロセッサによって並行して実行される、請求項17に記載のマルチスレッドプロセッサ。
【請求項１９】
前記選択されたアクティブスレッドに関連する前記処理要素が、直列演算を実行するように構成される、請求項16に記載のマルチスレッドプロセッサ。
【請求項２０】
前記発散演算が、共有レジスタ内にサブルーチンターゲットを記憶し、前記複数の処理要素が、前記1つまたは複数のアクティブスレッドに関連し、かつ前記共有レジスタに対するアクセスを有する前記複数の処理要素のうちのいずれかの処理要素上の前記サブルーチンターゲットにおいて記憶されたコードを実行するようにさらに構成される、請求項16に記載のマルチスレッドプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、マルチスレッド処理に関し、より詳細には、単一命令マルチデータ(SIMD:single instruction multiple data)処理システムにおける直列実行のための技法に関する。
【背景技術】
【０００２】
単一命令マルチデータ(SIMD)処理システムは、複数のデータ片に関して同じ命令を実行する複数の処理要素を含むパラレルコンピューティングシステムクラスである。SIMDシステムは、独立型コンピュータ、またはコンピューティングシステムのサブシステムであり得る。たとえば、グラフィックス処理ユニット(GPU)内で1つまたは複数のSIMD実行ユニットを使用して、プログラマブルシェーディング(programmable shading)をサポートするプログラマブルシェーディングユニットを実装することができる。
【０００３】
SIMD処理システムは、プログラムに関する複数の実行スレッドが複数の処理要素に関して並行様式で同時に実行することを可能にし、それによって、同じ演算セットを複数のデータ片に関して実行する必要があるプログラムに関するスループットを増大させる。場合によっては、たとえば、1つのスレッドの出力が1つまたは複数の他のスレッドに関する入力として必要とされる状況では、1つまたは複数のスレッドを連続して実行することが望ましい場合がある。SIMD上で直列演算(serial operation)を実行することは、リソース集約的かつ非効率的であり得る。
【発明の概要】
【課題を解決するための手段】
【０００４】
本開示は、SIMD処理システムにおいて直列演算(serialized operation)を実行するための技法について説明する。本開示の例では、直列演算を実行するために複数のアクティブスレッドのうちの1つを選択するハードウェア実行命令が提案される。本命令は、スレッドIDを確認せずに、または命令を使用して共有変数をロックせずに、スレッドを選択することができる。したがって、直列演算は、システムリソースに対する最小限の影響を伴って、迅速かつ効率的に実行され得る。
【０００５】
本開示の一例では、発散演算(divergent operation)を実行するように構成されたマルチスレッドプロセッサは、複数のスレッドから1つまたは複数のアクティブスレッドを決定し、1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択するように構成された制御装置と、複数の処理要素とを備え、選択されたアクティブスレッドに関連する複数の処理要素のうちの1つの処理要素は、発散演算を実行するように構成される。
【０００６】
本開示の別の例では、マルチスレッドプロセッサ上で発散演算を実行するように構成された装置は、複数のスレッドから1つまたは複数のアクティブスレッドを決定するための手段と、1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択するための手段と、選択されたアクティブスレッド上で発散演算を実行するための手段とを備える。
【０００７】
本開示の別の例では、発散演算を実行するように構成された装置は、複数のスレッドから1つまたは複数のアクティブスレッドを決定し、1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択するように構成された制御装置と、複数の処理要素とを備えたマルチスレッドプロセッサを備え、選択されたアクティブスレッドに関連する複数の処理要素のうちの1つの処理要素は、発散演算を実行するように構成される。
【０００８】
本開示の別の例では、マルチスレッドプロセッサ上で発散演算を実行する方法は、複数のスレッドから1つまたは複数のアクティブスレッドを決定するステップと、1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択するステップと、選択されたアクティブスレッド上で発散演算を実行するステップとを含む。
【０００９】
本開示の1つまたは複数の例の詳細を添付の図面および以下の説明に記載する。本開示の他の特徴、目的、および利点は、説明、図面、および特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【００１０】
【図１】本開示の技法を実装するように構成され得るデバイスを示すブロック図である。
【図２】本開示の技法を実装するために使用され得る例示的なグラフィックス処理ユニット(GPU)を示すブロック図である。
【図３】図2の例示的なGPU内の制御装置をより詳細に示すブロック図である。
【図４】本開示の直列演算技法を示す流れ図である。
【図５】本開示の技法の例示的な方法を示すフローチャートである。
【発明を実施するための形態】
【００１１】
本開示は、SIMD処理システム(たとえば、GPU)において直列演算を実行するための技法について説明する。SIMD処理システムにおいて直列演算を実行するための従来技術は、リソース集約的かつ非効率的であり得る。本開示は、すべての非アクティブスレッドにわたってルーピング(looping)せずに直列演算を実行するために、複数のアクティブスレッドのうちの1つのアクティブスレッドを選択する(たとえば、SIMDプロセッサ内のハードウェアによって実行される)命令を提案する。これは、SIMD処理システムにおいてより効率的な直列演算をもたらし得る。
【００１２】
図1は、SIMD処理システムにおける直列実行のための、本開示の技法を実装し得る例示的なデバイスを示すブロック図である。図1は、GPU12と、システムメモリ14と、中央処理装置(CPU)であり得るプロセッサ16とを含むデバイス10を示す。デバイス10の例は、限定はしないが、メディアプレイヤなどのビデオデバイス、セットトップボックス、モバイル電話などのワイヤレスハンドセット、携帯情報端末(PDA)、デスクトップコンピュータ、ラップトップコンピュータ、ゲームコンソール、ビデオ会議ユニット、タブレットコンピューティングデバイスなどを含む。デバイス10は、図1に示すものに加えて構成要素を含み得る。
【００１３】
システムメモリ14は、デバイス10のためのメモリと見なされ得る。システムメモリ14は、1つまたは複数のコンピュータ可読記憶媒体を備えてもよい。システムメモリ14の例は、限定はしないが、ランダムアクセスメモリ(RAM)、電気消去可能プログラマブル読取り専用メモリ(EEPROM)、フラッシュメモリ、または所望のプログラムコードを命令および/またはデータ構造の形で搬送または記憶するために使用され得るとともにコンピュータまたはプロセッサによってアクセスされ得る任意の他の媒体を含み得る。
【００１４】
いくつかの態様では、システムメモリ14は、プロセッサ16および/またはGPU12に本開示においてプロセッサ16およびGPU12に帰する機能を実行させる命令を含み得る。したがって、システムメモリ14は、実行されると、1つまたは複数のプロセッサ(たとえば、プロセッサ16およびGPU12)に様々な機能を実行させる命令を記憶したコンピュータ可読記憶媒体であり得る。
【００１５】
システムメモリ14は、いくつかの例では、非一時的記憶媒体と見なされ得る。「非一時的」という用語は、記憶媒体が搬送波または伝搬信号の形で実施されないことを示し得る。しかしながら、「非一時的」という用語は、システムメモリ14が非可動であること、またはその内容が静的であることを意味すると解釈されるべきではない。一例として、システムメモリ14は、デバイス10から除去可能であり、別のデバイスに移動され得る。別の例として、システムメモリ14と実質的に同様のメモリはデバイス10に挿入され得る。いくつかの例では、非一時的記憶媒体は、経時的に変化し得るデータを(たとえば、RAM内に)記憶することができる。
【００１６】
デバイス10がワイヤレスハンドセット通信デバイスである例など、いくつかの例では、プロセッサ16およびGPU12は集積回路(IC)の形で形成され得る。たとえば、ICはチップパッケージ内の処理チップと見なされてよい。いくつかの例では、プロセッサ16およびGPU12は、デバイス10がデスクトップコンピュータまたはラップトップコンピュータである例など、異なる集積回路(すなわち、異なるチップパッケージ)内に格納され得る。しかしながら、デバイス10がワイヤレスハンドセット通信デバイスである例では、プロセッサ16およびGPU12は異なる集積回路内に格納される可能性があり得る。
【００１７】
プロセッサ16およびGPU12の例は、限定しないが、デジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、または他の等価の集積論理回路もしくは離散論理回路を含む。いくつかの例では、GPU12は、グラフィックス処理に適した超並列処理能力をGPU12に提供する集積論理回路および/または離散論理回路を含む特殊ハードウェアであり得る。場合によっては、GPU12は、汎用処理能力をやはり含むことが可能であり、汎用処理タスク(すなわち、非グラフィックス関連タスク)を実装するとき汎用GPU(GPGPU)と呼ばれる場合がある。
【００１８】
プロセッサ16は、様々なタイプのアプリケーションを実行し得る。アプリケーションの例は、ウェブブラウザ、電子メールアプリケーション、スプレッドシート、ビデオゲーム、または表示のために可視オブジェクトを生成する他のアプリケーションを含む。1つまたは複数のアプリケーションを実行するための命令はシステムメモリ14内に記憶され得る。プロセッサ16は、さらなる処理のために可視オブジェクトのグラフィックスデータをGPU12に送信することができる。
【００１９】
たとえば、プロセッサ16は、超並列動作を必要とするタスクなどの処理タスクをGPU12にオフロードし得る。一例として、グラフィックス処理は超並列演算を必要とし、プロセッサ16はそのようなグラフィックス処理タスクをGPU12にオフロードすることができる。プロセッサ16は、特定のアプリケーション処理インターフェース(API:application processing interface)に従ってGPU12と通信することができる。そのようなAPIの例は、Microsoft(登録商標)によるDirectX(登録商標)API、KhronosグループによるOpenGL(登録商標)API、OpenCL(商標)APIを含むが、本開示の態様は、DirectX API、OpenGL API、またはOpenCL APIに限定されず、他のタイプのAPIに拡張され得る。さらに、本開示で説明する技法はAPIに従って機能することが必要とされず、プロセッサ16およびGPU12は通信するために任意の技法を利用することができる。
【００２０】
グラフィックス演算を実行するために、GPU12はグラフィックス処理パイプラインを実装することができる。グラフィックス処理パイプラインは、GPU12上で実行するソフトウェアまたはファームウェアによって定義される機能を実行することと、非常に特殊な機能を実行するために有線接続された固定機能ユニットによる機能を実行することとを含む。GPU12上で実行するソフトウェアまたはファームウェアは、シェーダプログラム(または、単にシェーダ)と呼ばれる場合があり、シェーダプログラムはGPU12の1つまたは複数のシェーダコア上で実行し得る。ユーザは、任意の考えられる方法で所望のタスクを実行するようにシェーダプログラムを設計することができるため、シェーダプログラムは機能的な柔軟性をユーザに提供する。しかしながら、固定機能ユニットがタスクを実行するように、固定機能ユニットは有線接続される。したがって、固定機能ユニットは機能的な柔軟性をあまり提供することができない。
【００２１】
たとえば、プロセッサ16は、ビデオゲームなどのアプリケーションを実行することができ、プロセッサ16はその実行の一環としてグラフィックスを生成することができる。プロセッサ16は、GPU12によって処理するためにグラフィックスデータを出力することができる。GPU12は、次いで、グラフィックスパイプライン内でグラフィックスデータを処理することができる。いくつかの例では、グラフィックスデータを処理するために、GPU12は1つまたは複数のシェーダプログラムを実行する必要があり得る。たとえば、プロセッサ16上で実行するアプリケーションは、プロセッサ16に、システムメモリ14からシェーダプログラムを取り出すようにGPU12に指示させ、シェーダプログラムを実行するようにGPU12に指示させることができる。
【００２２】
デバイス10はまた、ディスプレイ60と、ユーザインターフェース62と、トランシーバモジュール64とをオプションで含み得る。デバイス10は、明快のために、図1に示さない追加のモジュールまたはユニットを含み得る。たとえば、デバイス10は、デバイス10がモバイルワイヤレス電話である例では、電話通信を実施するために、それらのいずれも図1に示されていないスピーカまたはマイクロフォンを含み得る。さらに、デバイス10内に示される様々なモジュールまたはユニットはデバイス10のすべての例において必要でない場合がある。たとえば、デバイス10がデスクトップコンピュータである例では、ユーザインターフェース62およびディスプレイ60はデバイス10の外部にあり得る。別の例では、ディスプレイ60がモバイルデバイスのタッチセンシティブディスプレイまたはプレゼンスセンシティブ(presence-sensitive)ディスプレイである例では、ユーザインターフェース62はディスプレイ60の一部であり得る。
【００２３】
ユーザインターフェース62の例は、限定しないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスを含む。ユーザインターフェース62は、タッチスクリーンであってもよく、ディスプレイ60の一部として組み込まれてもよい。トランシーバモジュール64は、デバイス10と他のデバイスまたはネットワークとの間のワイヤレス通信またはワイヤード通信を可能にするための回路を含み得る。トランシーバモジュール64は、変調器、復調器、および増幅器と、ワイヤード通信またはワイヤレス通信のための他のそのような回路を含み得る。ディスプレイ60は、液晶ディスプレイ(LCD)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、タッチセンシティブディスプレイ、プレゼンスセンシティブディスプレイ、または別のタイプのディスプレイデバイスを含み得る。
【００２４】
以下でより詳細に説明するように、本開示の技法によれば、GPU12は、マルチスレッドプロセッサ上で発散演算を実行する方法を実行するように構成され得る。GPU12は、複数のスレッドから1つまたは複数のアクティブスレッドを決定し、1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択し、選択されたアクティブスレッド上で発散演算を実行するように構成され得る。
【００２５】
図2は、本開示の直列処理のための技法を実装するために使用され得るGPU12の例示的な構成を示すブロック図である。GPU12は、プログラムに関する命令を並行様式で実行するように構成される。GPU12は、制御装置72と、処理要素74A〜74D(集合的に「処理要素74」)と、命令ストア76と、データストア78と、通信経路80、82、84、86A〜86Dとを含む。通信経路86A〜86Dは、集合的に「通信経路86」と呼ばれる場合がある。いくつかの例では、GPU12は、処理要素74を使用してプログラムに関する複数の実行スレッドを実行するように構成された単一命令マルチデータ(SIMD)処理システムとして構成され得る。そのようなSIMDシステムでは、処理要素74はともに、異なるデータ項目に関して単一の命令を一度に処理することができる。そのプログラムに関連するスレッドのすべてが実行を完了した後、プログラムは後退し得る。
【００２６】
制御装置72は、GPU12を制御して、命令ストア76内に記憶されたプログラムに関する命令を実行するように構成される。プログラムの各命令に関して、制御装置72は、通信経路80を介して命令ストア76から命令を取り出し、その命令を処理することができる。いくつかの例では、制御装置72は、命令に関連する演算を処理要素74のうちの1つまたは複数に関して実行させることによって、命令を処理することができる。たとえば、制御装置72によって取り出される命令は、命令によって指定されたデータ項目に関する算術演算を実行するようにGPU12に指示する算術命令であり得、制御装置72は、処理要素74のうちの1つまたは複数に指定されたデータ項目に関する算術演算を実行させることができる。さらなる例では、制御装置72は、処理要素74に関する演算を実行させずに、命令を処理することができる。
【００２７】
制御装置72は、通信経路82を介して処理要素74に命令を提供することによって、処理要素74のうちの1つまたは複数に関する演算を実行させることができる。命令は処理要素74によって実行されるべき演算を指定し得る。処理要素74のうちの1つまたは複数に提供される命令は、命令ストア76から取り出された命令と同じであってよく、または異なってもよい。いくつかの例では、制御装置72は、その時点で演算が実行されるべき、処理要素74の特定のサブセットのアクティブ化、およびその時点で演算が実行されるべきでない、処理要素74の別のサブセットの非アクティブ化のうちの1つまたは両方によって、(単一の処理要素によって含まれた)処理要素74の特定のサブセットに関する演算を実行させることができる。制御装置72は、通信経路82を介して処理要素の各々にそれぞれのアクティブ化および/または非アクティブ化信号を提供することによって、処理要素74をアクティブ化および/または非アクティブ化することができる。いくつかの例では、制御装置72は、処理要素74に命令を提供するとともに処理要素74にアクティブ化および/または非アクティブ化信号を提供することによって、処理要素74をアクティブ化および/または非アクティブ化することができる。さらなる例では、制御装置72は、処理要素74に命令を提供するのに先立って、処理要素74をアクティブ化および/または非アクティブ化することができる。
【００２８】
制御装置72は、処理要素74を使用してプログラムに関する複数の実行スレッドを実行することができる。並行して実行されるべき複数のスレッドは、波動と呼ばれる場合がある。処理要素74の各々は、複数のスレッドのそれぞれのスレッドに関するプログラムの命令を処理するように構成され得る。たとえば、制御装置72は、各実行スレッドを処理のために処理装置74の各々に割り当てることができる。プログラムに関する実行スレッドは、データ項目のセット内の異なるデータ項目に関する命令の同じセットを実行することができる。たとえば、処理要素74Aは、複数のデータ項目内のデータ項目の第1のサブセットに関して命令ストア76内に記憶されたプログラムに関する第1の実行スレッドを実行することができ、処理要素74Bは、複数のデータ項目内のデータ項目の第2のセブセットに関して命令ストら76内に記憶されたプログラムに関する第2の実行スレッドを実行することができる。第1の実行スレッドは、第2の実行スレッドと同じ命令を含み得るが、データ項目の第1のサブセットはデータ項目の第2のサブセットとは異なる場合がある。
【００２９】
いくつかの例では、制御装置72は、複数の実行スレッド内の個々のスレッドをアクティブ化および非アクティブ化することができる。制御装置72がスレッドを非アクティブ化するとき、制御装置72は、スレッドを実行するために割り当てられた処理要素74A〜74Dを非アクティブ化および/または無効化することもできる。そのような非アクティブ化されたスレッドは非アクティブスレッドと呼ばれる場合がある。同様に、制御装置72がスレッドをアクティブ化するとき、制御装置72は、スレッドを実行するために割り当てられた処理要素74A〜74Dをアクティブ化することもできる。そのようなアクティブ化されたスレッドはアクティブスレッドと呼ばれる場合がある。以下でより詳細に説明するように、制御装置72は、他のアクティブスレッドまたは非アクティブスレッドを考慮する必要なしに、発散演算(たとえば、直列演算)を実行するためにアクティブスレッドを選択するように構成され得る。
【００３０】
本明細書で使用する場合、アクティブスレッドはアクティブ化されたスレッドを指す場合があり、非アクティブスレッドは非アクティブ化されたスレッドを指す場合がある。所与の処理サイクル中にGPU12上で実行する複数のスレッドの場合、アクティブスレッドの各々は、処理サイクル中に複数のスレッドに関するグローバルプログラムカウンタレジスタ(global program counter register)によって特定されたプログラムの命令を処理するように構成され得る。たとえば、制御装置72は、処理サイクル中にプログラムの命令を処理するように、アクティブスレッドに割り当てられた処理要素74を構成するために、そのような処理要素74をアクティブ化することができる。他方で、所与の処理サイクル中にGPU12上で実行する複数のスレッドの場合、非アクティブスレッドの各々は、処理サイクル中にプログラムの命令を処理しないように構成され得る。たとえば、制御装置72は、処理サイクル中にプログラムの命令を処理しないように、非アクティブスレッドに割り当てられた処理要素74を構成するために、そのような処理要素74を非アクティブ化することができる。
【００３１】
いくつかの例では、処理サイクルは、プログラムカウンタの連続的ロード間の時間間隔を指す場合がある。たとえば、処理サイクルは、プログラムカウンタが第1の値でロードされるときと、プログラムカウンタが第2の値でロードされるときとの間の時間を指す場合がある。第1の値および第2の値は、同じ値であってもよく、または異なる値であってもよい。確認技法を再開するために、プログラムカウンタが非同期の形でロードされる例では、そのような非同期ロードは、いくつかの例では、処理サイクルを区別するのに役立たない場合がある。言い換えれば、そのような例では、処理サイクルは、プログラムカウンタの連続的な同期ロードの間の時間間隔を指す場合がある。プログラムカウンタの同期ロードは、いくつかの例では、クロック信号によってトリガされたロードを指す場合がある。
【００３２】
次の命令の取出しに先立ついずれかの時点で、制御装置72はGPU12によって処理されるべき次の命令を決定する。制御装置72が処理されるべき次の命令を決定する方法は、GPU12によって前に取り出された命令が制御フロー命令であるかどうかに応じて異なる。GPU12によって前に取り出された命令が制御フロー命令でない場合、制御装置72は、GPU12によって処理されるべき次の命令が命令ストア76内に記憶された次の順次命令に対応すると決定することができる。たとえば、命令ストア76はプログラムに関する命令を順序付けられた順番で記憶することができ、次の順次命令は、前の取り出された命令の直後に生じる命令であり得る。
【００３３】
GPU12によって前に取り出された命令が制御フロー命令である場合、制御装置72は、制御フロー命令内で指定された情報に基づいて、GPU12によって処理されるべき次の命令を決定することができる。たとえば、制御フロー命令は、無条件の制御フロー命令、たとえば、無条件の分岐命令またはジャンプ命令であり得、その場合、制御装置72は、GPU12によって処理されるべき次の命令が制御フロー命令によって特定されたターゲット命令であると決定することができる。別の例として、制御フロー命令は、条件付き制御フロー命令、たとえば、条件付き分岐命令であり得、その場合、制御装置72は、制御フロー命令によって識別されたターゲット命令または命令ストア76内に記憶された次の順次命令のうちの1つを命令ストア76からの、処理のための次の命令として選択することができる。
【００３４】
本明細書で使用する場合、制御フロー命令は、命令ストア76内のターゲット命令を特定する情報を含む命令を指す場合がある。たとえば、制御フロー命令は、制御フロー命令に関するターゲットプログラムカウンタ値を示すターゲット値を含み得る。ターゲットプログラムカウンタ値は、ターゲット命令に関するターゲットアドレスを示し得る。ターゲット命令は、いくつかの例では、命令ストア76内に記憶された次の順次命令とは異なる場合がある。高レベルプログラムコードは、たとえば、if記述、switch記述、do記述、for記述、while記述、continue記述、break記述、およびgoto記述など、制御フロー記述を含み得る。コンパイラは、高レベル制御フロー記述を低レベルの、すなわち、機械レベルの制御フロー命令に変換することができる。制御フロー命令ではない命令は、本明細書で、順次命令と呼ばれる場合がある。たとえば、順次命令は、ターゲット命令を特定する情報を含まない場合がある。
【００３５】
制御フロー命令の場合、ターゲット命令を特定する情報は、命令ストア76内に記憶されたターゲット命令を示す値であり得る。いくつかの例では、命令ストア76内のターゲット命令を示す値は、命令ストア76内のターゲット命令の命令アドレスを示す値であり得る。ターゲット命令の命令アドレスを示す値は、いくつかの事例では、命令ストア76内のターゲット命令のアドレスであり得る。ターゲット命令の命令アドレスを示す値は、さらなる事例では、ターゲット命令のアドレスを算出するために使用される値であり得る。さらなる例では、ターゲット命令の命令アドレスを示す値は、ターゲット命令に対応するターゲットプログラムカウンタを示す値であり得る。ターゲットプログラムカウンタ値を示す値は、いくつかの事例では、ターゲット命令に対応するターゲットプログラムカウンタ値であり得る。ターゲットプログラムカウンタ値を示す値は、さらなる事例では、ターゲットプログラムカウンタ値を算出するために使用される値であり得る。ターゲット命令に対応するターゲットプログラムカウンタ値は、いくつかの例では、ターゲット命令のアドレスに等しくてよい。
【００３６】
制御フロー命令は、順方向制御フロー命令または逆方向制御フロー命令であり得る。順方向制御フロー命令は、ターゲット命令が命令ストア76内に記憶された順序付けられた命令順序で制御フロー命令の後に生じる制御フロー命令であり得る。逆方向制御フロー命令は、ターゲット命令が命令ストア76内に記憶された順序付けられた命令順序で次の順次命令に先立って生じる制御フロー命令であり得る。次の順次命令は、順序付けられた命令順序で制御フロー命令の直後に生じ得る。
【００３７】
制御フロー命令は、条件付き制御フロー命令または無条件の制御フロー命令であり得る。条件付き制御フロー命令は、制御フロー命令に関連するターゲット命令にジャンプするための条件を指定する情報を含む。条件付き制御フロー命令を処理するとき、制御装置72が条件は満たされていると決定する場合、制御装置72は、処理されるべき次の命令がターゲット命令であると決定することができる。他方で、制御装置72が条件は満たされないと決定する場合、制御装置72は、処理されるべき次の命令が命令ストア76内に記憶された次の順次命令であると決定することができる。無条件の制御フロー命令は、制御フロー命令に関連するターゲット命令にジャンプするための条件を指定する情報を含まない。無条件の制御フロー命令を処理するとき、制御装置72は、処理すべき次の命令が制御フロー命令によって特定されたターゲット命令であると無条件に決定することができる。言い換えれば、そのような場合の決定は、無条件の制御フロー命令内で指定されたいずれの条件に関しても無条件である。本明細書で使用する場合、分岐命令が無条件の分岐命令として別段に指定されていない限り、条件付き制御フロー命令は、分岐命令を指す場合がある。また、無条件の制御フロー命令は、本明細書で、ジャンプ命令と呼ばれる場合がある。
【００３８】
条件付き分岐命令は、1つまたは複数のデータ項目値に関して指定された条件を含み得る。たとえば、あるタイプの条件は、GPU12内で実行する各アクティブスレッドに関して、第1のデータ項目値を第2のデータ項目値と比較する比較条件であり得る。データ項目値を比較することは、たとえば、第1のデータ項目値が第2のデータ項目値より大きいか、それに満たないか、それ以下であるか、それ以上であるか、それに等しいか、またはそれに等しくないかを決定することを含み得る。別のタイプの条件は、GPU12上で実行する各アクティブスレッドに関するデータ項目値がゼロに等しいか、またはゼロに等しくないかを決定するゼロ確認条件であり得る。処理要素74の各々は異なるデータ項目に関して演算するため、条件を評価する結果は、GPU12上で実行する各アクティブスレッドに関して異なり得る。
【００３９】
GPU12上で実行するアクティブスレッドのすべてが分岐条件を満たす場合、またはGPU12上で実行するアクティブスレッドのすべてが分岐条件を満たさない場合のいずれかでは、均一の分岐条件が生じ、スレッドに関する分岐発散度は均一であると言われる。他方で、GPU12上で実行するアクティブスレッドのうちの少なくとも1つが分岐条件を満たし、GPU12上で実行するアクティブスレッドのうちの少なくとも1つが分岐条件を満たさない場合、発散分岐条件が生じ、スレッドに関する分岐発散度は発散的であると言われる。
【００４０】
発散演算の一例は直列演算である。直列演算(または、一連の直列演算)は、(たとえば、直列演算からの)1つのスレッドの出力が1つまたは複数の他のスレッドに関する入力として必要とされる演算である。すなわち、1つまたは複数の他のスレッドの出力が完了した場合、他のスレッドは並行して処理し続けることはできない。この意味で、SIMDデバイス内のスレッドはある時間期間にわたって直列で実行し得る。
【００４１】
典型的には、GPU12上で実行するスレッドはロックステップ様式で同じ命令を実行することができる。言い換えれば、処理要素74の各々はともに、処理サイクル中にすべてのアクティブスレッドに関して同じ命令を実行することができる。しかしながら、発散分岐条件が生じるとき、分岐条件を満たすスレッドは、その分岐条件を満たさないスレッドによって実行されることがスケジュールされた次の命令とは異なる次の命令を実行するようにスケジュールされ得る。上記で論じたように、1つのそのような発散分岐条件は直列演算であり得る。
【００４２】
制御装置72は、通信経路80を介して命令ストア76に、通信経路82を介して処理要素74に、および通信経路84を介してデータストア78に通信可能に結合される。制御装置72は、通信経路80を使用して、読取り命令を命令ストア76に送ることができる。読取り命令は、そこから命令が取り出されるべき命令ストア76内の命令アドレスを指定し得る。制御装置72は、読取り命令を送ることに応答して、命令ストア76から1つまたは複数のプログラム命令を受信することができる。制御装置72は、通信経路82を使用して、命令を処理要素74に提供すること、および、いくつかの例では、処理要素74からデータ、たとえば、分岐条件を評価するための比較命令の結果を受信することができる。いくつかの例では、制御装置72は、通信経路84を使用して、たとえば、分岐条件を決定するために、データストア78からデータ項目値を取り出すことができる。図2は通信経路84を含むとしてGPU12を示すが、他の例では、GPU12は通信経路84を含まなくてよい。
【００４３】
処理要素74の各々は、命令ストア76内に記憶されたプログラムに関する命令を処理するように構成され得る。いくつかの例では、処理要素74の各々は、演算の同じセットを実行するように構成され得る。たとえば、処理要素74の各々は、同じ命令セットアーキテクチャ(ISA:instruction set architecture)を実装することができる。追加の例では、処理要素74の各々は、演算論理装置(ALU)であり得る。さらなる例では、GPU12はベクトルプロセッサとして構成可能であり、処理要素74は、ベクトルプロセッサ内の処理要素であり得る。追加の例では、GPU12はSIMD実行ユニットであり得、処理要素74の各々はSIMD実行ユニット内のSIMD処理要素であり得る。
【００４４】
処理要素74によって実行される演算は、算術演算、論理演算、比較演算などを含み得る。算術演算は、たとえば、加算演算、減算演算、乗算演算、除算演算などの演算を含み得る。算術演算はまた、たとえば、整数算術演算および/または浮動小数点算術演算を含み得る。論理演算は、たとえば、ビット単位のAND演算、ビット単位のOR演算、ビット単位のXOR演算などの演算を含み得る。比較演算は、たとえば、大なり演算(greater than operation)、小なり演算(less than operation)、ゼロ等価演算(equal to zero operation)、ゼロ不等価演算(not equal to zero operation)などの演算を含み得る。大なり演算および小なり演算は、第1のデータ項目が第2のデータ項目よりも大きいか、または小さいかを決定することができる。ゼロ等価演算およびゼロ不等価演算は、データ項目がゼロに等しいか、またはゼロに等しくないかを決定することができる。演算のために使用されるオペランドは、データストア78内に含まれたレジスタ内に記憶され得る。
【００４５】
処理要素74の各々は、通信経路82を介して制御装置72から命令を受信することに応答して演算を実行するように構成され得る。いくつかの例では、処理要素74の各々は、他の処理要素74とは無関係にアクティブ化および/または非アクティブ化されるように構成され得る。そのような例では、処理要素74の各々は、それぞれの処理要素74A〜74Dがアクティブ化されるとき、制御装置72から命令を受信することに応答して演算を実行し、それぞれの処理要素74A〜74Dが非アクティブ化されるとき、すなわち、アクティブ化されないとき、制御装置72から命令を受信することに応答して演算を実行しないように構成され得る。
【００４６】
処理要素74A〜74Dの各々は、それぞれの通信経路86A〜86Dを介してデータストア78に通信可能に結合され得る。処理要素74は、データストア78からデータを取り出し、通信経路86を介してデータをデータストア78に記憶するように構成され得る。データストア78から取り出されたデータは、いくつかの例では、処理要素74によって実行される演算のためのオペランドであり得る。データストア78に記憶されたデータは、いくつかの例では、処理要素74によって実行される演算の結果であり得る。
【００４７】
命令ストア76は、GPU12によって実行するためのプログラムを記憶するように構成される。プログラムは、命令のシーケンスとして記憶され得る。いくつかの例では、各命令は、一意の命令アドレス値によってアドレス指定され得る。そのような例では、命令のシーケンス内の後の命令に関する命令アドレス値は、命令のシーケンス内の前の命令に関する命令アドレス値よりも大きい。プログラム命令は、いくつかの例では、機械レベル命令であり得る。すなわち、そのような例では、命令は、GPU12のISAに対応する形態であり得る。命令ストア76は、通信経路80を介して制御装置72からの読取り命令を受信するように構成される。読取り命令は、そこから命令が取り出されるべき命令アドレスを指定し得る。読取り命令を受信することに応答して、命令ストア76は、通信経路80を介して、読取り命令内で指定された命令アドレスに対応する命令を制御装置72に提供することができる。
【００４８】
命令ストア76は、任意のタイプのメモリ、キャッシュ、またはそれらの組合せであってよい。命令ストア76がキャッシュであるとき、命令ストア76は、GPU12に外部のプログラムメモリ内に記憶されたプログラムをキャッシュすることができる。命令ストア76はGPU12内にあるとして示されているが、他の例では、命令ストア76はGPU12の外部であり得る。
【００４９】
データストア78は、処理要素74によって使用されるデータ項目を記憶するように構成される。いくつかの例では、データストア78は複数のレジスタを含むことが可能であり、各レジスタは、GPU12上で操作される複数のデータ項目内にそれぞれのデータ項目を記憶するように構成される。データストア78は、データストア78内のレジスタとメモリまたはキャッシュ(図示せず)との間でデータを転送するように構成された1つまたは複数の通信経路(図示せず)に結合され得る。
【００５０】
図2は処理要素74によって使用されるデータを記憶するための単一のデータストア78を示すが、他の例では、GPU12は処理要素74の各々に関して別個の専用データストアを含み得る。GPU12は、例示のために、4つの処理要素74を示す。他の例では、GPU12は同じ構成または異なる構成でより多くの処理要素を有し得る。
【００５１】
図3は、図2の例示的なGPU12内の制御装置72をより詳細に示すブロック図である。制御装置72は、プログラムカウンタ88と、フェッチモジュール90と、復号モジュール92と、制御フローモジュール94とを含む。制御フローモジュール94は、本明細書では、代替的に、制御フローユニットと呼ばれる場合がある。
【００５２】
プログラムカウンタ88は、プログラムカウンタ値を記憶するように構成される。いくつかの例では、プログラムカウンタ88は、たとえば、プログラムカウンタレジスタなど、ハードウェアレジスタであり得る。プログラムカウンタ値は、命令ストア76内に記憶された命令を示し得る。プログラムカウンタ値は、いくつかの事例では、命令ストア76内に記憶された命令の命令アドレスに等しくてよい。さらに、プログラムカウンタ値は、命令ストア76内に記憶された命令の命令アドレスを算出するために使用され得る。たとえば、プログラムカウンタ値は、命令アドレスを生成するためのオフセット値に追加され得る。プログラムカウンタ88は処理要素74のすべてに関する単一のプログラムカウンタとして使用され得るため、プログラムカウンタ88は、本明細書では「グローバルプログラムカウンタ」または「グローバルプログラムカウンタレジスタ」と呼ばれる場合がある。
【００５３】
フェッチモジュール90は、プログラムカウンタ88内に記憶されたプログラムカウンタ値に基づいて、制御装置72から命令をフェッチ、たとえば、取り出すように構成され得る。たとえば、フェッチモジュール90は、プログラムカウンタ88内に記憶されたプログラムカウンタ値によって特定された命令アドレスから命令をフェッチすることができる。フェッチモジュール90は、フェッチした命令をさらなる処理のために復号モジュール92に提供することができる。
【００５４】
復号モジュール92は、フェッチモジュール90から受信した命令を復号するように構成される。命令を復号することは、その命令が処理要素74によって処理され得るタイプの命令であるかどうかを決定することに関連し得る。命令が処理要素74によって処理され得るタイプの命令である場合、復号モジュール92は、処理要素74のうちの1つまたは複数の上でその命令を実行させることができる。いくつかの例では、復号モジュール92は、処理要素74のうちのすべての上でその命令を実行させることができる。他の例では、復号モジュール92は、処理要素74のうちのすべてに満たない処理要素の上でその命令を実行させることができる。処理要素74のうちの1つまたは複数の上でその命令を実行させることは、いくつかの事例では、実行するために、処理要素74のうちの1つまたは複数に対してその命令を発行することを含み得る。たとえば、フェッチモジュール90は、プログラムカウンタ88によって特定された順次命令をフェッチし、処理のために、アクティブスレッドに対応するすべての処理要素74にその順次命令を発行することができる。命令が処理要素74によって処理され得るタイプの命令でない場合、制御装置72は、処理のために、処理要素74のうちのいずれに対してもその命令を発行せずに、その命令を処理することができる。たとえば、命令は、処理要素74による処理を必要としないタイプの制御フロー命令であってよく、その場合、制御装置72は、処理要素74のうちのいずれに対してもその命令を発行せずに、その命令を処理することができる。
【００５５】
いずれの場合も、復号モジュール92は、さらなる処理のために、制御情報を制御フローモジュール94に転送することができる。いくつかの例では、制御情報は命令自体であり得る。さらなる例では、制御情報は、たとえば、情報が命令は制御フロー命令であることを示すかまたは順次命令であることを示すが、命令が制御フロー命令である場合、情報がその命令は分岐命令であることを示すかまたはジャンプ命令であることを示すか、命令が分岐命令またはジャンプ命令である場合、情報がその分岐命令またはジャンプ命令は順方向の分岐命令もしくはジャンプ命令であるか、または逆方向の分命令もしくはジャンプ命令であるか、命令が分岐命令である場合、情報分岐条件を指定するかどうか、などの情報を含み得る。
【００５６】
処理要素74によって処理され得るタイプの命令は、算術命令および論理命令を含み得る。算術命令は算術演算を実行するよう処理要素74に指示する命令を指す場合があり、論理命令は論理演算を実行するように処理要素74に指示する命令を示す場合がある。いくつかの例では、制御フロー命令は、処理要素74によって処理され得る命令であり得、たとえば、制御フロー命令は処理要素74によって評価される分岐条件を含み得る。処理要素74によって処理され得るタイプでない命令は、分岐命令は制御装置72によって評価される制御フロー命令、および/または分岐条件を有さない制御フロー命令を含み得る。
【００５７】
制御フローモジュール94は、制御装置72によって処理されるべき次の命令に関連するプログラムカウンタ値を決定し、そのプログラムカウンタ値をプログラムカウンタ88にロードすることができる。前にフェッチした命令が順次命令である場合、制御フローモジュール94は、プログラムカウンタ88にロードするために命令ストア76内に記憶された次の順次命令を示すプログラムカウンタ値を選択することができる。前にフェッチされた命令が制御フロー命令である場合、制御フローモジュール94は再開カウンタ技法を利用することができる。
【００５８】
制御フローモジュール94は、GPU12上で実行する各スレッドに関する再開カウンタ値を記憶することができる。たとえば、制御フローモジュール94内に記憶された再開カウンタ値の数は、GPU12内に含まれた処理要素74の数に等しくてよい。各再開カウンタ値に関して、それぞれの再開カウンタ値に対応するスレッドが非アクティブである場合、再開カウンタ値は、非アクティブスレッドがアクティブ化または再アクティブ化されるべきプログラムカウンタ値を示し得る。さもなければ、それぞれの再開カウンタ値に対応するスレッドがアクティブである場合、再開カウンタ値は、いくつかの例では、最大値、すなわち、再開カウンタに関してストレージスロットまたはレジスタ内に表され得る最大値である値に設定され得る。
【００５９】
制御フローモジュール94は、GPU12上で実行する各スレッドに関するアクティブフラグを記憶することができる。たとえば、制御フローモジュール94内に記憶されたアクティブフラグの数は、GPU12内に含まれた処理要素74の数に等しくてよい。各アクティブフラグは、アクティブフラグに関連するスレッドがアクティブであるか否か、または非アクティブであるか否かを示し得る。いくつかの例では、アクティブフラグは、アクティブフラグに関連するスレッドがアクティブであることを示すように設定され、アクティブフラグに関連するスレッドが非アクティブであることを示すように再設定される単一ビットであってよい。
【００６０】
いくつかの例では、制御フローモジュール94はまたプログラム状態を記憶することができる。たとえば、第1のプログラム状態はすべてのスレッドがアクティブであることを示すことができ、第2のプログラム状態は、少なくとも1つのスレッドがアクティブであり、少なくとも1つのスレッドが非アクティブであることを示すことができ、第3のプログラム状態はすべてのスレッドが非アクティブであることを示すことができる。プログラム状態は、そのような例では、プログラムカウンタ88内にロードするためのプログラムカウンタ値を選択するために使用され得る。
【００６１】
制御フローモジュール94は、いくつかの例では、通信経路82を介して処理要素74のうちの1つまたは複数をアクティブ化および非アクティブ化するように構成され得る。追加の例では、制御フローモジュール94は、特定の処理要素74をアクティブ化および非アクティブ化するように復号モジュール92に指示することができる。さらなる例では、制御フローモジュール94は、通信経路82を介して処理要素74の1つまたは複数から比較命令の結果を受信することができる。比較命令の結果は、いくつかの例では、分岐条件を評価するために使用され得る。またさらなる例では、制御フローモジュール94は、分岐条件を評価するために、通信経路84を介してデータストア78から1つまたは複数のデータ項目を取り出すことができる。
【００６２】
上記で論じたように、並列マシン(たとえば、SIMD処理システム)内で、直列演算など、発散演算を実行する必要が存在することが多い。たとえば、GPU12は、処理要素74上で実行する所与のスレッドに対する入力が処理要素74上で実行する別のスレッドの出力に依存する「プレフィックス和(prefix sum)」を実行するように指示され得る。
【００６３】
SIMD処理システム上で直列演算を実行するための1つの従来の手法は、原子ネイティブ命令(atomic native instructions)を使用することに関連し、それによって、(すなわち、処理要素74のうちの1つだけがある時点でその変数に対するアクセスを有するように)すべてのスレッドは共有変数に関するロックを実行するために競合することになる。しかしながら、原子命令およびロックの使用は限定されたリソースであり、一般に、実行のために長いレイテンシを必要とするため、これらは非効率的であり得る。
【００６４】
直列演算を実行するための別の手法は、各スレッドに関して一意の値(たとえば、thread_id)を生成することに関連する。GPU12は、その場合、制御装置72を介して、すべてのスレッドを通してループし、ループの各反復に関して単一のスレッドだけを(Thread IDごとに)選択するように構成されることになる。そのような演算に関する例示的な疑似コードを以下に示す。
(i=0;i)である場合、//iは波動内のスレッド総数を表し得る
{(thread_id == i ){perform serialized operation}である場合}
【００６５】
上述の手法は、追加のテストおよびテスト変数、ならびに非アクティブであり得るスレッドに関してすらループ反復を強制することを必要とする。これはリソースと時間の両方の点で非効率的である。
【００６６】
これらの欠点に鑑みて、本開示は、並列処理システム(たとえば、SIMD処理システム)内で直列演算を実行するための技法を提案する。以下の例では、本開示は、それによって、いずれの非アクティブスレッドに対してもアクセスする必要なしに、直列演算を実行するために、複数のスレッドからのアクティブスレッドが選択され得る命令(たとえば、ハードウェア実行命令)について説明する。
【００６７】
本開示で提案される解決策は、GPU12の制御装置72によって実行され得る「GetOne」命令(GetOne_and_branch())である。制御装置72は、実行のために複数のスレッド(たとえば、波動内のスレッド)から単一のアクティブスレッドを選択するように構成され得る。制御装置72は、制御フローモジュール94によって記憶されたアクティブフラグを使用して、どのスレッドが現在アクティブであるかを決定することができる。単一のアクティブスレッドが選択されると、波動内のすべての他のアクティブスレッドは分岐条件を実行することができるのに対して、選択されたスレッドは発散演算(たとえば、直列演算)を実行する。「GetOne」命令は、次いで、以下の疑似コードによって示すように直列演算を実行するために使用され得る。
LOOP:GetOne_and_branch TRY_AGAIN
{perform serialized operation}
CONTINUEに進む
TRY_AGAIN:LOOPに進む
CONTINUE
【００６８】
上記の例では、制御装置72は、最初に、コードのLOOP命令に進むように指示される。LOOP命令は、複数のアクティブスレッド(たとえば、波動)から単一のアクティブスレッドを選択し、直列演算({perform serialized operation})に進み、次いで、制御ブロック(goto CONTINUE)を終了し、非アクティブになる「GetOne」命令(GetOne_and_branch)を含む。選択されないスレッドは、GetOne_and_branch命令の分岐命令を実行する。上記の例では、分岐命令は、本質的に、すべての選択されないスレッドをループ命令に送って戻す「TRY_AGAIN命令」である。次いで、直列演算を実行するために、もう1つの残りのアクティブスレッドが選択され得る。
【００６９】
「GetOne」命令の仕組みは、追加の変数なしに、かつ非アクティブスレッドに関するループ反復を必要とせずに、波動内で効率的な直列化を可能にする。本開示の技法は、波動内の並列スレッドは、その共有される単一命令により、何らかのレベルの同期をすでに有することを活用する。このようにして、本開示の「GetOne」命令は、すべての他のアクティブスレッドを同時に非アクティブにしながら、直列演算のために1つのアクティブスレッドが選択されることを可能にする。
【００７０】
図4は、本開示の直列演算技法をより詳細に示す流れ図である。最初に、GPU12の制御装置72は「GetOne」命令を受信することができる(100)。「GetOne」命令に応答して、制御装置72は、複数のスレッド(たとえば、波動)内のどのスレッドがアクティブであるかを決定するように構成される(102)。一例では、制御装置72は、どのスレッドがアクティブであるかを決定するために、スレッドの各々に関連するアクティブフラグを読み取るように構成され得る。制御装置72が何のアクティブスレッドも残っていないと決定する場合(103)、制御ブロックは終了する(112に戻る)。
【００７１】
制御装置72がアクティブなスレッドが残っていると決定した場合(103)、制御装置72は、複数のスレッドの1つのアクティブスレッドを選択することができる(104)。選択されたスレッド(106のYES)は、次いで、処理要素74のうちの1つの上で直列演算を実行する(108)。直列演算が実行された後、選択されたアクティブスレッドは非アクティブ化される(110)。選択されていない残りのアクティブスレッドは、「GetOne」命令にループして戻ることができる(106のNO)。
【００７２】
上記で説明した直列実行のための「GetOne」命令を実行するように構成されたGPU12は、「GetOne」命令を使用して、発散を表す単一の波動を、その各々が均一であり得る複数のサブ波動(sub-waves)に分割するように構成され得る。(場合によっては、発散)サブルーチン呼出しを実行することが望ましい例を仮定されたい。すなわち、波動内のスレッドの一部だけがサブルーチンを実行する状況である。発散サブルーチンを実行するための1つの従来の技法は、各スレッドを一意に実行することに関連する。これは非効率的であり得る。
【００７３】
代わりに、GPU12は、共有レジスタ内にサブルーチンを記憶するために「GetOne」命令を実行するように構成され得、次いで、その命令はその共有レジスタに対するアクセスを有するすべてのスレッド(すなわち、共有レジスタに対するアクセスを有する処理要素74)によって実行され得る。共有スレッドは、データストア78、命令ストア76、または処理要素74に利用可能な他のメモリの一部であり得る。
【００７４】
「GetOne」命令および共有レジスタを使用して、GPU12は、「GetOne」命令を使用してサブルーチンターゲット(すなわち、サブルーチン命令が記憶されたロケーション)を選択し、そのターゲットをすべてのスレッドにブロードキャストし(すなわち、サブルーチンロケーションが共有レジスタ内に記憶されているという表示を提供し)、すべての整合するスレッドに関するサブルーチンを実行する(すなわち、共有レジスタに対するアクセスを有する処理要素74上でサブルーチンを実行する)ように構成され得る。このプロセスは、次いで、異なる共有レジスタに対するアクセスを有する他のスレッドに関して繰り返されてよい。このプロセスに関する例示的な疑似コードを以下に示す。
LOOP:GetOne_and_branch CONTINUE1
shared_R0=subroutine_target//ターゲットを共有レジスタ内に記憶する
CONTINUE1:(subroutine_target==shared_R0)である場合
{(subroutine_target)を呼び出す
CONTINUE2に進む
}
LOOPに進む
CONTINUE2:
【００７５】
最初に、制御装置72は、コードのLOOPセクションに進み、前に説明した説明したように、「GetOne」命令を実行することになる。「GetOne」命令は演算を実行するために1つのアクティブスレッドを選択する。上記の例では、選択されたアクティブスレッドは、共有レジスタ(shared_R0)内にロケーション(subroutine_target)のアドレスを記憶する演算を実行することになる。選択されなかったいずれのアクティブスレッドもCONTINUE1演算を実行することになる。CONTINUE1演算では、共有レジスタshared_R0に対するアクセスを有する各スレッド(すなわち、処理要素74)は、subroutine_targetに位置するコードを実行し、CONTINUE2において制御ブロックを終了する。いずれの選択されなかったアクティブスレッドも共有レジスタに対するアクセスを有さない場合、その選択されなかったアクティブスレッドはループ演算に戻り、ここで、異なる共有レジスタ内に別のサブルーチン呼出しが記憶され得る。この場合も、直列演算の例と同様に、いずれの非アクティブスレッドもスキップされ、最小数の一意サブルーチン呼出しが行われる。
【００７６】
図5は、本開示の例示的な方法を示すフローチャートである。図5の技法は、GPU12の制御装置72を含めて、GPU12によって実装され得る。本開示の一例では、GPU12は、マルチスレッドプロセッサ上で発散演算を実行する方法を実行するように構成される。GPU12は、複数のスレッドから1つまたは複数のアクティブスレッドを決定し(152)、1つまたは複数のアクティブスレッドから1つのアクティブスレッドを選択し(154)、選択されたアクティブスレッド上で発散演算を実行する(156)ように構成され得る。
【００７７】
本開示の一例では、マルチスレッドプロセッサはSIMDプロセッサである。本開示の別の例では、複数のスレッドは波動を形成し、波動はSIMDプロセッサによって並行して実行される。
【００７８】
本開示の別の例では、GPU12は、選択されたアクティブスレッド上で直列演算を実行することによって、選択されたアクティブスレッド上で発散動作を実行するように構成される。本開示の別の例では、発散動作は、共有レジスタ内にサブルーチンターゲットを記憶し、GPU12は、共有レジスタに対するアクセスを有する1つまたは複数のアクティブスレッドに関するサブルーチンターゲットにおいて記憶されたコードを実行するようにさらに構成される。
【００７９】
本開示で説明した技術は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで少なくとも部分的に実装され得る。たとえば、説明した技法の様々な態様は、1つまたは複数のマイクロプロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、または任意の他の等価の集積回路もしくはディスクリート論理回路、ならびにそのような構成要素の任意の組合せを含めて、1つまたは複数のプロセッサ内で実装され得る。「プロセッサ」または「処理回路」という用語は、一般に、単独でまたは他の論理回路と組み合わせて、前述の論理回路、または処理を実行するディスクリートハードウェアなど、任意の他の均等回路のいずれかを指す場合がある。
【００８０】
そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明した様々な演算および関数をサポートするために、同じデバイスまたは別個のデバイス内で実装され得る。加えて、説明したユニット、モジュール、または構成要素のいずれも、ともに実装されてよく、またはディスクリートであるが、相互動作可能な論理デバイスとして別個に実装されてよい。モジュールまたはユニットとしての異なる特徴の記述は、異なる機能的態様を強調することを意図し、そのようなモジュールまたはユニットが別個のハードウェア構成要素またはソフトウェア構成要素によって実現されなければならないことを暗示するとは限らない。むしろ、1つまたは複数のモジュールまたはユニットに関連する機能は、別個のハードウェア構成要素、ファームウェア構成要素、および/またはソフトウェア構成要素によって実行可能であるか、または共通のもしくは別個のハードウェア構成要素またはソフトウェア構成要素内に統合可能である。
【００８１】
本開示で説明した技法は、命令を記憶するコンピュータ可読記憶媒体など、コンピュータ可読媒体内に記憶されること、その中で実施されること、またはその中で符号化されることも可能である。コンピュータ可読命令内で実施されるか、または符号化される命令は、たとえば、これらの命令が1つまたは複数のプロセッサによって実行されると、1つまたは複数のプロセッサに本明細書で説明した技法を実行させることができる。コンピュータ可読記憶媒体は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、プログラマブル読取り専用メモリ(PROM)、消去可能プログラマブル読取り専用メモリ(EPROM)、電気的消去可能プログラマブル読取り専用メモリ(EEPROM)、フラッシュメモリ、ハードディスク、CD-ROM、フロッピー(登録商標)ディスク、カセット、磁気媒体、光媒体、または有形の他のコンピュータ可読記憶媒体を含み得る。
【００８２】
コンピュータ可読媒体は、上に列挙したものなど、有形記憶媒体に対応するコンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体は、たとえば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を容易にする任意の媒体を含む通信媒体を含むことがある。このようにして、「コンピュータ可読媒体」という句は、概して、(1)非一時的な有形コンピュータ可読記憶媒体、および(2)一時的な信号または搬送波などの非一時的コンピュータ可読通信媒体に対応する場合がある。
【００８３】
様々な態様および例が説明されてきた。しかしながら、以下の請求項の範囲から逸脱せずに、本開示の構造または技法に修正を行うことが可能である。
【符号の説明】
【００８４】
10  デバイス
12  GPU
14  システムメモリ
16  プロセッサ
60  ディスプレイ
62  ユーザインターフェース
64  トランシーバモジュール
72  制御装置
74  処理装置
74A〜74D  処理要素
76  命令ストア
78  データストア
80  通信経路
82  通信経路
84  通信経路
86  通信経路
86A〜86D  通信経路
88  プログラムカウンタ
90  フェッチモジュール
92  復号モジュール
94  制御フローモジュール
【図１】
2017515228.tif 000003
【図２】
2017515228.tif 000004
【図３】
2017515228.tif 000005
【図４】
2017515228.tif 000006
【図５】
2017515228.tif 000007
【手続補正書】
【提出日】平成28年11月4日(2016.11.4)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
マルチスレッドプロセッサ上で発散演算を実行する方法であって、
前記マルチスレッドプロセッサ上で発散演算を実行するための命令を受信するステップと、
前記マルチスレッドプロセッサの複数のスレッドから1つまたは複数のアクティブスレッドを決定するステップと、
前記1つまたは複数のアクティブスレッドから単一のアクティブスレッドを選択するステップと、
前記選択された単一のアクティブスレッド上で前記発散演算を実行するステップと
を含む、方法。
【請求項２】
前記マルチスレッドプロセッサが単一命令マルチデータ(SIMD)プロセッサである、請求項1に記載の方法。
【請求項３】
前記複数のスレッドが波動を形成し、前記波動が前記SIMDプロセッサによって並行して実行される、請求項2に記載の方法。
【請求項４】
前記選択された単一のアクティブスレッド上で前記発散演算を前記実行するステップが、前記選択された単一のアクティブスレッド上で直列演算を実行するステップを含む、請求項1に記載の方法。
【請求項５】
前記発散演算を前記実行するステップが、共有レジスタ内にサブルーチンターゲットを記憶するステップを含み、前記方法が、
前記共有レジスタに対するアクセスを有する前記1つまたは複数のアクティブスレッド上の前記サブルーチンターゲットにおいて記憶されたコードを実行するステップ
をさらに含む、請求項1に記載の方法。
【請求項６】
発散演算を実行するように構成された装置であって、
マルチスレッドプロセッサを備え、前記マルチスレッドプロセッサが、
前記マルチスレッドプロセッサ上で発散演算を実行するための命令を受信し、前記マルチスレッドプロセッサの複数のスレッドから1つまたは複数のアクティブスレッドを決定し、前記1つまたは複数のアクティブスレッドから単一のアクティブスレッドを選択するように構成された制御装置と、
複数の処理要素であって、前記選択された単一のアクティブスレッドに関連する前記複数の処理要素のうち1つの処理要素が、前記発散演算を実行するように構成される、複数の処理要素と
を備える、装置。
【請求項７】
前記マルチスレッドプロセッサが単一命令マルチデータ(SIMD)プロセッサである、請求項6に記載の装置。
【請求項８】
前記複数のスレッドが波動を形成し、前記波動が前記SIMDプロセッサによって並行して実行される、請求項7に記載の装置。
【請求項９】
前記選択された単一のアクティブスレッドに関連する前記処理要素が、直列演算を実行するように構成される、請求項6に記載の装置。
【請求項１０】
前記発散演算が、共有レジスタ内にサブルーチンターゲットを記憶し、前記複数の処理要素が、前記1つまたは複数のアクティブスレッドに関連し、かつ前記共有レジスタに対するアクセスを有する前記複数の処理要素のうちのいずれかの処理要素上の前記サブルーチンターゲットにおいて記憶されたコードを実行するようにさらに構成される、請求項6に記載の装置。
【請求項１１】
マルチスレッドプロセッサ上で発散演算を実行するように構成された装置であって、
前記マルチスレッドプロセッサ上で発散動作を実行するための命令を受信するための手段と、
前記マルチスレッドプロセッサの複数のスレッドから1つまたは複数のアクティブスレッドを決定するための手段と、
前記1つまたは複数のアクティブスレッドから単一のアクティブスレッドを選択するための手段と、
前記選択された単一のアクティブスレッド上で前記発散演算を実行するための手段と
を備える、装置。
【請求項１２】
前記マルチスレッドプロセッサが単一命令マルチデータ(SIMD)プロセッサである、請求項11に記載の装置。
【請求項１３】
前記複数のスレッドが波動を形成し、前記波動が前記SIMDプロセッサによって並行して実行される、請求項12に記載の装置。
【請求項１４】
前記選択された単一のアクティブスレッド上で前記発散演算を前記実行するための手段が、前記選択された単一のアクティブスレッド上で直列演算を実行するための手段を含む、請求項11に記載の装置。
【請求項１５】
前記発散演算が、共有レジスタ内にサブルーチンターゲットを記憶し、前記装置が、
前記共有レジスタに対するアクセスを有する前記1つまたは複数のアクティブスレッド上の前記サブルーチンターゲットにおいて記憶されたコードを実行するための手段
をさらに備える、請求項11に記載の装置。
【請求項１６】
発散演算を実行するように構成されたマルチスレッドプロセッサであって、
前記マルチスレッドプロセッサ上で発散演算を実行するための命令を受信し、前記マルチスレッドプロセッサの複数のスレッドから1つまたは複数のアクティブスレッドを決定し、前記1つまたは複数のアクティブスレッドから単一のアクティブスレッドを選択するように構成された制御装置と、
複数の処理要素であって、前記選択された単一のアクティブスレッドに関連する前記複数の処理要素のうち1つの処理要素が、前記発散演算を実行するように構成される、複数の処理要素と
を備える、マルチスレッドプロセッサ。
【請求項１７】
前記マルチスレッドプロセッサが単一命令マルチデータ(SIMD)プロセッサである、請求項16に記載のマルチスレッドプロセッサ。
【請求項１８】
前記複数のスレッドが波動を形成し、前記波動が前記SIMDプロセッサによって並行して実行される、請求項17に記載のマルチスレッドプロセッサ。
【請求項１９】
前記選択された単一のアクティブスレッドに関連する前記処理要素が、直列演算を実行するように構成される、請求項16に記載のマルチスレッドプロセッサ。
【請求項２０】
前記発散演算が、共有レジスタ内にサブルーチンターゲットを記憶し、前記複数の処理要素が、前記1つまたは複数のアクティブスレッドに関連し、かつ前記共有レジスタに対するアクセスを有する前記複数の処理要素のうちのいずれかの処理要素上の前記サブルーチンターゲットにおいて記憶されたコードを実行するようにさらに構成される、請求項16に記載のマルチスレッドプロセッサ。
【国際調査報告】
2017515228.tif 000008
2017515228.tif 000009