(57)【要約】プロセッサの複数の計算コアのデータドリブンスケジューリングのための方法、デバイス及びシステムである。デフォルトスケジュールに従って、複数のスレッドを複数の計算コア上で実行してもよい。複数のスレッドは実行に基づいて分析され、複数のスレッド間の相関を決定してもよい。データドリブンスケジュールを、相関に基づいて生成してもよい。データドリブンスケジュールに従って、複数のスレッドを複数の計算コア上で実行してもよい。【選択図】図４
2019501470.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサの複数の計算コアのデータドリブンスケジューリングの方法であって、
デフォルトスケジュールに従って、複数のスレッドを前記複数の計算コア上で実行することと、
前記実行に基づいて前記複数のスレッドを分析して、前記複数のスレッド間の相関を決定することと、
前記相関に基づいて、データドリブンスケジュールを生成することと、
前記データドリブンスケジュールに従って、前記複数のスレッドを前記複数の計算コア上で実行することと、を含む、
方法。
【請求項２】
前記相関は、前記複数のスレッドのサブセット間のメモリの再使用を含む、請求項１の方法。
【請求項３】
前記相関は、前記複数のスレッドのサブセット間の参照局所性を含む、請求項１の方法。
【請求項４】
前記デフォルトスケジュールは、ラウンドロビンスケジュールを含む、請求項１の方法。
【請求項５】
前記複数のスレッドを分析して前記相関を決定することは、
データドリブンスケジューリング回路が、前記計算コア上での前記複数のスレッドの少なくとも一部の実行に起因する前記計算コアによるメモリアクセスに関する情報を受信することと、
前記情報に基づいて前記相関を得ることと、を含む、
請求項１の方法。
【請求項６】
メモリは前記複数の計算コア間で共有される、請求項５の方法。
【請求項７】
メモリはキャッシュメモリを備える、請求項５の方法。
【請求項８】
前記複数のスレッドは、複数のウェーブを含み、ウェーブベースでスケジューリングされる、請求項１の方法。
【請求項９】
前記複数のスレッドは、複数のワープを含み、ワープベースでスケジューリングされる、請求項１の方法。
【請求項１０】
前記複数のスレッドは、複数のスレッドグループを含み、スレッドグループベースでスケジューリングされる、請求項１の方法。
【請求項１１】
前記データドリブンスケジュールは、前記複数のスレッドの各々が前記計算コア上での実行を完了した後に生成される、請求項１の方法。
【請求項１２】
前記データドリブンスケジュールは、前記複数のスレッドの前記計算コア上での実行が一定期間進行した後に生成される、請求項１の方法。
【請求項１３】
前記データドリブンスケジュールは、前記複数のスレッドの全てが前記計算コア上での実行を完了する前に生成される、請求項１の方法。
【請求項１４】
前記データドリブンスケジュールに従った実行に基づいて前記複数のスレッドを分析して、前記複数のスレッド間の更新された相関を決定することと、
前記更新された相関に基づいて、更新されたデータドリブンスケジュールを生成することと、
前記更新されたデータドリブンスケジュールに従って、前記複数のスレッドを前記複数の計算コア上で実行することと、を含む、
請求項１の方法。
【請求項１５】
前記データドリブンスケジュールが前記デフォルトスケジュールと異なるか否かを判別することと、
前記データドリブンスケジュールが前記デフォルトスケジュールと異なる場合に、前記計算コアの実行を一時中断することと、現在のコンテキストを保存することと、前記データドリブンスケジュールに従って、前記複数のスレッドをディスパッチすることと、を含む、
請求項１の方法。
【請求項１６】
前記更新されたデータドリブンスケジュールが前記データドリブンスケジュールと異なるか否かを判別することと、
前記更新されたデータドリブンスケジュールが前記データドリブンスケジュールと異なる場合に、前記計算コアの実行を一時中断することと、現在のコンテキストを保存することと、前記更新されたデータドリブンスケジュールに従って、前記複数のスレッドをディスパッチすることと、を含む、
請求項１４の方法。
【請求項１７】
前記計算コアの各々は、計算ユニット、単一命令多重データ（ＳＩＭＤ）ユニット又はシェーダエンジンを備える、請求項１の方法。
【請求項１８】
データドリブンスケジュールのために構成されたプロセッサであって、
複数の計算コアと、
各計算コアによって共有されるメモリと、
デフォルトスケジュールに従って、複数のスレッドを、前記複数の計算コア上で実行するためにディスパッチするように構成されたディスパッチ回路と、
前記実行に基づいて前記複数のスレッドを分析して、前記複数のスレッド間の相関を決定するように構成された相関回路と、
前記相関に基づいてデータドリブンスケジュールを決定するように構成されたスケジューリング回路と、を備え、
前記ディスパッチ回路は、前記複数のスレッドを、前記データドリブンスケジュールに従って前記複数の計算コア上で実行するためにディスパッチするように構成されている、
プロセッサ。
【請求項１９】
前記相関回路は、前記複数のスレッドのサブセット間のメモリの再使用に基づいて前記相関を決定するように構成されている、請求項１８のプロセッサ。
【請求項２０】
前記相関回路は、前記複数のスレッドのサブセット間の参照局所性に基づいて前記相関を決定するように構成されている、請求項１８のプロセッサ。
【請求項２１】
前記デフォルトスケジュールは、ラウンドロビンスケジュールを含む、請求項１８のプロセッサ。
【請求項２２】
前記相関回路は、
前記計算コア上での前記複数のスレッドの少なくとも一部の実行に起因する前記計算コアによるメモリアクセスに関する情報を受信することと、
前記情報に基づいて前記相関を得ることと、を行うように構成されている、
請求項１８のプロセッサ。
【請求項２３】
メモリは前記複数の計算コア間で共有される、請求項２２のプロセッサ。
【請求項２４】
メモリはキャッシュメモリを備える、請求項２２のプロセッサ。
【請求項２５】
前記複数のスレッドは、複数のウェーブを含み、ウェーブベースでスケジューリングされる、請求項１８のプロセッサ。
【請求項２６】
前記複数のスレッドは、複数のワープを含み、ワープベースでスケジューリングされる、請求項１８のプロセッサ。
【請求項２７】
前記複数のスレッドは、複数のスレッドグループを含み、スレッドグループベースでスケジューリングされる、請求項１８のプロセッサ。
【請求項２８】
前記スケジューリング回路は、前記複数のスレッドの各々が前記計算コア上での実行を完了した後に、前記データドリブンスケジュールを生成するように構成されている、請求項１８のプロセッサ。
【請求項２９】
前記スケジューリング回路は、前記複数のスレッドの前記計算コア上での実行が一定期間進行した後に、前記データドリブンスケジュールを生成するように構成されている、請求項１８のプロセッサ。
【請求項３０】
前記スケジューリング回路は、前記複数のスレッドの全てが前記計算コア上での実行を完了する前に、前記データドリブンスケジュールを生成するように構成されている、請求項１８のプロセッサ。
【請求項３１】
前記相関回路は、
前記データドリブンスケジュールに従った実行に基づいて前記複数のスレッドを分析して、前記複数のスレッド間の更新された相関を決定することと、
前記更新された相関に基づいて、更新されたデータドリブンスケジュールを生成することと、を行うように構成されており、
前記ディスパッチ回路は、前記複数のスレッドを、前記更新されたデータドリブンスケジュールに従って前記複数の計算コア上で実行するためにディスパッチするように構成されている、
請求項１８のプロセッサ。
【請求項３２】
前記プロセッサは、回路を備え、
前記回路は、
前記データドリブンスケジュールが前記デフォルトスケジュールと異なるか否かを判別し、
前記データドリブンスケジュールが前記デフォルトスケジュールと異なる場合に、前記計算コアの実行を一時中断し、現在のコンテキストを保存し、前記データドリブンスケジュールに従って、前記複数のスレッドをディスパッチするように構成されている、
請求項１８のプロセッサ。
【請求項３３】
前記プロセッサは、回路を備え、
前記回路は、
前記更新されたデータドリブンスケジュールが前記データドリブンスケジュールと異なるか否かを判別し、
前記更新されたデータドリブンスケジュールが前記データドリブンスケジュールと異なる場合に、前記計算コアの実行を一時中断し、現在のコンテキストを保存し、前記更新されたデータドリブンスケジュールに従って、前記複数のスレッドをディスパッチするように構成されている、
請求項３１のプロセッサ。
【請求項３４】
前記計算コアの各々は、計算ユニット、単一命令多重データ（ＳＩＭＤ）ユニット又はシェーダエンジンを備える、請求項１８のプロセッサ。
【請求項３５】
マルチコアプロセッサのメモリ管理のためのシステムであって、
プロセッサを備え、
前記プロセッサは、
複数の計算コアと、
各計算コアによって共有されるメモリと、
デフォルトスケジュールに従って、複数のスレッドを、前記複数の計算コア上で実行するためにディスパッチするように構成されたディスパッチ回路と、
前記実行に基づいて前記複数のスレッドを分析して、前記複数のスレッド間の相関を決定するように構成された相関回路と、
前記相関に基づいてデータドリブンスケジュールを決定するように構成されたスケジューリング回路と、を備え、
前記ディスパッチ回路は、前記複数のスレッドを、前記データドリブンスケジュールに従って前記複数の計算コア上で実行するためにディスパッチするように構成されている、
システム。
【請求項３６】
前記相関回路は、前記複数のスレッドのサブセット間のメモリの再使用に基づいて前記相関を決定するように構成されている、請求項３５のシステム。
【請求項３７】
前記相関回路は、前記複数のスレッドのサブセット間の参照局所性に基づいて前記相関を決定するように構成されている、請求項３５のシステム。
【請求項３８】
前記デフォルトスケジュールは、ラウンドロビンスケジュールを含む、請求項３５のシステム。
【請求項３９】
前記相関回路は、
前記計算コア上での前記複数のスレッドの少なくとも一部の実行に起因する前記計算コアによるメモリアクセスに関する情報を受信することと、
前記情報に基づいて前記相関を得ることと、を行うように構成されている、
請求項３５のシステム。
【請求項４０】
メモリは前記複数の計算コア間で共有される、請求項３９のシステム。
【請求項４１】
メモリはキャッシュメモリを備える、請求項３９のシステム。
【請求項４２】
前記複数のスレッドは、複数のウェーブを含み、ウェーブベースでスケジューリングされる、請求項３５のシステム。
【請求項４３】
前記複数のスレッドは、複数のワープを含み、ワープベースでスケジューリングされる、請求項３５のシステム。
【請求項４４】
前記複数のスレッドは、複数のスレッドグループを含み、スレッドグループベースでスケジューリングされる、請求項３５のシステム。
【請求項４５】
前記スケジューリング回路は、前記複数のスレッドの各々が前記計算コア上での実行を完了した後に、前記データドリブンスケジュールを生成するように構成されている、請求項３５のシステム。
【請求項４６】
前記スケジューリング回路は、前記複数のスレッドの前記計算コア上での実行が一定期間進行した後に、前記データドリブンスケジュールを生成するように構成されている、請求項３５のシステム。
【請求項４７】
前記スケジューリング回路は、前記複数のスレッドの全てが前記計算コア上での実行を完了する前に、前記データドリブンスケジュールを生成するように構成されている、請求項３５のシステム。
【請求項４８】
前記相関回路は、
前記データドリブンスケジュールに従った実行に基づいて前記複数のスレッドを分析して、前記複数のスレッド間の更新された相関を決定することと、
前記更新された相関に基づいて、更新されたデータドリブンスケジュールを生成することと、を行うように構成されており、
前記ディスパッチ回路は、前記複数のスレッドを、前記更新されたデータドリブンスケジュールに従って前記複数の計算コア上で実行するためにディスパッチするように構成されている、
請求項３５のシステム。
【請求項４９】
前記プロセッサは、回路を備え、
前記回路は、
前記データドリブンスケジュールが前記デフォルトスケジュールと異なるか否かを判別し、
前記データドリブンスケジュールが前記デフォルトスケジュールと異なる場合に、前記計算コアの実行を一時中断し、現在のコンテキストを保存し、前記データドリブンスケジュールに従って、前記複数のスレッドをディスパッチするように構成されている、
請求項３５のシステム。
【請求項５０】
前記プロセッサは、回路を備え、
前記回路は、
前記更新されたデータドリブンスケジュールが前記データドリブンスケジュールと異なるか否かを判別し、
前記更新されたデータドリブンスケジュールが前記データドリブンスケジュールと異なる場合に、前記計算コアの実行を一時中断し、現在のコンテキストを保存し、前記更新されたデータドリブンスケジュールに従って、前記複数のスレッドをディスパッチするように構成されている、
請求項４８のシステム。
【請求項５１】
前記計算コアの各々は、計算ユニット、単一命令多重データ（ＳＩＭＤ）ユニット又はシェーダエンジンを備える、請求項３５のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
（関連出願の相互参照）
本願は、２０１５年１２月２８日に出願された米国特許出願第１４／９８１，２５７の優先権を主張し、参照により本明細書に完全に記載されているかのように組み込まれる。
【０００２】
開示された実施形態は、概して、処理デバイスに関し、特に、複数の計算ユニットを有するプロセッサにおけるメモリ管理に関する。
【背景技術】
【０００３】
現在の多くのマイクロプロセッサは、多数のプロセッサコアを単一のプロセッサに結合してマルチコアプロセッサを形成している。マルチコアプロセッサは、主に並列コンピューティングを実行することによって利益をもたらす。例えば、マルチコアプロセッサは、スレッドレベルの並列性を利用して、プロセッサ内の異なる並列コア上で異なるプログラム、異なるスレッド、スレッドグループ、又は、単一のプログラムのウェーブを実行し得る。
【０００４】
様々なグラフィックス処理タスクが特に並列処理に適しているので、グラフィックス処理ユニット（ＧＰＵ）は、マルチコアプロセッサとしての実装の恩恵を受けることがある。例えば、３次元（３Ｄ）投影は、「完全に並列」又は「高度に並列（embarrassingly parallel）」と呼ばれるタスクのカテゴリに分類され得る。
【０００５】
マルチコアアーキテクチャでは、各コアは、Ｌ１キャッシュ等のローカルメモリを有することができる。しかしながら、ダイサイズの縮小等の様々な理由により、マルチコアデバイス内のいくつかの（又は全ての）コアは、共有Ｌ２若しくは最終レベル（ＬＬＣ）キャッシュ、他のタイプのキャッシュ、又は、キャッシュ若しくはメモリ階層内の他のレベル等のメモリを共有し得る。しかしながら、メモリを共有すると、コア間のメモリリソースが競合する可能性がある。
【発明の概要】
【課題を解決するための手段】
【０００６】
いくつかの実施形態では、プロセッサの複数の計算コアのデータドリブンスケジューリングのための方法を提供する。デフォルトスケジュールに従って、複数のスレッドが複数の計算コア上で実行されてもよい。複数のスレッドは、実行に基づいて分析され、複数のスレッド間の相関を決定してもよい。データドリブンスケジュールは、相関に基づいて生成されてもよい。複数のスレッドは、データドリブンスケジュールに従って、複数の計算コア上で実行されてもよい。
【０００７】
いくつかの実施形態では、データドリブンスケジューリングのために構成されたプロセッサを提供する。プロセッサは、複数の計算コアと、各計算コアによって共有されるメモリと、を備える。プロセッサは、複数のスレッドを、デフォルトのスケジュールに従って複数の計算コア上で実行するためにディスパッチするように構成されたディスパッチ回路を備える。プロセッサは、複数のスレッドを実行に基づいて分析し、複数のスレッド間の相関を決定するように構成された相関回路を備える。プロセッサは、相関に基づいてデータドリブンスケジュールを決定するように構成されたスケジューリング回路を備える。ディスパッチ回路は、複数のスレッドを、データドリブンスケジュールに従って複数の計算コア上で実行するためにディスパッチするように構成されている。
【０００８】
いくつかの実施形態では、マルチコアプロセッサのメモリ管理のためのシステムを提供する。システムは、プロセッサを備える。プロセッサは、複数の計算コアと、各計算コアによって共有されるメモリと、を備える。プロセッサは、複数のスレッドを、デフォルトのスケジュールに従って計算コア上で実行するためにディスパッチするように構成されたディスパッチ回路を備える。プロセッサは、複数のスレッドを実行に基づいて分析し、複数のスレッド間の相関を決定するように構成された相関回路を備える。プロセッサは、相関に基づいてデータドリブンスケジュールを決定するように構成されたスケジューリング回路を備える。ディスパッチ回路は、複数のスレッドを、データドリブンスケジュールに従って複数の計算コア上で実行するためにディスパッチするように構成されている。
【０００９】
添付の図面と併せて例として与えられる以下の説明から、より詳細な理解が得られるであろう。
【図面の簡単な説明】
【００１０】
【図１】１つ以上の開示された実施形態を実装することができる例示的なデバイスのブロック図である。
【図２】マルチコアプロセッサのいくつかのコア上で実行するためにいくつかのスレッドをスケジューリングする例示的な方法を示すフローチャートである。
【図３】マルチコアプロセッサのいくつかのコア上で実行するためにいくつかのスレッドをスケジューリングする別の例示的な方法を示すフローチャートである。
【図４】データドリブンスケジューリングを実施する例示的なシステムを示すブロック図である。
【図５】相関アレイの状態の一例を示す表である。
【図６】データドリブンスケジューリングを実施する別の例示的なシステムを示すブロック図である。
【図７】相関アレイの別の状態の一例を示す表である。
【図８】データドリブンスケジューリングを実施する別の例示的なシステムを示すブロック図である。
【図９】相関アレイの別の状態の一例を示す表である。
【図１０】データドリブンスケジューリングを実施する別の例示的なシステムを示すブロック図である。
【図１１】相関アレイの別の状態の一例を示す表である。
【発明を実施するための形態】
【００１１】
図１は、１つ以上の開示された実施形態を実装することができる例示的なデバイス１００のブロック図である。デバイス１００は、例えば、コンピュータ、ゲームデバイス、ハンドヘルドデバイス、セットトップボックス、テレビ、携帯電話又はタブレットコンピュータを含み得る。デバイス１００は、プロセッサ１０２と、メモリ１０４と、ストレージ１０６と、１つ以上の入力デバイス１０８と、１つ以上の出力デバイス１１０と、を含む。さらに、デバイス１００は、オプションとして、入力ドライバ１１２及び出力ドライバ１１４を含み得る。デバイス１００は、図１に示されていない追加のコンポーネントを含んでもよいことが理解されるであろう。
【００１２】
プロセッサ１０２は、中央処理装置（ＣＰＵ）、グラフィックス処理装置（ＧＰＵ）、同じダイ上に配置されたＣＰＵ及びＧＰＵ、又は、１つ以上のプロセッサコアを含んでもよく、各プロセッサコアは、ＣＰＵ若しくはＧＰＵ、シェーダエンジン（ＳＥ）、計算ユニット（ＣＵ）、又は、ＣＰＵ若しくはＧＰＵの単一命令多重データ（ＳＩＭＤ）ユニットであってもよい。メモリ１０４は、プロセッサ１０２と同じダイ上に配置されてもよいし、プロセッサ１０２とは別に配置されてもよい。メモリ１０４は、例えば、ランダムアクセスメモリ（ＲＡＭ）、ダイナミックＲＡＭ又はキャッシュ等の揮発性又は不揮発性メモリを含んでもよい。各プロセッサコアは、ローカルＬ１キャッシュメモリ等のローカルメモリを有してもよく、及び／又は、共有Ｌ２キャッシュメモリ等のメモリを１つ以上の他のコアと共有してもよい。
【００１３】
ストレージ１０６は、例えば、ハードディスクドライブ、ソリッドステートドライブ、光ディスク又はフラッシュドライブ等の固定又は取り外し可能なストレージを含んでもよい。入力デバイス１０８は、キーボード、キーパッド、タッチスクリーン、タッチパッド、検出器、マイクロフォン、加速度計、ジャイロスコープ、バイオメトリックスキャナ、又は、ネットワーク接続（例えば、無線ＩＥＥＥ８０２信号の送信及び／又は受信用の無線ローカルエリアネットワークカード）を含み得る。出力デバイス１１０は、ディスプレイ、スピーカ、プリンタ、触覚フィードバックデバイス、１つ以上のライト、アンテナ、又は、ネットワーク接続（例えば、無線ＩＥＥＥ８０２信号の送信及び／又は受信用の無線ローカルエリアネットワークカード）を含み得る。
【００１４】
入力ドライバ１１２は、プロセッサ１０２及び入力デバイス１０８と通信し、プロセッサ１０２が入力デバイス１０８から入力を受信することを可能にする。出力ドライバ１１４は、プロセッサ１０２及び出力デバイス１１０と通信し、プロセッサ１０２が出力デバイス１１０から出力を送信することを可能にする。入力ドライバ１１２及び出力ドライバ１１４はオプションのコンポーネントであり、デバイス１００は、入力ドライバ１１２及び出力ドライバ１１４が存在しない場合、同じように動作することに留意されたい。
【００１５】
マルチコアプロセッサでは、キャッシュを共有する２つ（又はそれ以上）のコアが、メモリから相当量の異なる情報にアクセスするスレッド（又は、スレッドグループ、ウェーブ若しくは他のタイプの命令グループ）を並列に（例えば、重複する期間内に同時又は同時期に）実行する場合に、不足が発生し得る。スレッドは、例えば、スレッド間の参照のローカル性が不十分であるため、異なる情報にアクセスし得る。この文脈における参照のローカル性とは、各スレッドによって参照される同一の情報を指してもよい。
【００１６】
このような状況では、一方のスレッドの実行により共有キャッシュにロードされたデータは、他のスレッドの実行により共有キャッシュにロードされたデータによって追い出される可能性がある。これは、各スレッドによって必要とされるメモリアクセス数、及び／又は、各スレッドが他のスレッドによってアクセスされる情報とは異なる情報にアクセスするかどうかに依存し得る。このような追い出しは、スレッドの実行中に行き来を継続する可能性があり、メモリアクセスレイテンシの実質的で望ましくない増加が生じる可能性がある。
【００１７】
したがって、可能であれば、より多くの同じ情報を使用するスレッド、及び／又は、より大きなメモリの再使用を示すスレッドを別個のコア上で並行して実行するマルチコアプロセッサを構成することが望ましい場合がある。この文脈におけるメモリの再使用とは、１つのスレッドによって情報がメモリから取り出されることであって、別のスレッドによっても当該情報が使用されることを意味してもよい。これらのスレッドの１つが１つのコアで実行され、他のスレッドが別のコアで実行されるシナリオでは、２つのコアがキャッシュを共有する場合、情報が両方のスレッドによるアクセスのために共有キャッシュに記憶され得る。したがって、所定の時間内に実行がスケジューリングされているスレッドの場合、他のスレッドを並列に実行するのではなく、より共有された参照局所性を示すスレッドを並列に実行することが好ましい場合がある。これは、共有データキャッシュからの追い出し回数を減らし、したがって、メモリアクセスレイテンシを減らすという利点を有し得る。例えば、多数のピクセルが同じテクスチャデータを使用し、多数の処理ユニットを有するＧＰＵによって処理される場合、共有された参照局所性の利点を得るために、テクスチャデータを共有するピクセルを、直列ではなく並列に処理する方が効率的であり得る。
【００１８】
図２は、マルチコアプロセッサのいくつか（Ｙ個）のコア上で実行するいくつか（Ｘ個）のスレッドをスケジューリングするための例示的な方法２００を示すフローチャートである。ここで、Ｙ個のコアは、共有Ｌ２キャッシュ等の少なくとも１つのメモリを共有する。方法２００は、例えば、デバイス１００の一部又は全部を使用して実施されてもよい。例えば、プロセッサは、図１に示すプロセッサ１０２に対応し得る。
【００１９】
ステップ２１０において、スレッドは、例えば、マルチコアプロセッサの分析モジュールによって分析され、スレッド間のメモリの再使用又は「相関」の量を決定する。例えば、Ｘ＝４及びＹ＝２の場合には、Ｘ個のスレッドを分析して、スレッドの何れのペアがスレッド間で最大の相関を有するかを決定してもよい。Ｘ＝８及びＹ＝４の別の例では、Ｘ個のスレッドを分析して、４つのスレッドの何れのグループがスレッド間で最大の相関を有するかを決定してもよい。これらのスレッドグループの相関は、例えば、分析モジュールによってランク付けされてもよい。分析は、本明細書でさらに説明される実施例を含む任意の適切な方法で行われてもよい。
【００２０】
ステップ２２０において、スレッドは、例えば、マルチコアプロセッサのスケジューリングモジュールによってスケジューリングされ、ステップ２１０において最大の相関を有するものとして識別されたＹ個のスレッドがＹ個のコア上で並列に実行される。Ｘ＝２Ｙの場合には、Ｘ個のスレッドのうち残りのスレッドが、Ｙ個のコア上で並列に実行されるようにスケジューリングされてもよい。Ｘ＞２Ｙの場合には、残りのスレッドが、スレッド間の最大の相関に基づいて並列に実行されるようにスケジューリングされてもよい。
【００２１】
スレッドの代わりにＹ個のスレッドの異なるセットが、相関のバランスに基づいて並列実行のためにスケジューリングされるようにスケジューリングされてもよいことに留意されたい。例えば、ステップ２１０で識別されたＹ個のスレッドを最大の相関を有するものとして並列に実行する状況では、残りのスレッドが、スレッドの異なる選択よりも不十分な相関で並列に実行され、スレッドのＹ個のセットの各々が、Ｙ個のスレッドの両方のセットの相関が最大になるように選択され得る。
【００２２】
ステップ２３０において、Ｘ個のスレッドは、ステップ２２０でスケジューリングされたＹ個のコア上で実行される。Ｘ個のスレッドは、利用可能な最良の相関を有するサブセット内のＹ個のコア上で実行されるので、共有メモリ（例えば、共有Ｌ２キャッシュ）からの追い出しを最小限に抑えることができ、メモリアクセスレイテンシを最小化し、性能を向上させるのに役立つ。
【００２３】
しかしながら、方法２００は、Ｙ個のコア上でこれらのスレッドを実行する前に、相関についてＸ個のスレッドの分析を必要とする場合があることに留意されたい。例えば、Ｘ個のスレッドが相関ベースのマルチコアスケジューリングを利用するようにプログラムされていない場合等には、これは不可能となる。したがって、相関を動的に決定することが有利となり得る。
【００２４】
図３は、マルチコアプロセッサのＹ個のコア上で実行するＸ個のスレッドをスケジューリングするための別の例示的な方法３００を示すフローチャートである。ここで、Ｙ個のコアは、共有Ｌ２キャッシュ等の少なくとも１つのメモリを共有する。方法３００では、相関が動的に決定される。方法３００は、例えば、デバイス１００の一部又は全部を使用して実施されてもよい。例えば、プロセッサは、図１に示すプロセッサ１０２に対応し得る。
【００２５】
ステップ３１０では、Ｘ個のスレッドがＹ個のコア上での実行のためにスケジューリングされる。このステップでは、Ｘ個のスレッド間の相関が不明である。したがって、「ラウンドロビン」パターン等のデフォルトスケジューリングパターンが最初に使用される。したがって、Ｘ＝４でスレッドがＴ０、Ｔ１、Ｔ２及びＴ３であり、Ｙ＝２でコアがＣＵ０及びＣＵ１である場合には、ラウンドロビン方式でのスケジューリングは、Ｔ０＝Ｃ０、Ｔ１＝Ｃ１、Ｔ２＝Ｃ０、Ｔ３＝Ｃ１となる。
【００２６】
ステップ３２０において、Ｘ個のスレッドが、スレッドの現在のスケジューリングに従ってＹ個のコア上で実行される。したがって、スケジューリングがステップ３１０のラウンドロビンパターンに続く場合、スレッドＴ０及びＴ１がＣ０及びＣ１上で並列に実行され、続いて、Ｔ２及びＴ３がＣ０及びＣ１上で実行される。
【００２７】
ステップ３３０において、Ｘ個のスレッドは、実行に基づいて相関について分析される。ステップ３３０の分析は、実際に、実行中にステップ３２０と組み合わせて行われてもよいし、実行後にステップ３２０の間に収集されたデータに対して行われてもよい。相関は、任意の適切な技術を使用して決定されてもよく、実施例について本明細書でさらに説明する。
【００２８】
ステップ３４０において、Ｘ個のスレッドは、ステップ３３０において決定された相関に基づいて、Ｙ個のコア上での実行のためにスケジューリングされる。このステップでは、Ｘ個のスレッド間の相関が判明している。したがって、デフォルトスケジューリングパターンが使用されず、スレッドは、既知の相関に従ってスケジューリングされる。Ｘ＝４でスレッドがＴ０、Ｔ１、Ｔ２及びＴ３であり、Ｙ＝２でコアがＣＵ０及びＣＵ１である例では、ステップ３３０において、様々な可能なスレッドペアの中で最も高い相関がＴ０とＴ２との間にあることを判別し得る。相関に基づくスケジューリングは、Ｔ０＝Ｃ０、Ｔ２＝Ｃ１、Ｔ１＝Ｃ０、Ｔ３＝Ｃ１となる。このスケジューリングは、ステップ３３０の分析によって生成された相関データに基づいているので、かかるスケジューリングをデータドリブンスケジューリングと呼び、このスケジューリングを実施するためのデバイス又はデバイスの組み合わせをデータドリブンスケジューラと呼ぶことができる。
【００２９】
或いは、データドリブンスケジューリングは、全てのスレッドの実行において最大化された相関に基づいてもよい。例えば、Ｔ１とＴ３との間の相関が特に低い場合には、これらのスレッドをスケジュールＴ０＝Ｃ０、Ｔ２＝Ｃ１、Ｔ１＝Ｃ０、Ｔ３＝Ｃ１で並列に実行すると、メモリアクセスレイテンシが発生し、Ｔ０及びＴ２を並列に実行することによってもたらされるメモリアクセスレイテンシの低減を相殺又は無効にする。これに対処するために、様々な可能なスレッドペアの中で２番目（又は３番目若しくは４番目等）に高い相関値がデータドリブンスケジューラによって考慮されてもよい。一例では、２番目に高い相関は、Ｔ０とＴ３との間であり得る。実行をスケジューリングするためにこのペアを使用すると、Ｔ０＝Ｃ０、Ｔ３＝Ｃ１、Ｔ１＝Ｃ０、Ｔ２＝Ｃ１が得られる。Ｔ１とＴ３との間の低い相関がＴ０とＴ２との間の最も高い相関を相殺する例では、この新しいスケジュールは、Ｘ個のスレッド全ての実行におけるメモリアクセスレイテンシを最小化することができる。このスケジューリング自体は、全てのスレッドに亘って最高の平均相関を提供することができず、全ての可能な組み合わせを分析して、全てのスレッドに亘って最良の平均相関及び／又は最小のメモリアクセスレイテンシを決定することができることに留意されたい。しかしながら、このようにして全てのＸ個のスレッド間の相関を最大にするように構成されたデータドリブンスケジューラは、実装するために追加の回路及び／又は追加の遅延を必要とする場合がある。
【００３０】
ステップ３５０において、Ｘ個のスレッドは、スケジュールに従って、Ｙ個のコア上で実行される。したがって、スケジューリングがＴ０＝Ｃ０、Ｔ２＝Ｃ１、Ｔ１＝Ｃ０、Ｔ３＝Ｃ１に続く場合、スレッドＴ０及びＴ２がＣ０及びＣ１上で並列に実行され、続いてＴ１及びＴ３がＣ０及びＣ１上で実行される。
【００３１】
フローは、例えば、実行中のスレッドのさらなる分析（例えば、実行中のスレッドのメモリアクセス間の分析）のためにステップ３３０に戻ってもよい。これにより、実行スケジューリングをさらに動的に制御することが可能になる。例えば、いくつかの実施形態では、スケジューリングは、現在実行中のスレッドをコンテキスト節約し、更新されたスケジュールに基づいて異なるコアにスレッドをスケジューリングし、次にコンテキストを復元することによって、スレッドの実行中にスケジューリングを調整してもよい（例えば、相関値を変更することによって示される場合）。
【００３２】
図４は、データドリブンスケジューリングを実施する例示的なシステム４００を示すブロック図である。一実装例では、システム４００は、プロセッサ１０２の機能であってもよい。システム４００は、処理ユニット４１０と、処理ユニット４１０によって共有されるキャッシュメモリ４２０と、データドリブンスケジューラ４３０と、スレッドグループディスパッチャ４４０と、を含む。システム４００の例では、処理ユニット４１０は、２つのコア（この場合、シェーダエンジンＳＥ０及びＳＥ１）を含む。データドリブンスケジューラ４３０は、相関アレイ４５０と決定ユニット４６０とを含み、スレッドグループレベルのスケジュールを決定する。シェーダエンジン上で並列に実行するためにグループ化されたスレッドのグループは、この文脈においてスレッドグループと呼ばれる場合がある。
【００３３】
シェーダエンジンＳＥ０及びＳＥ１は、例えば、グラフィックスプロセッサ内の処理ユニットのクラスタを含んでもよい。かかるクラスタは、様々なアーキテクチャにおける「シェーダエンジン」以外の用語で呼ばれ得ることに留意されたい。
【００３４】
この例では、キャッシュメモリ４２０はＬ２キャッシュであるが、キャッシュメモリ４２０は、シェーダエンジンＳＥ０及びＳＥ１によって共有される任意の適切なレベルのキャッシュメモリ又は別の共有メモリであってもよいことに留意されたい。キャッシュメモリ４２０は、シェーダエンジンＳＥ０及びＳＥ１によって共有される。
【００３５】
データドリブンスケジューラ４３０は、処理ユニット４１０上での実行のためにスレッドグループをスケジューリングする。相関アレイ４５０は、スレッドグループ間の相関を計算する。決定ユニット４６０は、特定の時間に処理ユニット４１０のうち特定の１つにディスパッチするスレッドグループを決定する。
【００３６】
相関データがスケジューリングに利用可能になる前に、データドリブンスケジューラ４３０は、デフォルト（例えば、データドリブンではない）スケジューリングパターンを使用して、シェーダエンジンＳＥ０及びＳＥ１上での実行のためにスレッドグループをスケジューリングする。このデフォルトパターンは、ラウンドロビンパターンであってもよい。例示的なシステム４００では、４つのスレッドグループの粒度でスケジューリングが行われる。したがって、最初の４つのスレッドグループがＴＧ０、ＴＧ１、ＴＧ２及びＴＧ３と呼ばれる場合、ラウンドロビン方式での最初の４つのスレッドグループのスケジューリングは、ＴＧ０＝ＳＥ０、ＴＧ１＝ＳＥ１、ＴＧ２＝ＳＥ０、ＴＧ３＝ＳＥ１となる。次に、スレッドグループディスパッチャ４４０は、デフォルトスケジュールに従って、ＳＥ０及びＳＥ１上での実行のためにスレッドグループをディスパッチする。
【００３７】
ＳＥ０及び／又はＳＥ１からキャッシュ４２０への新たなメモリ要求に応じて、キャッシュ４２０は、メモリ要求に対応するインデックス及びキャッシュタグを相関アレイ４５０に転送することができる。インデックスは、要求しているスレッドグループの識別情報（例えば、ＴＧ  ＩＤ）に対応してもよく、タグは、要求されたメモリアドレス、データマスク及び／又は補助情報を含んでもよい。したがって、キャッシュ４２０は、現在実行中のスレッドグループが必要とするメモリアクセスに関する情報を相関アレイ４５０に提供する。例えば、相関アレイ４５０が物理アドレス空間に実装されている場合、キャッシュライン粒度（cacheline granularity）にアクセスされている物理メモリのアドレスは、適切な相関情報となり得る。相関アレイ４５０が仮想アドレス空間に実装されている場合、何らかの形式のプロセスＩＤ等の追加情報が必要になることがある。
【００３８】
相関アレイ４５０は、インデックス及びタグ情報を記憶してもよく、以下にさらに説明するように、この情報を使用してスレッドグループの相関値を計算してもよい。相関アレイ４５０は、これらの相関値を決定ユニット４６０に報告してもよい。決定ユニット４６０は、報告された相関値を使用して、ＳＥ０及びＳＥ１上でスレッドグループＴＧ０、ＴＧ１、ＴＧ２、ＴＧ３を実行するためにデータドリブンスケジューリングを決定してもよい。次に、スレッドグループディスパッチャ４４０は、データドリブンスケジュールに従って、ＳＥ０及びＳＥ１上での実行のためにスレッドグループをディスパッチすることができる。
【００３９】
図５は、スレッドグループＴＧ０、ＴＧ１、ＴＧ２及びＴＧ３の実行中のある時点における相関アレイ４５０の状態例を示す表５００である。例示的なシステム４００は、４つのスレッドグループの粒度でスケジューリングを行う。したがって、表５００は、スレッドグループＴＧ０、ＴＧ１、ＴＧ２及びＴＧ３のうち１つにそれぞれ対応する４つのキー５１０、５１０’、５１０’’、５１０’’’を含む。
【００４０】
各キー５１０、５１０’、５１０’’、５１０’’’は、対応するタグリスト（図示省略）及び寄与相関値（contributing correlation values）５２０、５２０’、５２０’’、５２０’’’のセットを含む。寄与相関値５２０、５２０’、５２０’’、５２０’’’のセットは、スレッドグループＴＧ０、ＴＧ１、ＴＧ２及びＴＧ３の各ペアの相関を反映する。例えば、キー５１０は、ＴＧ０に対する寄与相関値５２０のセットを記憶する。寄与相関値５２０のセットは、ＴＧ０とＴＧ１との間の相関に対応する寄与相関値Ｃ０１と、ＴＧ０とＴＧ２との間の相関に対応する寄与相関値Ｃ０２と、ＴＧ０とＴＧ３との間の相関に対応する寄与相関値Ｃ０３と、を記憶する。他のキー５１０’、５１０’’、５１０’’’の各々は、図５に反映される同様の寄与相関値５２０’、５２０’’、５２０’’’のセットを記憶する。相関情報が相関アレイ４５０に利用可能になる前には（例えば、方法３００のステップ３１０と同様に）、タグリストは空であってもよく、寄与相関値はゼロであってもよい。
【００４１】
スレッドグループの実行中のＳＥ０又はＳＥ１による新たなメモリ要求では、相関アレイ４５０は、メモリ要求の対応するインデックス及びタグ情報をキャッシュから受信する。インデックス及びタグ情報が表５００内のエントリと一致する場合には、対応する寄与相関値は、増加した相関を反映するようにインクリメント、増加、又は、変更されてもよい。例えば、相関アレイ４５０が、インデックスＴＧ１及びタグｔａｇ３を受信し、ＴＧ０のタグリストがｔａｇ３も含むように反映する場合には、ＴＧ０とＴＧ１との間の相関を反映する寄与相関値Ｃ０１を増加（例えば、１だけインクリメントされる）してもよい。
【００４２】
受信したインデックスが表５００のキーと一致するが、受信したタグがタグリスト内の何れのタグとも一致しない場合には、受信したタグをそのキーのタグリストに挿入してもよい。受信したインデックスが表５００のキーと一致しないが、受信したタグがタグリスト内のタグと一致する場合。
【００４３】
ＴＧ０、ＴＧ１、ＴＧ２及びＴＧ３がＳＥ０及びＳＥ１上での実行を終了した後、寄与相関値Ｃ０１及びＣ１０を合計（又は他の方法で組み合わせる）して、ＴＧ０とＴＧ１との間の相関を反映する相関値ｃ０１が決定されてもよい。他の一致する寄与相関値を同様に合計して、他のＴＧペアの相関値を求めてもよい。例えば、ｃ０２は、寄与相関値Ｃ０２及びＣ２０を合計する等によって計算されたＴＧ０及びＴＧ２の相関値であってもよい。これらの相関値ｃ０１、ｃ０２、ｃ０３、ｃ１２、ｃ１３、ｃ２３は、決定ユニット４６０に報告されてもよい。
【００４４】
ＴＧ０、ＴＧ１、ＴＧ２及びＴＧ３がＳＥ０及びＳＥ１上での実行を終了するまで待つのではなく、一定の期間（例えば、１，０００プロセッサクロックサイクル）後に寄与相関値が合計及び／又は報告されてもよいことに留意されたい。したがって、相関値は、実行の完了前、又は、ＴＧ０、ＴＧ１、ＴＧ２及びＴＧ３のいくつかの実行後に計算されてもよい。これにより、動的なスケジューリング、及び／又は、より高い解像度のデータに基づくスケジューリングが可能になる。
【００４５】
図４に戻ると、決定ユニット４６０は、報告された相関値ｃ０１、ｃ０２、ｃ０３、…に基づいて、次の４つのＴＧ（ＴＧ０、ＴＧ１、ＴＧ２、ＴＧ３）の発行順（すなわち、データドリブンスケジュール）を決定してもよい。表１は、決定ユニット４６０がこの決定を行うための部分的なアルゴリズムの一例を反映する疑似コードを示す。スレッドグループディスパッチャ４４０は、決定ユニット４６０からデータドリブンスケジュールを受信し、データドリブンスケジュールに従ってスレッドグループをＳＥ０及びＳＥ１にディスパッチする。いくつかの実装では、スレッドグループディスパッチャ４４０は、スケジュールが変更されたという決定に基づいて、そのスケジュールを更新するだけでよい。いくつかの実装では、スケジュールが変更されたという条件で、ＳＥ０及びＳＥ１上で現在実行中のスレッドグループが一時中断されてもよく、コンテキストが保存されてもよく、更新されたスケジュールがスレッドグループに適用されてもよく（すなわち、スレッドグループが、異なるシェーダエンジン及び／又は実行時間に再度割り当てられてもよい）、コンテキストが復元されてもよく、更新されたスケジュールに従って実行が再開されてもよい。
【表１】
2019501470.tif 000003
【００４６】
他の例示的なシステムでは、スケジューリングは、スレッドグループ以外に基づいてもよい。例えば、ウェーブレベルに基づくスケジューリングは、システムアーキテクチャに応じて適切となり得る。
【００４７】
図６は、データドリブンスケジューリングを実施する例示的なシステム６００を示すブロック図である。一実装例では、システム６００は、プロセッサ１０２の機能であってもよい。システム６００は、処理ユニット６１０と、処理ユニット６１０によって共有されるキャッシュメモリ６２０と、データドリブンスケジューラ６３０と、ウェーブディスパッチャ６４０と、を含む。システム６００の例では、処理ユニット６１０は、２つのコア（この場合、計算ユニットＣＵ０及びＣＵ１）を含む。データドリブンスケジューラ６３０は、相関アレイ６５０と決定ユニット６６０とを含み、ウェーブレベルのスケジュールを決定する。
【００４８】
計算ユニットＣＵ０及びＣＵ１の各々は、単一命令多重データ（ＳＩＭＤ）コアを含んでもよい。この文脈において、ＳＩＭＤコア上で並列に実行されるスレッドのグループは、ウェーブと呼ばれる場合がある。
【００４９】
この例では、キャッシュメモリ６２０はＬ２キャッシュであるが、キャッシュメモリ６２０は、計算ユニットＣＵ０及びＣＵ１によって共有される任意の適切なレベルのキャッシュメモリ又は別の共有メモリであってもよいことに留意されたい。キャッシュメモリ６２０は、計算ユニットＣＵ０及びＣＵ１によって共有される。
【００５０】
データドリブンスケジューラ６３０は、処理ユニット６１０上での実行のためにウェーブをスケジューリングする。相関アレイ６５０は、ウェーブ間の相関を計算する。決定ユニット６６０は、特定の時間に処理ユニット６１０のうち特定の１つにディスパッチするウェーブを決定する。
【００５１】
相関データがスケジューリングに利用可能になる前に、データドリブンスケジューラ６３０は、デフォルト（例えば、データドリブンではない）スケジューリングパターンを使用して、計算ユニットＣＵ０及びＣＵ１上での実行のためにスレッドグループをスケジューリングする。このデフォルトパターンは、ラウンドロビンパターンであってもよい。例示的なシステム６００では、４つのウェーブの粒度でスケジューリングが行われる。したがって、最初の４つのウェーブがｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２及びｗａｖｅ３と呼ばれる場合、ラウンドロビン方式での最初の４つのウェーブのスケジューリングは、ｗａｖｅ０＝ＣＵ０、ｗａｖｅ１＝ＣＵ１、ｗａｖｅ２＝ＣＵ０、ｗａｖｅ３＝ＣＵ１となる。次に、ウェーブディスパッチャ６４０は、デフォルトスケジュールに従って、ＣＵ０及びＣＵ１上での実行のためにウェーブをディスパッチする。
【００５２】
ＣＵ０及び／又はＣＵ１からキャッシュ６２０への新たなメモリ要求に応じて、キャッシュ６２０は、メモリ要求に対応するインデックス及びキャッシュタグを相関アレイ６５０に転送することができる。インデックスは、要求しているウェーブの識別情報（例えば、ウェーブＩＤ）に対応してもよく、タグは、要求されたメモリアドレス、データマスク及び／又は補助情報を含んでもよい。したがって、キャッシュ６２０は、現在実行中のウェーブが必要とするメモリアクセスに関する情報を相関アレイ６５０に提供する。タグは、物理アドレスであってもよいし、仮想メモリ識別子と組み合わせた仮想アドレスであってもよい。タグは、データキャッシュで使用されているタグと類似してもよい。
【００５３】
相関アレイ６５０は、インデックス及びタグ情報を記憶してもよく、以下にさらに説明するように、この情報を使用してウェーブの相関値を計算してもよい。相関アレイ６５０は、これらの相関値を決定ユニット６６０に報告してもよい。決定ユニット６６０は、報告された相関値を使用して、ＣＵ０及びＣＵ１上でウェーブｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３を実行するためにデータドリブンスケジューリングを決定してもよい。次に、ウェーブディスパッチャ６４０は、データドリブンスケジュールに従って、ＣＵ０及びＣＵ１上での実行のためにウェーブをディスパッチすることができる。
【００５４】
図７は、ウェーブｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２及びｗａｖｅ３の実行中のある時点における相関アレイ６５０の状態例を示す表７００である。例示的なシステム６００は、４つのウェーブの粒度でスケジューリングを行う。したがって、表７００は、ウェーブｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２及びｗａｖｅ３のうち１つにそれぞれ対応する４つのキー７１０、７１０’、７１０’’、７１０’’’を含む。
【００５５】
各キー７１０、７１０’、７１０’’、７１０’’’は、対応するタグリスト（図示省略）及び寄与相関値７２０、７２０’、７２０’’、７２０’’’のセットを含む。寄与相関値７２０、７２０’、７２０’’、７２０’’’のセットは、ウェーブｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２及びｗａｖｅ３の各ペアの相関を反映する。例えば、キー７１０は、ｗａｖｅ０に対する寄与相関値７２０のセットを記憶する。寄与相関値７２０のセットは、ｗａｖｅ０とｗａｖｅ１との間の相関に対応する寄与相関値Ｃ０１と、ｗａｖｅ０とｗａｖｅ２との間の相関に対応する寄与相関値Ｃ０２と、ｗａｖｅ０とｗａｖｅ３との間の相関に対応する寄与相関値Ｃ０３と、を記憶する。他のキー７１０’、７１０’’、７１０’’’の各々は、図７に反映される同様の寄与相関値７２０’、７２０’’、７２０’’’のセットを記憶する。相関情報が相関アレイ６５０に利用可能になる前には（例えば、方法３００のステップ３１０と同様に）、タグリストは空であってもよく、寄与相関値はゼロであってもよい。
【００５６】
ウェーブの実行中のＣＵ０又はＣＵ１による新たなメモリ要求では、相関アレイ６５０は、メモリ要求の対応するインデックス及びタグ情報をキャッシュから受信する。インデックス及びタグ情報が表７００内のエントリと一致する場合には、対応する寄与相関値は、増加した相関を反映するようにインクリメント、増加、又は、変更されてもよい。例えば、相関アレイ６５０が、インデックスｗａｖｅ１及びタグｔａｇ３を受信し、ｗａｖｅ０のタグリストがｔａｇ３も含むように反映する場合には、ｗａｖｅ０とｗａｖｅ１との間の相関を反映する寄与相関値Ｃ０１を増加（例えば、１だけインクリメントされる）してもよい。
【００５７】
受信したインデックスが表７００のキーと一致するが、受信したタグがタグリスト内の何れのタグとも一致しない場合、受信したタグをそのキーのタグリストに挿入してもよい。受信したインデックスが表７００のキーと一致しないが、受信したタグがタグリスト内のタグと一致する場合、新たなキーをそのインデックスに追加してもよく、タグが一致する場合には他のキーに対する相関が調整され得る。
【００５８】
ｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２及びｗａｖｅ３がＣＵ０及びＣＵ１上での実行を終了した後、寄与相関値Ｃ０１及びＣ１０を合計（又は別の方法で組み合わせる）して、ｗａｖｅ０とｗａｖｅ１との間の相関を反映する相関値ｃ０１が決定されてもよい。他の一致する寄与相関値を同様に合計して、他のウェーブペアの相関値を求めてもよい。例えば、ｃ０２は、寄与相関値Ｃ０２及びＣ２０を合計する等によって計算されたｗａｖｅ０及びｗａｖｅ２の相関値であってもよい。これらの相関値ｃ０１、ｃ０２、ｃ０３、ｃ１２、ｃ１３、ｃ２３は、決定ユニット６６０に報告されてもよい。
【００５９】
ｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２及びｗａｖｅ３がＣＵ０及びＣＵ１上での実行を終了するまで待つのではなく、一定の期間（例えば、１，０００プロセッサクロックサイクル）後に寄与相関値が合計及び／又は報告されてもよいことに留意されたい。したがって、相関値は、実行の完了前、又は、ｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２及びｗａｖｅ３のいくつかの実行後に計算されてもよい。これにより、動的なスケジューリング、及び／又は、より高い解像度のデータに基づくスケジューリングが可能になる。
【００６０】
図６に戻ると、決定ユニット６６０は、報告された相関値ｃ０１、ｃ０２、ｃ０３、…に基づいて、次の４つのウェーブ（ｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３）の発行順（すなわち、データドリブンスケジュール）を決定してもよい。表２は、決定ユニット６６０がこの決定を行うための部分的なアルゴリズムの一例を反映する疑似コードを示す。ウェーブディスパッチャ６４０は、決定ユニット６６０からデータドリブンスケジュールを受信し、データドリブンスケジュールに従ってウェーブをＣＵ０及びＣＵ１にディスパッチする。いくつかの実装では、ウェーブディスパッチャ６４０は、スケジュールが変更されたという決定に基づいて、そのスケジュールを更新するだけでよい。いくつかの実装では、スケジュールが変更されたという条件で、ＣＵ０及びＣＵ１上で現在実行中のウェーブが一時中断されてもよく、コンテキストが保存されてもよく、更新されたスケジュールがウェーブに適用されてもよく（すなわち、ウェーブが、異なる計算ユニット及び／又は実行時間に再度割り当てられてもよい）、コンテキストが復元されてもよく、更新されたスケジュールで実行が再開されてもよい。
【表２】
2019501470.tif 000004
【００６１】
他の例示的なシステムでは、スケジューリングは、スレッドグループ又はウェーブ以外に基づいてもよい。例えば、スレッドレベルに基づくスケジューリングは、システムアーキテクチャに応じて適切となり得る。本明細書で説明する技術は、本発明から逸脱することなく、スレッド、スレッドグループ又はウェーブ以外の他の抽象レベルに適用可能であることに留意されたい。
【００６２】
図８は、データドリブンスケジューリングを実施する例示的なシステム８００を示すブロック図である。１つの実装例では、システム８００は、プロセッサ１０２の機能であってもよい。システム８００は、処理ユニット８１０と、処理ユニット８１０によって共有される２つのキャッシュメモリ８２０、８２５と、データドリブンスケジューラ８３０と、スレッドディスパッチャ８４０と、を含む。システム８００の例では、処理ユニット８１０は、２つのコア（この場合、ＳＩＭＤユニットであるＳＩＭＤ０及びＳＩＭＤ１）を含む。データドリブンスケジューラ８３０は、相関アレイ８５０と決定ユニット８６０とを含み、スレッドレベルのスケジュールを決定する。
【００６３】
この例では、キャッシュメモリ８２０、８２５の各々はＬ１及びＬ２キャッシュである。しかしながら、キャッシュメモリ８２０、８２５は、任意の適切なレベルのキャッシュメモリであってもよいし、ＳＩＭＤユニットであるＳＩＭＤ０及びＳＩＭＤ１によって共有される他の共有メモリであってもよい。キャッシュメモリ８２０、８２５は、ＳＩＭＤユニットであるＳＩＭＤ０及びＳＩＭＤ１によって共有される。
【００６４】
データドリブンスケジューラ８３０は、処理ユニット８１０上での実行のためにスレッドをスケジューリングする。相関アレイ８５０は、スレッド間の相関を計算する。決定ユニット８６０は、特定の時間に処理ユニット８１０のうち特定の１つにディスパッチするスレッドを決定する。
【００６５】
相関データがスケジューリングに利用可能になる前に、データドリブンスケジューラ８３０は、デフォルト（例えば、データドリブンではない）スケジューリングパターンを使用して、ＳＩＭＤユニットであるＳＩＭＤ０及びＳＩＭＤ１上での実行のためにスレッドグループをスケジューリングする。このデフォルトパターンは、ラウンドロビンパターンであってもよい。例示的なシステム８００では、４つのスレッドの粒度でスケジューリングが行われる。したがって、最初の４つのスレッドがｔｈｒｅａｄ０、ｔｈｒｅａｄ１、ｔｈｒｅａｄ２及びｔｈｒｅａｄ３と呼ばれる場合、ラウンドロビン方式での最初の４つのスレッドのスケジューリングは、ｔｈｒｅａｄ０＝ＳＩＭＤ０、ｔｈｒｅａｄ１＝ＳＩＭＤ１、ｔｈｒｅａｄ２＝ＳＩＭＤ０、ｔｈｒｅａｄ３＝ＳＩＭＤ１となる。次に、スレッドディスパッチャ８４０は、デフォルトスケジュールに従って、ＳＩＭＤ０及びＳＩＭＤ１上での実行のためにスレッドをディスパッチする。
【００６６】
ＳＩＭＤ０及び／又はＳＩＭＤ１からキャッシュ８２０又はキャッシュ８２５への新たなメモリ要求に応じて、要求を受信したキャッシュは、メモリ要求に対応するインデックス及びキャッシュタグを相関アレイ８５０に転送することができる。インデックスは、要求しているスレッドの識別情報（例えば、スレッドＩＤ）に対応してもよく、タグは、要求されたメモリアドレス、データマスク及び／又は補助情報を含んでもよい。したがって、キャッシュ８２０又は８２５は、現在実行中のスレッドが必要とするメモリアクセスに関する情報を相関アレイ８５０に提供する。タグは、データキャッシュで使用されているタグと類似してもよい。タグは、例えば、物理アドレスであってもよいし、仮想メモリ識別子と組み合わせた仮想アドレスであってもよい。
【００６７】
相関アレイ８５０は、インデックス及びタグ情報を記憶してもよく、以下にさらに説明するように、この情報を使用してスレッドの相関値を計算してもよい。相関アレイ８５０は、これらの相関値を決定ユニット８６０に報告してもよい。決定ユニット８６０は、報告された相関値を使用して、ＳＩＭＤ０及びＳＩＭＤ１上でスレッドｔｈｒｅａｄ０、ｔｈｒｅａｄ１、ｔｈｒｅａｄ２、ｔｈｒｅａｄ３を実行するためにデータドリブンスケジューリングを決定してもよい。次に、スレッドディスパッチャ８４０は、データドリブンスケジュールに従って、ＳＩＭＤ０及びＳＩＭＤ１上での実行のためにスレッドをディスパッチすることができる。
【００６８】
図９は、スレッドｔｈｒｅａｄ０、ｔｈｒｅａｄ１、ｔｈｒｅａｄ２及びｔｈｒｅａｄ３の実行中のある時点における相関アレイ６５０の状態例を示す表９００である。例示的なシステム８００は、４つのスレッドの粒度でスケジューリングを行う。したがって、表９００は、スレッドｔｈｒｅａｄ０、ｔｈｒｅａｄ１、ｔｈｒｅａｄ２及びｔｈｒｅａｄ３のうち１つにそれぞれ対応する４つのキー９１０、９１０’、９１０’’、９１０’’’を含む。
【００６９】
各キー９１０、９１０’、９１０’’、９１０’’’は、対応するタグリスト（図示省略）及び寄与相関値９２０、９２０’、９２０’’、９２０’’’のセットを含む。寄与相関値９２０、９２０’、９２０’’、９２０’’’のセットは、スレッドｔｈｒｅａｄ０、ｔｈｒｅａｄ１、ｔｈｒｅａｄ２及びｔｈｒｅａｄ３の各ペアの相関を反映する。例えば、キー９１０は、ｔｈｒｅａｄ０に対する寄与相関値９２０のセットを記憶する。寄与相関値９２０のセットは、ｔｈｒｅａｄ０とｔｈｒｅａｄ１との間の相関に対応する寄与相関値Ｃ０１と、ｔｈｒｅａｄ０とｔｈｒｅａｄ２との間の相関に対応する寄与相関値Ｃ０２と、ｔｈｒｅａｄ０とｔｈｒｅａｄ３との間の相関に対応する寄与相関値Ｃ０３と、を記憶する。他のキー９１０’、９１０’’、９１０’’’の各々は、図９に反映される同様の寄与相関値９２０’、９２０’’、９２０’’’のセットを記憶する。相関情報が相関アレイ８５０に利用可能になる前には（例えば、方法３００のステップ３１０と同様に）、タグリストは空であってもよく、寄与相関値はゼロであってもよい。
【００７０】
スレッドの実行中のＳＩＭＤ０又はＳＩＭＤ１による新たなメモリ要求では、相関アレイ８５０は、メモリ要求の対応するインデックス及びタグ情報をキャッシュから受信する。インデックス及びタグ情報が表９００内のエントリと一致する場合には、対応する寄与相関値は、増加した相関を反映するようにインクリメント、増加、又は、変更されてもよい。例えば、相関アレイ８５０が、インデックスｔｈｒｅａｄ１及びタグｔａｇ３を受信し、ｔｈｒｅａｄ０のタグリストがｔａｇ３も含むように反映する場合には、ｔｈｒｅａｄ０とｔｈｒｅａｄ１との間の相関を反映する寄与相関値Ｃ０１を増加（例えば、１だけインクリメントされる）してもよい。
【００７１】
受信したインデックスが表９００のキーと一致するが、受信したタグがタグリスト内の何れのタグとも一致しない場合、受信したタグをそのキーのタグリストに挿入してもよい。受信したインデックスが表９００のキーと一致しないが、受信したタグがタグリスト内のタグと一致する場合、新たなキーをそのインデックスに追加してもよく、タグが一致する場合には他のキーに対する相関が調整され得る。
【００７２】
ｔｈｒｅａｄ０、ｔｈｒｅａｄ１、ｔｈｒｅａｄ２及びｔｈｒｅａｄ３がＳＩＭＤ０及びＳＩＭＤ１上での実行を終了した後、寄与相関値Ｃ０１及びＣ１０を合計（又は別の方法で組み合わせる）して、ｔｈｒｅａｄ０とｔｈｒｅａｄ１との間の相関を反映する相関値ｃ０１が決定されてもよい。他の一致する寄与相関値を同様に合計して、他のスレッドペアの相関値を求めてもよい。例えば、ｃ０２は、寄与相関値Ｃ０２及びＣ２０を合計する等によって計算されたｔｈｒｅａｄ０及びｔｈｒｅａｄ２の相関値であってもよい。これらの相関値ｃ０１、ｃ０２、ｃ０３、ｃ１２、ｃ１３、ｃ２３は、決定ユニット６６０に報告されてもよい。
【００７３】
ｔｈｒｅａｄ０、ｔｈｒｅａｄ１、ｔｈｒｅａｄ２及びｔｈｒｅａｄ３がＳＩＭＤ０及びＳＩＭＤ１上での実行を終了するまで待つのではなく、一定の期間（例えば、１，０００プロセッサクロックサイクル）後に寄与相関値が合計及び／又は報告されてもよいことに留意されたい。したがって、相関値は、実行の完了前、又は、スレッドｔｈｒｅａｄ０、ｔｈｒｅａｄ１、ｔｈｒｅａｄ２及びｔｈｒｅａｄ３のいくつかの実行後に計算されてもよい。これにより、動的なスケジューリング、及び／又は、より高い解像度のデータに基づくスケジューリングが可能になる。
【００７４】
図８に戻ると、決定ユニット８６０は、報告された相関値ｃ０１、ｃ０２、ｃ０３・・・に基づいて、次の４つのスレッド（ｔｈｒｅａｄ０、ｔｈｒｅａｄ１、ｔｈｒｅａｄ２及びｔｈｒｅａｄ３）の発行順（すなわち、データドリブンスケジュール）を決定してもよい。表３は、決定ユニット８６０がこの決定を行うための部分的なアルゴリズムの一例を反映する疑似コードを示す。スレッドディスパッチャ８４０は、決定ユニット８６０からデータドリブンスケジュールを受信し、データドリブンスケジュールに従ってスレッドをＣＵ０及びＣＵ１にディスパッチする。いくつかの実装では、スレッドディスパッチャ８４０は、スケジュールが変更されたという決定に基づいて、そのスケジュールを更新するだけでよい。いくつかの実装では、スケジュールが変更されたという条件で、ＳＩＭＤ０及びＳＩＭＤ１上で現在実行中のスレッドが一時中断されてもよく、コンテキストが保存されてもよく、更新されたスケジュールがスレッドに適用されてもよく（すなわち、スレッドが、異なるＳＩＭＤ及び／又は実行時間に再度割り当てられてもよい）、コンテキストが復元されてもよく、更新されたスケジュールで実行が再開されてもよい。
【表３】
2019501470.tif 000005
【００７５】
図１０は、データドリブンスケジューリングを実施する例示的なシステム１０００を示すブロック図である。一実装例では、システム１０００は、プロセッサ１０２の機能であってもよい。システム１０００は、処理ユニット１０１０と、処理ユニット１０１０によって共有されるキャッシュメモリ１０２０と、データドリブンスケジューラ１０３０と、スレッドディスパッチャ１０４０と、を含む。システム１０００の例では、処理ユニット１０１０は、４つのコア（この場合、計算ユニットＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３）を含む。データドリブンスケジューラ１０３０は、相関アレイ１０５０と決定ユニット１０６０とを含み、スレッドディスパッチャレベルのスケジュールを決定する。
【００７６】
この例では、キャッシュメモリ１０２０はＬ２キャッシュであるが、キャッシュメモリ１０２０は、計算ユニットＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３によって共有される任意の適切なレベルのキャッシュメモリ又は別の共有メモリであってもよいことに留意されたい。キャッシュメモリ１０２０は、計算ユニットＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３によって共有される。
【００７７】
データドリブンスケジューラ１０３０は、処理ユニット１０１０上での実行のためにウェーブをスケジューリングする。相関アレイ１０５０は、ウェーブ間の相関を計算する。決定ユニット１０６０は、特定の時間に処理ユニット１０１０のうち特定の１つにディスパッチするウェーブを決定する。
【００７８】
相関データがスケジューリングに利用可能になる前に、データドリブンスケジューラ１０３０は、デフォルト（例えば、データドリブンではない）スケジューリングパターンを使用して、計算ユニットＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３上での実行のためにウェーブをスケジューリングする。このデフォルトパターンは、ラウンドロビンパターンであってもよい。例示的なシステム１０００では、８つのウェーブの粒度でスケジューリングが行われる。したがって、最初の８つのスレッドがｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３、ｗａｖｅ４、ｗａｖｅ５、ｗａｖｅ６及びｗａｖｅ７と呼ばれる場合、ラウンドロビン方式での最初の８つのウェーブのスケジューリングは、ｗａｖｅ０＝ＣＵ０、ｗａｖｅ１＝ＣＵ１、ｗａｖｅ２＝ＣＵ２、ｗａｖｅ３＝ＣＵ３、ｗａｖｅ４＝ＣＵ０、ｗａｖｅ５＝ＣＵ１、ｗａｖｅ６＝ＣＵ２、ｗａｖｅ７＝ＣＵ３となる。次に、スレッドディスパッチャ１０４０は、デフォルトスケジュールに従って、ＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３上での実行のためにウェーブをディスパッチする。
【００７９】
ＣＵ０、ＣＵ１、ＣＵ２及び／又はＣＵ３からキャッシュ１０２０への新たなメモリ要求に応じて、キャッシュ１０２０は、メモリ要求に対応するインデックス及びキャッシュタグを相関アレイ１０５０に転送することができる。インデックスは、要求しているウェーブの識別情報（例えば、ウェーブＩＤ）に対応してもよく、タグは、要求されたメモリアドレス、データマスク及び／又は補助情報を含んでもよい。したがって、キャッシュ１０２０は、現在実行中のウェーブが必要とするメモリアクセスに関する情報を相関アレイ１０５０に提供する。タグは、物理アドレスであってもよいし、仮想メモリ識別子と組み合わせた仮想アドレスであってもよい。
【００８０】
相関アレイ１０５０は、インデックス及びタグ情報を記憶してもよく、この情報を使用してウェーブの相関値を計算してもよい。相関アレイ１０５０は、これらの相関値を決定ユニット１０６０に報告してもよい。決定ユニット１０６０は、報告された相関値を使用して、ＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３上でウェーブｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３、ｗａｖｅ４、ｗａｖｅ５、ｗａｖｅ６及びｗａｖｅ７を実行するためにデータドリブンスケジューリングを決定してもよい。次に、ウェーブディスパッチャ１０４０は、データドリブンスケジュールに従って、ＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３上での実行のためにウェーブをディスパッチすることができる。
【００８１】
図１１は、ウェーブｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３、ｗａｖｅ４、ｗａｖｅ５、ｗａｖｅ６及びｗａｖｅ７の実行中のある時点における相関アレイ６５０の状態例を示す表１１００である。例示的なシステム１０００は、８つのウェーブの粒度でスケジューリングを行う。したがって、表１１００は、ウェーブｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３、ｗａｖｅ４、ｗａｖｅ５、ｗａｖｅ６及びｗａｖｅ７のうち１つにそれぞれ対応する８つのキー１１１０ａ、１１１０ｂ、１１１０ｃ、１１１０ｄ、１１１０ｅ、１１１０ｆ、１１１０ｇ、１１１０ｈを含む。
【００８２】
各キー１１１０ａ、１１１０ｂ、１１１０ｃ、１１１０ｄ、１１１０ｅ、１１１０ｆ、１１１０ｇ、１１１０ｈは、対応するタグリスト（図示省略）及び寄与相関値１１２０ａ、１１２０ｂ、１１２０ｃ、１１２０ｄ、１１２０ｅ、１１２０ｆ、１１２０ｇ、１１２０ｈのセットを含む。寄与相関値１１２０ａ、１１２０ｂ、１１２０ｃ、１１２０ｄ、１１２０ｅ、１１２０ｆ、１１２０ｇ、１１２０ｈのセットは、ウェーブｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３、ｗａｖｅ４、ｗａｖｅ５、ｗａｖｅ６及びｗａｖｅ７の各ペアの相関を反映する。例えば、キー１１１０ａは、ｗａｖｅ０に対する寄与相関値１１２０ａのセットを記憶する。寄与相関値１１２０ａのセットは、ｗａｖｅ０とｗａｖｅ１との間の相関に対応する寄与相関値Ｃ０１と、ｗａｖｅ０とｗａｖｅ２との間の相関に対応する寄与相関値Ｃ０２と、ｗａｖｅ０とｗａｖｅ３との間の相関に対応する寄与相関値Ｃ０３と、等を記憶する。他のキー１１１０ｂ、１１１０ｃ、１１１０ｄ、１１１０ｅ、１１１０ｆ、１１１０ｇ、１１１０ｈの各々は、図１１に反映される同様の寄与相関値１１２０ｂ、１１２０ｃ、１１２０ｄ、１１２０ｅ、１１２０ｆ、１１２０ｇ、１１２０ｈのセットを記憶する。相関情報が相関アレイ１０５０に利用可能になる前には（例えば、方法３００のステップ３１０と同様に）、タグリストは空であってもよく、寄与相関値はゼロであってもよい。
【００８３】
ウェーブの実行中のＣＵ０、ＣＵ１、ＣＵ２又はＣＵ３による新たなメモリ要求では、相関アレイ１０５０は、メモリ要求の対応するインデックス及びタグ情報をキャッシュから受信する。インデックス及びタグ情報が表１１００内のエントリと一致する場合には、対応する寄与相関値は、増加した相関を反映するようにインクリメント、増加、又は、変更されてもよい。例えば、相関アレイ１０５０が、インデックスｗａｖｅ１及びタグｔａｇ３を受信し、ｗａｖｅ０のタグリストがｔａｇ３も含むように反映する場合には、ｗａｖｅ０とｗａｖｅ１との間の相関を反映する寄与相関値Ｃ０１を増加（例えば、１だけインクリメントされる）してもよい。
【００８４】
受信したインデックスが表１１００のキーと一致するが、受信したタグがタグリスト内の何れのタグとも一致しない場合、受信したタグをそのキーのタグリストに挿入してもよい。受信したインデックスが表１１００のキーと一致しないが、受信したタグがタグリスト内のタグと一致する場合、新たなキーをそのインデックスに追加してもよく、タグが一致する場合には他のキーに対する相関が調整され得る。
【００８５】
ｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３、ｗａｖｅ４、ｗａｖｅ５、ｗａｖｅ６及びｗａｖｅ７がＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３上での実行を終了した後、寄与相関値Ｃ０１及びＣ１０を合計（又は別の方法で組み合わせる）して、ｗａｖｅ０とｗａｖｅ１との間の相関を反映する相関値ｃ０１が決定されてもよい。他の一致する寄与相関値を同様に合計して、他のスレッドペアの相関値を求めてもよい。例えば、ｃ０２は、寄与相関値Ｃ０２及びＣ２０を合計する等によって計算されたｗａｖｅ０及びｗａｖｅ２の相関値であってもよい。これらの相関値ｃ０１、ｃ０２、ｃ０３、ｃ０４、ｃ０５、ｃ０６、ｃ０７、ｃ１２、ｃ１３、ｃ１４、ｃ１５、ｃ１６、ｃ１７、ｃ２３、ｃ２４、ｃ２５、ｃ２６、ｃ２７、ｃ３４、ｃ３５、ｃ３６、ｃ３７、ｃ４５、ｃ４６、ｃ４７、ｃ５６、ｃ５７、ｃ６７は、決定ユニット６６０に報告されてもよい。
【００８６】
ｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３、ｗａｖｅ４、ｗａｖｅ５、ｗａｖｅ６及びｗａｖｅ７がＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３上での実行を終了するまで待つのではなく、一定の期間（例えば、１，０００プロセッサクロックサイクル）後に寄与相関値が合計及び／又は報告されてもよいことに留意されたい。したがって、相関値は、実行の完了前、又は、ＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３のいくつかの実行後に計算されてもよい。これにより、動的なスケジューリング、及び／又は、より高い解像度のデータに基づくスケジューリングが可能になる。
【００８７】
図１０００に戻ると、決定ユニット１０６０は、報告された相関値ｃ０１、ｃ０２、ｃ０３、ｃ０４、ｃ０５、ｃ０６、ｃ０７、ｃ１２、ｃ１３、ｃ１４、ｃ１５、ｃ１６、ｃ１７、ｃ２３、ｃ２４、ｃ２５、ｃ２６、ｃ２７、ｃ３４、ｃ３５、ｃ３６、ｃ３７、ｃ４５、ｃ４６、ｃ４７、ｃ５６、ｃ５７、ｃ６７に基づいて、次の８つのウェーブ（ｗａｖｅ０、ｗａｖｅ１、ｗａｖｅ２、ｗａｖｅ３、ｗａｖｅ４、ｗａｖｅ５、ｗａｖｅ６及びｗａｖｅ７）の発行順（すなわち、データドリブンスケジュール）を決定してもよい。表４は、決定ユニット１０６０がこの決定を行うための部分的なアルゴリズムの一例を示す。ウェーブディスパッチャ１０４０は、決定ユニット１０６０からデータドリブンスケジュールを受信し、データドリブンスケジュールに従ってスレッドをＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３にディスパッチする。いくつかの実装では、ウェーブディスパッチャ１０４０は、スケジュールが変更されたという決定に基づいて、そのスケジュールを更新するだけでよい。いくつかの実装では、スケジュールが変更されたという条件で、ＣＵ０、ＣＵ１、ＣＵ２及びＣＵ３上で現在実行中のスレッドグループが一時中断されてもよく、コンテキストが保存されてもよく、更新されたスケジュールがウェーブに適用されてもよく（すなわち、ウェーブが、異なる計算ユニット及び／又は実行時間に再度割り当てられてもよい）、コンテキストが復元されてもよく、更新されたスケジュールで実行が再開されてもよい。
【表４】
2019501470.tif 000006
【００８８】
これらの実装又は他の実装の何れにおいても、データドリブンスケジューラは、例えば、アイドル状態のときに、クロックゲーティング、パワーゲーティング、又は、異なる適切な省電力メカニズムの対象となる場合があることに留意されたい。データドリブンスケジューラは、例えば、新たなシェーダが実行されるまでアイドル状態を維持することができる。
【００８９】
これらの実装又は他の実装の何れにおいても、タグリストは、例えば検索を容易にするために昇順又は降順でソートされてもよく、圧縮又は非圧縮されてもよいことにさらに留意されたい。
【００９０】
本明細書の開示に基づいて多くの変形が可能であることを理解されたい。特徴及び要素は、特定の組み合わせで上記に説明されているが、各特徴又は要素は、他の特徴及び要素を伴わずに単独に使用されてもよいし、他の特徴及び要素を伴う又は伴わない様々な組み合わせで使用されてもよい。
【００９１】
提供される方法は、汎用コンピュータ、プロセッサ又はプロセッサコアで実装されてもよい。適切なプロセッサには、一例として、汎用プロセッサ、専用プロセッサ、従来のプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、複数のマイクロプロセッサ、ＤＳＰコアに関連する１つ以上のマイクロプロセッサ、コントローラ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）回路、他のタイプの集積回路（ＩＣ）、及び／又は、状態機械を含む。かかるプロセッサは、処理されたハードウェア記述言語（ＨＤＬ）命令の結果と、ネットリスト（コンピュータ可読媒体上に記憶することができる命令等）を含む他の中間データと、を使用して製造プロセスを構成することによって製造されてもよい。かかる処理の結果は、実施形態の態様を実施するプロセッサを製造するために半導体製造プロセスで使用されるマスクワークであってもよい。
【００９２】
本明細書で提供される方法又はフローチャートは、汎用コンピュータ又はプロセッサによる実行のために非一時的なコンピュータ可読記憶媒体に組み込まれたコンピュータプログラム、ソフトウェア又はファームウェアで実装されてもよい。非一時的なコンピュータ可読記憶媒体の例には、読み取り専用メモリ（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、レジスタ、キャッシュメモリ、半導体メモリデバイス、内蔵ハードディスク及びリムーバブルディスク等の磁気媒体、光磁気媒体、ＣＤ−ＲＯＭディスク及びデジタル多目的ディスク（ＤＶＤ）等の光学媒体が含まれる。
【図１】
2019501470.tif 000007
【図２】
2019501470.tif 000008
【図３】
2019501470.tif 000009
【図４】
2019501470.tif 000010
【図５】
2019501470.tif 000011
【図６】
2019501470.tif 000012
【図７】
2019501470.tif 000013
【図８】
2019501470.tif 000014
【図９】
2019501470.tif 000015
【図１０】
2019501470.tif 000016
【図１１】
2019501470.tif 000017
【手続補正書】
【提出日】平成30年9月5日(2018.9.5)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プロセッサの複数の計算コアのデータドリブンスケジューリングの方法であって、
デフォルトスケジュールに従って、複数のスレッドを前記複数の計算コア上で実行することと、
前記実行に基づいて前記複数のスレッドを分析して、前記複数のスレッド間の相関を決定することと、
前記相関に基づいて、データドリブンスケジュールを生成することと、
前記データドリブンスケジュールに従って、前記複数のスレッドを前記複数の計算コア上で実行することと、を含む、
方法。
【請求項２】
前記相関は、前記複数のスレッドのサブセット間のメモリの再使用を含む、請求項１の方法。
【請求項３】
前記相関は、前記複数のスレッドのサブセット間の参照局所性を含む、請求項１の方法。
【請求項４】
前記デフォルトスケジュールは、ラウンドロビンスケジュールを含む、請求項１の方法。
【請求項５】
前記複数のスレッドを分析して前記相関を決定することは、
データドリブンスケジューリング回路が、前記計算コア上での前記複数のスレッドの少なくとも一部の実行に起因する前記計算コアによるメモリアクセスに関する情報を受信することと、
前記情報に基づいて前記相関を得ることと、を含む、
請求項１の方法。
【請求項６】
メモリは前記複数の計算コア間で共有される、請求項５の方法。
【請求項７】
メモリはキャッシュメモリを備える、請求項５の方法。
【請求項８】
前記データドリブンスケジュールは、前記複数のスレッドの各々が前記計算コア上での実行を完了した後に生成される、請求項１の方法。
【請求項９】
前記データドリブンスケジュールは、前記複数のスレッドの前記計算コア上での実行が一定期間進行した後に生成される、請求項１の方法。
【請求項１０】
前記データドリブンスケジュールは、前記複数のスレッドの全てが前記計算コア上での実行を完了する前に生成される、請求項１の方法。
【請求項１１】
データドリブンスケジュールのために構成されたプロセッサであって、
複数の計算コアと、
各計算コアによって共有されるメモリと、
デフォルトスケジュールに従って、複数のスレッドを、前記複数の計算コア上で実行するためにディスパッチするように構成されたディスパッチ回路と、
前記実行に基づいて前記複数のスレッドを分析して、前記複数のスレッド間の相関を決定するように構成された相関回路と、
前記相関に基づいてデータドリブンスケジュールを決定するように構成されたスケジューリング回路と、を備え、
前記ディスパッチ回路は、前記複数のスレッドを、前記データドリブンスケジュールに従って前記複数の計算コア上で実行するためにディスパッチするように構成されている、
プロセッサ。
【請求項１２】
前記相関回路は、前記複数のスレッドのサブセット間のメモリの再使用に基づいて前記相関を決定するように構成されている、請求項１１のプロセッサ。
【請求項１３】
前記相関回路は、前記複数のスレッドのサブセット間の参照局所性に基づいて前記相関を決定するように構成されている、請求項１１のプロセッサ。
【請求項１４】
前記デフォルトスケジュールは、ラウンドロビンスケジュールを含む、請求項１１のプロセッサ。
【請求項１５】
前記相関回路は、
前記計算コア上での前記複数のスレッドの少なくとも一部の実行に起因する前記計算コアによるメモリアクセスに関する情報を受信することと、
前記情報に基づいて前記相関を得ることと、を行うように構成されている、
請求項１１のプロセッサ。
【請求項１６】
メモリは前記複数の計算コア間で共有される、請求項１５のプロセッサ。
【請求項１７】
メモリはキャッシュメモリを備える、請求項１５のプロセッサ。
【請求項１８】
前記プロセッサは、回路を備え、
前記回路は、
前記データドリブンスケジュールが前記デフォルトスケジュールと異なるか否かを判別し、
前記データドリブンスケジュールが前記デフォルトスケジュールと異なる場合に、前記計算コアの実行を一時中断し、現在のコンテキストを保存し、前記データドリブンスケジュールに従って、前記複数のスレッドをディスパッチするように構成されている、
請求項１１のプロセッサ。
【請求項１９】
前記データドリブンスケジュールは、前記複数のスレッドの各々が前記計算コア上での実行を完了した後に生成される、請求項１１のプロセッサ。
【請求項２０】
前記データドリブンスケジュールは、前記複数のスレッドの前記計算コア上での実行が一定期間進行した後に生成される、請求項１１のプロセッサ。
【国際調査報告】
2019501470.tif 000018
2019501470.tif 000019