(57)【特許請求の範囲】
【請求項１】
第１のプロセッサと第２のプロセッサとの間で関数コールバック要求を実現するためのシステムであって、
前記第１及び第２のプロセッサに結合された共有仮想メモリ（SVM）であり、前記第１のプロセッサと前記第２のプロセッサとの間で前記コールバック要求を通信するための少なくとも１つの両端キュー（Deque）を記憶するSVMと、
前記第１のプロセッサの実行ユニット（EU）であり、前記EUは、前記Dequeのうち第１のDequeの一端に関連し、前記コールバック要求を前記第１のDequeにプッシュするEUと、
前記第２のプロセッサ上で実行する要求ハンドラスレッドであり、前記第１のDequeの対応する他端から前記コールバック要求の１つをポップし、前記ポップされたコールバック要求により指定された関数を実行し、前記関数の完了に応じて前記EUへの完了信号を生成する要求ハンドラスレッドと
を含み、
前記完了信号は、前記コールバック要求が完了した後に呼び出される前記EU上のカーネルをトリガーし、前記カーネルは、前に保存されたスタック変数を復旧する、システム。
【請求項２】
前記コールバック要求は、前記第２のプロセッサにより実行される前記関数を指定するための関数ポインタと、前記実行される関数に提供されるデータ及び前記実行された関数により生成されて前記EUに提供される結果について前記SVMにおける位置を指定するための引数ポインタとを含む、請求項１に記載のシステム。
【請求項３】
前記要求ハンドラスレッドは、前記第１のDequeが空であることを検出したことに応じて、第２のDequeから前記コールバック要求の１つを更にポップし、前記第２のDequeは、第２のEUに関連する、請求項１に記載のシステム。
【請求項４】
前記Dequeは、前記EU及び前記要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、前記SVMにおいて固定される、請求項１乃至３のうちいずれか１項に記載のシステム。
【請求項５】
前記完了信号は、前記SVMにおいて完了フラグを設定し、前記EUは、前記完了フラグを更にポーリングする、請求項１乃至３のうちいずれか１項に記載のシステム。
【請求項６】
前記要求ハンドラスレッドは、前記Dequeのいずれかから前記コールバック要求の１つをポップすることに失敗したことに応じて、更にスリープする、請求項１乃至３のうちいずれか１項に記載のシステム。
【請求項７】
前記スリープは、Monitor／Mwait命令の実行を含む、請求項６に記載のシステム。
【請求項８】
前記第１のプロセッサは、グラフィック処理装置（GPU）であり、前記第２のプロセッサは、汎用中央処理装置（CPU）である、請求項１乃至３のうちいずれか１項に記載のシステム。
【請求項９】
第１のプロセッサと第２のプロセッサとの間での関数コールバック要求のための方法であって、
前記第１のプロセッサの実行ユニット（EU）により、前記コールバック要求を、前記EUに関連する第１の両端キュー（Deque）の一端にプッシュするステップであり、前記Dequeは、前記第１のプロセッサと前記第２のプロセッサとの間で前記コールバック要求を通信するために、前記第１及び第２のプロセッサに結合された共有仮想メモリ（SVM）に記憶されるステップと、
前記第２のプロセッサ上で実行する要求ハンドラスレッドにより、前記第１のDequeの対応する他端から前記コールバック要求の１つをポップするステップと、
前記要求ハンドラスレッドにより、前記ポップされたコールバック要求により指定された関数を実行するステップと、
前記要求ハンドラスレッドにより、前記関数の完了に応じて前記EUへの完了信号を生成するステップと
を含み、
前記完了信号を生成するステップは、前記コールバック要求が完了した後に呼び出される前記EU上のカーネルをトリガーするステップであり、前記カーネルは、前に保存されたスタック変数を復旧するステップを更に含む、方法。
【請求項１０】
前記コールバック要求は、前記第２のプロセッサにより実行される前記関数を指定するための関数ポインタと、前記実行される関数に提供されるデータ及び前記実行された関数により生成されて前記EUに提供される結果について前記SVMにおける位置を指定するための引数ポインタとを含む、請求項９に記載の方法。
【請求項１１】
前記要求ハンドラスレッドにより、前記第１のDequeが空であることを検出したことに応じて、第２のDequeから前記コールバック要求の１つをポップするステップであり、前記第２のDequeは、第２のEUに関連するステップを更に含む、請求項９に記載の方法。
【請求項１２】
前記EU及び前記要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、前記SVMにおいて前記Dequeを固定するステップを更に含む、請求項９乃至１１のうちいずれか１項に記載の方法。
【請求項１３】
前記完了信号を生成するステップは、前記EUによりポーリングするために、前記SVMにおいて完了フラグを設定するステップを更に含む、請求項９乃至１１のうちいずれか１項に記載の方法。
【請求項１４】
前記要求ハンドラスレッドにより、前記Dequeのいずれかから前記コールバック要求の１つをポップすることに失敗したことに応じて、スリープするステップを更に含む、請求項９乃至１１のうちいずれか１項に記載の方法。
【請求項１５】
前記スリープするステップは、Monitor／Mwait命令を実行するステップを更に含む、請求項１４に記載の方法。
【請求項１６】
プロセッサにより実行された場合、第１のプロセッサと第２のプロセッサとの間での関数コールバック要求のための以下の動作を生じる命令を含むコンピュータプログラムであって、前記動作は、
前記第１のプロセッサの実行ユニット（EU）により、前記コールバック要求を、前記EUに関連する第１の両端キュー（Deque）の一端にプッシュするステップであり、前記Dequeは、前記第１のプロセッサと前記第２のプロセッサとの間で前記コールバック要求を通信するために、前記第１及び第２のプロセッサに結合された共有仮想メモリ（SVM）に記憶されるステップと、
前記第２のプロセッサ上で実行する要求ハンドラスレッドにより、前記第１のDequeの対応する他端から前記コールバック要求の１つをポップするステップと、
前記要求ハンドラスレッドにより、前記ポップされたコールバック要求により指定された関数を実行するステップと、
前記要求ハンドラスレッドにより、前記関数の完了に応じて前記EUへの完了信号を生成するステップと
を含み、
前記完了信号を生成するステップは、前記コールバック要求が完了した後に呼び出される前記EU上のカーネルをトリガーするステップであり、前記カーネルは、前に保存されたスタック変数を復旧するステップを更に含む、コンピュータプログラム。
【請求項１７】
前記コールバック要求は、前記第２のプロセッサにより実行される前記関数を指定するための関数ポインタと、前記実行される関数に提供されるデータ及び前記実行された関数により生成されて前記EUに提供される結果について前記SVMにおける位置を指定するための引数ポインタとを含む、請求項１６に記載のコンピュータプログラム。
【請求項１８】
前記要求ハンドラスレッドにより、前記第１のDequeが空であることを検出したことに応じて、第２のDequeから前記コールバック要求の１つをポップするステップであり、前記第２のDequeは、第２のEUに関連するステップを更に含む、請求項１６に記載のコンピュータプログラム。
【請求項１９】
前記EU及び前記要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、前記SVMにおいて前記Dequeを固定するステップを更に含む、請求項１６乃至１８のうちいずれか１項に記載のコンピュータプログラム。
【請求項２０】
前記完了信号を生成するステップは、前記EUによりポーリングするために、前記SVMにおいて完了フラグを設定するステップを更に含む、請求項１６乃至１８のうちいずれか１項に記載のコンピュータプログラム。
【請求項２１】
前記要求ハンドラスレッドにより、前記Dequeのいずれかから前記コールバック要求の１つをポップすることに失敗したことに応じて、スリープするステップを更に含む、請求項１６乃至１８のうちいずれか１項に記載のコンピュータプログラム。
【請求項２２】
前記スリープするステップは、Monitor／Mwait命令を実行するステップを更に含む、請求項２１に記載のコンピュータプログラム。
【請求項２３】
請求項１６乃至２２のうちいずれか１項に記載のコンピュータプログラムを記憶した少なくとも１つのコンピュータ読み取り可能記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
この開示は、補助プロセッサ（例えば、グラフィック処理装置（GPU：Graphics  Processing  Unit））から中央処理装置（CPU：Central  Processing  Unit）への関数コールバック要求に関し、より具体的にはこのようなコールバック要求のための効率的な改善に関する。
【背景技術】
【０００２】
異種処理システム（例えば、チップ上にCPU及びGPU（又は補助プロセッサ若しくはアクセラレータ）を組み合わせたプロセッサ）は、ますます一般的になっている。グラフィック処理を実行することに加えて、GPUは、比較的並列インテンシブである計算タスクをCPUからオフロードするために使用されることがある。GPUアーキテクチャは、典型的には並列計算に向いているため、GPUは、CPUに比べて、これらの種類のタスクにより高い性能及びより低いエネルギー消費を提供することができる可能性がある。CPUからGPUへの関数呼び出しのサポートは、ハードウェア及びソフトウェアの双方において、まますます利用可能になってきている。
【０００３】
これらの異種プロセッサ及びプログラミングフレームワークは、CPUがGPUに作業をオフロードすることを可能にし得るが、GPUが作業をCPUにオフロードし戻すための対応する機構は典型的には存在しない。このような機能は、例えば、(1)GPU上で実行されないことがあるオペレーティングシステム関数の呼び出し、(2)GPUにまだ移植されていないコードの呼び出し、及び(3)並列の実行にあまり適していない比較的順次的なコード又は不規則な制御パスに従うコードの実行を含む多くの状況に有用になることがある。
【図面の簡単な説明】
【０００４】
特許請求の対象物の実施例の特徴及び利点は、以下の詳細な説明と共に明らかになる。図面を参照すると、同様の符号は同様の部分を示す。
【図１】この開示に従った例示的な実施例のトップレベルのシステム図を示す。
【図２】この開示に従った例示的な実施例のブロック図を示す。
【図３】この開示に従った例示的な実施例の動作のフローチャートを示す。
【図４】この開示に従った他の例示的な実施例の動作のフローチャートを示す。
【図５】この開示に従った他の例示的な実施例の動作のフローチャートを示す。
【図６】この開示に従った他の例示的な実施例の動作のフローチャートを示す。
【図７】この開示に従った他の例示的な実施例のプラットフォームのシステム図を示す。
【発明を実施するための形態】
【０００５】
以下の詳細な説明は、例示的な実施例を参照して行われるが、その多数の代案、変更及び変形が当業者に明らかになる。
【０００６】
一般的に、この開示は、低減した待ち時間を含む改善した効率を備えた、補助プロセッサ（例えば、GPU又は他の種類のアクセラレータ）と中央処理装置（CPU：Central  Processing  Unit）との間の関数呼び出し及びコールバックのためのシステム、デバイス、方法及びコンピュータ読み取り可能媒体を提供する。異種プロセッサは、共有仮想メモリ（SVM：shared  virtual  memory）にアクセスするように構成された１つ以上のGPU及びCPUを含んでもよい。CPUは、作業をGPUにオフロードするために、GPUへの関数呼び出し要求を生成してもよい。次に、GPUは、その作業負荷の選択された部分を実行するために、CPUへの関数コールバック要求を生成してもよい。以下に更に詳細に説明するように、コールバック要求は、SVMに記憶された両端キュー（double-ended  queue）を通じて通信されてもよい。コールバック要求は、CPU上で実行されるためのコールバック関数へのポインタ（例えば、メモリアドレス）と、コールバック関数に提供されるデータ及び／コールバック関数により戻されるデータへのポインタと、シグナリングフラグ及び継続カーネル（continuation  kernel）を含む１つ以上のコールバック完了機構に関する更なる情報とを含んでもよい。
【０００７】
図１は、この開示に従った１つの例示的な実施例のトップレベルのシステム図100を示している。１つ以上のGPU（又はGPUコア）102は、１つ以上のCPU104と仮想メモリ（SVM）106を共有するように構成される。GPU102及びCPU104は、異種プロセッサ又はシステム・オン・チップ（SoC：system  on  a  chip）の一部でもよく、作業は、プロセッサの間で供給されてもよい。例えば、より汎用のプロセッサであるCPUは、比較的順次的（又は不規則）なフローで実行するタスクを扱うのにより適する可能性があり、より並列のアーキテクチャによって設計されたGPUは、並列計算タスクを扱うのにより適する可能性がある。CPU104は、GPUアーキテクチャに適した作業をGPUにオフロードするために、GPU102への関数呼び出し要求を生成するように構成されてもよい。GPU102は、CPUアーキテクチャにより適したその作業負荷の選択された部分を実行するために、CPU104への関数コールバック要求を生成するように構成されてもよい。コールバック要求の完了時に、CPU104は、要求を開始したGPU102への完了信号を生成してもよい。
【０００８】
SVM106は、GPUがCPUにより行われた更新を見ることができ、その逆も見ることができるように、CPU104及びGPU102がデータ構造を含むポインタをトランスペアレントに共有し、メモリ整合性を提供することを可能にするように構成されてもよい。SVM106はまた、共有メモリへのアクセスを連携させ、CPU104とGPU102との間の競合を妨げるために、アトミック操作及びフェンス操作を提供するように構成されてもよい。
【０００９】
コールバック要求及び完了信号は、SVM106に記憶された両端キュー（Deque）108を通じて通信されてもよい。キューは、複数のデータエレメントを保持するように構成された一種のデータ構造である。両端キュー（又はDeque）は、データエレメントがキューの先端又は末端のいずれかに追加又はいずれかから削除され得るように構成されたキューである。Dequeの先端は、「フロント」又は「トップ」エンドと呼ばれてもよく、末端は、「バック」又は「ボトム」エンドと呼ばれてもよい。先端及び末端の名称は、単にDequeの動作の記述における便宜的な基準点として使用されており、固定的な物理位置を示すものではない。言い換えると、先端及び末端という用語は、開示のいずれかの実施例の意味又は動作を変更することなく、以下の説明を通じて交換されてもよい。いくつかの実施例では、Dequeは、必要に応じてより効率的なサイズ調整を可能にするために、サーキュラバッファ又はリングバッファとして実現されてもよい。
【００１０】
データをDequeに追加（又は書き込む）動作は、データをDequeの一端に「プッシュ」することと呼ばれてもよい。Dequeからデータを削除（又は読み取る）動作は、Dequeの他端からデータを「ドロップ」することと呼ばれてもよい。以下に更に詳細に説明するように、GPU102は、Deque108にコールバック要求をプッシュしてもよく、CPUは、実行のためにこれらをポップしてもよい。
【００１１】
図２は、この開示に従った１つの例示的な実施例のブロック図200を示しており、図１のシステムがより詳細に示されている。GPU102は、いずれかの数のコア又は実行ユニット（EU：execution  unit）102a、102bを含むように示されており、これらは、例えば、並列でタスクを実行するように構成されてもよい。これらのタスクは、作業をCPUからGPUにオフロードすることを意図するCPU104からの関数呼び出しに関連してもよい。次に、GPUコア又はEU102上で実行するタスクは、CPU104への関数コールバックを要求してもよい。
【００１２】
CPU104は、CPUプロセッサ上で実行するいずれかの数のコールバック要求ハンドラスレッド（コールバックワーカースレッドとも呼ばれる）202a、202bを含むように示されている。共有仮想メモリ（SVM）106は、いずれかの数のDeque108a、108bを記憶するように構成されてもよいが、競合を回避して待ち時間を低減するために、典型的には、GPUコア毎に１つのDequeが存在し、Deque毎に１つの要求ハンドラスレッドが存在する。いくつかの実施例では、SVM106はまた、完了フラグ206a、206bを記憶するように構成されてもよい。特定のコア（例えば、102a）上で実行するGPUタスクは、コールバック要求をそのコア108aに関連するDequeにプッシュすることにより、関数コールバックをCPU104に要求してもよい。コールバック要求は、CPU上で実行されるコールバック関数へのポインタと、関数の引数へのポインタとを含んでもよい。引数ポインタは、典型的には、CPUが戻り結果を書き込み得る１つ以上のメモリ位置を含む、複数のデータアイテム及びパラメータを含むデータ構造へのポインタでもよい。
【００１３】
CPU上の要求ハンドラスレッド202aは、そのDequeからコールバック要求を順次にポップし、そのコールバック要求に関連する関数を実行してもよい。そのコールバック要求関数の完了時に、要求ハンドラスレッドは、完了信号を生成してもよい。いくつかの実施例では、完了信号は、SVM106において完了フラグ206a（ブール変数）を設定するためのアトミック操作を実行することにより成されてもよい。完了フラグ206は、コールバック要求においてポインタにより指定されてもよい。GPUタスクは、例えば他のタスクを実行する間に、いつコールバック要求が完了したかを決定するために、定期的に（アトミック操作を使用して）完了フラグ206aを監視してもよい。したがって、GPUは、CPUによるコールバックの実行中にストールしない。
【００１４】
いくつかの実施例では、要求ハンドラスレッド202は、アイドルになったときに（例えば、自分のDequeが空になったときに）、相互に作業を奪い取ってもよい。これは、１つ以上のコールバック要求をポップするために、別のDequeをランダムに選択することにより成されてもよい。このような作業の奪い取り（work  stealing）は、複数の要求ハンドラスレッドの間で作業をより効率的に分配し得る。
【００１５】
いくつかの実施例では、効率は、CPU又はGPUのいずれかによるページフォールトを回避するために、SVM106においてDeque108をピン又はロックダウンすることにより更に増加してもよい。Dequeのサイズが増加すると、更なるストレージもピンされる。さらに、作業のキューイングは、オペレーティングシステム（OS：operating  system）又はGPUドライバへのリング遷移（ring  transition）に関連するオーバーヘッドを回避するために、ユーザレベルで（例えば、SVMにおけるアトミック操作を通じて）実行されてもよい。
【００１６】
１つのDequeは、そのEU上で実行するタスクにより共有されるため、各GPUコア（又はEU）に割り当てられてもよい。Dequeのボトムエンドは、そのEUのみによりアクセスされるので、異なるEU（又はGPUサブスライス）がそのDequeに関連するキャッシュラインに対して競合することが妨げられるため、データの局所性が改善され、競合が低減される。
【００１７】
Deque当たり１つの専用の要求ハンドラスレッドを用いてCPUを構成することは、CPUコードを長期間動作することによりもたらされるDequeバックアップを回避するのに役立ち得る。Dequeは、残りのコールバック要求を含むが、このCPUスレッドは、実行を続ける。しかし、Dequeが空になった場合、CPUスレッドは、他のランダムに選択されたDequeからアイテムを奪い取ることを試みる。CPUスレッドが許可された数の奪い取りの試行の後にコールバック要求をうまく奪い取ることができない場合、更なる成功しない試行に関連するコストを回避するために、特定の期間だけ中断する。ユーザレベル（リング3）においてMonitor／Mwait命令が利用可能である場合、CPUスレッドは、新たなアイテムがDequeに追加されるまで待機するためにこれらを使用してもよい。そうでない場合、CPUスレッドは、ある期間だけスリープし、次にその通常動作（自分のコールバック要求の実行又は他のDequeからの奪い取り）を再開してもよい。
【００１８】
図３は、この開示に従った１つの例示的な実施例の動作300のフローチャートを示している。GPUコア又は実行ユニット（EU）102a、102bの動作が示されている。動作302において、GPUコアは、CPUコールバックを開始する。動作304において、コールバック要求は、GPUコアに関連するDequeに追加される。次に動作306において、任意選択で、GPUコアは、コールバックの完了を待機しつつ他のタスクを実行してもよい。動作308において、要求に関連する完了フラグ206が検査され、設定されていない場合、GPUは、他のタスクを実行し続けてもよく（306）、更なるコールバック要求を追加してもよく（304）、或いは単に完了フラグの再検査の前にある期間だけ待機／スリープしてもよい。完了フラグが設定された場合、次に動作310において、GPUコアは、CPUコールバックから提供された結果を読み取る。これらの結果は、例えば、コールバック要求においてポインタにより指定されたSVMにおけるメモリ位置で取得されてもよい。CPUコールバックは、動作312で完了する。
【００１９】
図４は、この開示に従った他の例示的な実施例の動作400のフローチャートを示している。CPUコールバックワーカースレッド202a、202bの動作は、動作402で始まるように示されている。動作404において、コールバック要求は、そのワーカースレッドに関連するDequeからポップされる。コールバック要求がうまくポップされた場合、次に動作416において、コールバック要求により指定された関数又はプロシージャは、コールバック要求により与えられたいずれかの引数で呼び出される／実行される。コールバック要求が完了した後に、動作418において、そのコールバック要求に関連する完了フラグが設定され、ワーカースレッドは、次のコールバック要求を扱うために動作404にループバックする。
【００２０】
しかし、ポップが失敗した場合、例えば、そのワーカースレッドに関連するDequeにもはやコールバック要求が存在しない場合、次に動作406において、奪い取り試行回数がインクリメントされる。動作408において、奪い取り試行回数が最大閾値を超えた場合、次に動作410において、ワーカースレッドは、他のポップを試行する前に或る指定の期間だけ待機してもよい。いくつかの実施例では、待機は、Sleep命令又はMonitor／Mwait命令を実行することにより成されてもよい。そうでなく、奪い取り試行回数が最大閾値未満である場合、動作412において、他のワーカースレッドに関連する他のDequeの中から、別のDequeがランダムに選択される（例えば、奪い取られる）。次に動作414において、コールバック要求は、別の（奪い取られた）Dequeからポップされ、手順は前述の動作416に続く。
【００２１】
図５は、この開示に従った他の例示的な実施例の動作500のフローチャートを示している。この実施例では、GPUがコールバック要求の完了を繰り返し検査することを要求することを回避するために、別の機構が提供される。これは、GPU効率及びエネルギー消費を改善し得る。この機構は、プログラムの所与の時点における計算の状態を表す「継続（continuation）」の使用を行う。コールバック要求は、CPUがコールバック要求を完了した後に呼び出す「継続カーネル（continuation  kernel）」と呼ばれるGPUカーネルへのポインタ又はハンドルを含むように構成されてもよい。次に、GPU継続カーネルは、コールバック要求が行われた直後の時点の元のGPUタスク（又は呼び出しカーネル）の実行を論理的に再開する。したがって、GPU呼び出しカーネルはブロックされず、CPUコールバックが完了したか否かを繰り返し検査する必要はない。コールバック要求はまた、継続カーネルに戻されるデータポインタ（例えば、継続引数ポインタ）を含むように構成されてもよい。一般的に、コールバック要求を行うGPU呼び出しカーネルは、継続引数ポインタにより参照されるデータ構造におけるメモリ位置に基本変数の値を保存し、これにより、これらは後に継続カーネルにより使用されることができる。さらに、CPUコールバック関数が結果を戻す場合、そのデータ構造におけるメモリ位置に書き込むことにより、そうしてもよい。
【００２２】
GPUコア上の呼び出しカーネル502の動作を記述する図５（ａ）を次に参照すると、動作504において、呼び出しカーネルは、CPUコールバックを開始する。動作506において、スタック変数は、コールバック要求の継続引数ポインタにより参照されるデータ構造に保存される。これらのスタック変数は、中断された時点から呼び出しカーネルを再開するために、後に継続カーネルにより使用される。動作508において、コールバック要求は、GPUコア又は実行ユニットに関連するDequeに追加（プッシュ）される。次に動作510において、GPUコア上の呼び出しカーネルは終了してもよく、したがって、例えば、GPUコアが他の作業を実行することを可能にする。呼び出しカーネルはこの時点で終了しているが、継続カーネルは、後に、コールバック要求を行った後に生じることを意図する計算又はタスクを再開することができ、GPUが繰り返しのテストを待機又は実行する必要なく、それを直接行うことができる。
【００２３】
次に図５（ｂ）を参照して、CPUコールバックワーカースレッド520の動作について説明する。動作522において、作業が選択され、前述の図４に関して説明したのと同様の方式で実行される。すなわち、コールバック要求がワーカースレッドに関連するDequeからポップされ、指定されたコールバック関数が実行される。完了時に、動作524において、CPUコールバックワーカースレッドは、そのコールバック要求に関連するGPU継続カーネルを呼び出す。
【００２４】
次に図５（ｃ）を参照して、GPUコア継続カーネル530の動作について説明する。動作532において、呼び出された継続カーネルは、呼び出しカーネルにより前に保存されたスタック変数をロードし、動作534において、存在する場合にはCPUコールバックから結果を読み取る。動作536において、GPUコア呼び出しカーネルは、復旧したスタック変数を使用して再開される。
【００２５】
いくつかの実施例では、プログラマは、スタック変数の値を記憶する必要がある呼び出しカーネルのコードと、これらのスタック変数の値を再ロードするための継続カーネルのコードとを記述することにより、CPUコールバック要求を実現してもよい。しかし、他の実施例では、コンパイラ又は翻訳機は、このコードを出し、したがって、CPUコールバックを使用するために必要なプログラミング労力を簡略化するように構成されてもよい。関数コールバックの使用を更に簡略化するために、コンパイラは、CPUコールバックを含む単一のGPUカーネルを呼び出し及び継続カーネルの適切なシーケンス及び関連するスタック変数に翻訳し、コードを保存及び復旧するように更に構成されてもよい。
【００２６】
図６は、この開示に従った他の例示的な実施例の動作600のフローチャートを示している。動作は、第１のプロセッサと第２のプロセッサとの間で関数コールバックを要求するための方法を提供する。動作610において、コールバック要求は、第１のプロセッサの実行ユニット（EU）により第１の両端キュー（Deque）にプッシュされる。Dequeは、第１及び第２のプロセッサに結合された共有仮想メモリ（SVM）に記憶される。動作620において、コールバック要求の１つが、第２のプロセッサ上で実行する要求ハンドラスレッドにより、第１のDequeからポップされる。動作630において、要求ハンドラスレッドは、ポップされたコールバック要求により指定された関数を実行する。動作640において、要求ハンドラスレッドは、関数の完了に応じてEUへの完了信号を生成する。
【００２７】
図７は、この開示に従った１つの例示的な実施例のシステム図700を示している。システム700は、例えば、スマートフォン、スマートタブレット、パーソナルデジタルアシスタント（PDA）、モバイルインターネットデバイス（MID）、コンバーチブルタブレット、ノートブック若しくはラップトップコンピュータ、又は他の適切なデバイスのようなモバイルプラットフォーム710又はコンピューティングデバイスでもよい。しかし、ここに記載のシステムの実施例は、モバイルプラットフォームに限定されず、いくつかの実施例では、システム700は、ワークステーション又はデスクトップコンピュータでもよいことが分かる。デバイスは、一般的に、例えば、タッチスクリーン、液晶ディスプレイ（LCD）又は他の適切なディスプレイタイプのようなディスプレイエレメント760を介してユーザに様々なインタフェースを提示してもよい。
【００２８】
システム700は、例えば汎用プロセッサとして構成されてもよい第１のプロセッサ又はCPU104と、より高い効率で並列動作を実行するように構成されてもよい第２のプロセッサ又はGPU102とを含むように示されている。いくつかの実施例では、プロセッサ102及び104は、いずれかの数のプロセッサコアとして実現されてもよい。一般的に、プロセッサ（又はプロセッサコア）は、例えば、マイクロプロセッサ、埋め込みプロセッサ、デジタルシグナルプロセッサ（DSP）、グラフィックプロセッサ（GPU）、ネットワークプロセッサ、フィールドプログラマブルゲートアレイ、又はコードを実行するように構成された他のデバイスのようないずれかの種類のプロセッサでもよい。プロセッサは、コア当たり１つより多くのハードウェアスレッドコンテキスト（又は「論理プロセッサ」）を含んでもよいという点で、マルチスレッドコアでもよい。システム700はまた、前述のようにプロセッサの間で改善した関数コールバック要求を実現するように構成されたいずれかの数のDeque108を含むSVM106を含むように示されている。
【００２９】
システム700はまた、メモリ730を含むように示されている。メモリ730は、プロセッサに結合される。メモリ730は、既知の或いは当業者に利用可能な多種のメモリ（様々なレイヤのメモリ階層及び／又はメモリキャッシュを含む）のいずれかでもよい。プロセッサ及びメモリは、１つ以上のユーザアプリケーション又は他のソフトウェアモジュールを記憶、ホスト及び／又は実行するように構成されてもよい。これらのアプリケーションは、例えば、いずれかの種類の計算、通信、データ管理、データ記憶及び／又はユーザインタフェースタスクを含むが、これらに限定されない。いくつかの実施例では、これらのアプリケーションは、モバイルプラットフォーム710の他のコンポーネントを利用してもよく、或いは他のコンポーネントと相互作用してもよい。
【００３０】
システム700はまた、プロセッサ102、104とディスプレイエレメント760及び／又はシステム700の外部の他のエレメント（図示せず）を含むシステム700の他のエレメントとの間のデータ通信を可能又は管理するように構成されてもよい入出力（IO）システム又はコントローラ750を含むように示されている。
【００３１】
システム700はまた、プロセッサに結合され、プログラム、アプリケーション及び／又はデータを記憶するように構成されたストレージシステム740（例えば、ハードディスクドライブ（HDD）又はソリッドステートドライブ（SDD））を含むように示されている。
【００３２】
システム700はまた、無線通信機能（例えば、セルラ通信、WiFi（Wireless  Fidelity）、Bluetooth（登録商標）及び／又は近距離無線通信（NFC：Near  Field  Communication）等）を含んでもよいネットワークインタフェースモジュール770を含むように示されている。無線通信は、Bluetooth（登録商標）、Wi-Fi及び移動電話通信標準の過去、現在及び将来のバージョンを含むいずれか既存又は開発予定の通信標準に従ってもよく、或いはそれに準拠してもよい。
【００３３】
いくつかの実施例では、システム700の様々なコンポーネントは、システム・オン・チップ（SoC）アーキテクチャで組み合わされてもよいことが分かる。いくつかの実施例では、コンポーネントは、ハードウェアコンポーネント、ファームウェアコンポーネント、ソフトウェアコンポーネント、又はハードウェア、ファームウェア若しくはソフトウェアのいずれか適切な組み合わせでもよい。
【００３４】
ここに記載の方法の実施例は、１つ以上のプロセッサにより実行された場合、方法を実行する命令を個別に或いは組み合わせで記憶した１つ以上の記憶媒体を含むシステムにおいて実現されてもよい。ここで、プロセッサは、例えば、システムCPU（例えば、コアプロセッサ）及び／又はプログラム可能回路を含んでもよい。したがって、ここに記載の方法に従った動作は、例えば、複数の異なる物理位置における処理構造のように、複数の物理デバイスの間に分散されてもよいことを意図する。また、当業者に理解できるように、方法の動作は、個別に或いはサブコンビネーションで実行されてもよいことを意図する。したがって、フローチャートのそれぞれの動作の全てが実行される必要はなく、この開示は、当業者に理解できるように、このような動作の全てのサブコンビネーションが可能になることを明確に意図する。
【００３５】
記憶媒体は、いずれかの種類の有形の媒体（例えば、フロッピーディスク、光ディスク、コンパクトディスク読み取り専用メモリ（CD-ROM）、再書き込み可能コンパクトディスク（CD-RW）、デジタル多用途ディスク（DVD）及び光磁気ディスクを含むいずれかの種類のディスク、読み取り専用メモリ（ROM）、ダイナミック及びスタティックRAMのようなランダムアクセスメモリ（RAM）、消去可能プログラム可能読み取り専用メモリ（EPROM）、電気的消去可能プログラム可能読み取り専用メモリ（EEPROM）、フラッシュメモリのような半導体デバイス、磁気若しくは光カード、又は電子命令を記憶するのに適したいずれかの種類の媒体）を含んでもよい。
【００３６】
ここでいずれかの実施例で使用される「回路」は、例えば、ハードウェア回路、プログラム可能回路、状態機械回路及び／又はプログラム可能回路により実行される命令を記憶するファームウェアを単独で或いはいずれかの組み合わせで含んでもよい。アプリケーションは、ホストプロセッサ又は他のプログラム可能回路のようなプログラム可能回路上で実行され得るコード又は命令として具現されてもよい。ここでいずれかの実施例で使用されるモジュールは、回路として具現されてもよい。回路は、集積回路チップのような集積回路として具現されてもよい。
【００３７】
したがって、この開示は、第１のプロセッサと第２のプロセッサとの間で関数コールバック要求を実現するためのシステム、デバイス、方法及びコンピュータ読み取り可能媒体を提供する。以下の例は更なる実施例に関する。
【００３８】
例１によれば、第１のプロセッサと第２のプロセッサとの間で関数コールバック要求を実現するためのシステムが提供される。システムは、第１及び第２のプロセッサに結合された共有仮想メモリ（SVM）を含んでもよく、SVMは、少なくとも１つの両端キュー（Deque）を記憶するように構成される。この例のシステムはまた、第１のプロセッサの実行ユニット（EU）を含んでもよく、EUは、Dequeのうち第１のDequeに関連し、コールバック要求を第１のDequeにプッシュするように構成される。この例のシステムは、第１のDequeからコールバック要求の１つをポップし、ポップされたコールバック要求により指定された関数を実行し、関数の完了に応じてEUへの完了信号を生成するように構成された、第２のプロセッサ上で実行する要求ハンドラスレッドを更に含んでもよい。
【００３９】
例２は、例１の対象物を含んでもよく、コールバック要求は、第２のプロセッサにより実行される関数を指定するための関数ポインタと、実行される関数に提供されるデータ及び実行された関数により生成されてEUに提供される結果についてSVMにおける位置を指定するための引数ポインタとを含む。
【００４０】
例３は、例１及び２の対象物を含んでもよく、要求ハンドラスレッドは、第１のDequeが空であることを検出したことに応じて、第２のDequeからコールバック要求の１つを更にポップし、第２のDequeは、第２のEUに関連する。
【００４１】
例４は、例１〜３の対象物を含んでもよく、Dequeは、EU及び要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、SVMにおいてピンされる。
【００４２】
例５は、例１〜４の対象物を含んでもよく、完了信号は、SVMにおいて完了フラグを設定し、EUは、完了フラグを更にポーリングする。
【００４３】
例６は、例１〜５の対象物を含んでもよく、完了信号は、EU上で継続カーネルをトリガーし、継続カーネルは、前に保存されたスタック変数を復旧する。
【００４４】
例７は、例１〜６の対象物を含んでもよく、要求ハンドラスレッドは、Dequeのいずれかからコールバック要求の１つをポップすることに失敗したことに応じて、更にスリープする。
【００４５】
例８は、例１〜７の対象物を含んでもよく、スリープは、Monitor／Mwait命令の実行を含む。
【００４６】
例９は、例１〜８の対象物を含んでもよく、第１のプロセッサは、グラフィック処理装置（GPU）であり、第２のプロセッサは、汎用中央処理装置（CPU）である。
【００４７】
例１０によれば、第１のプロセッサと第２のプロセッサとの間での関数コールバック要求のための方法が提供される。方法は、第１のプロセッサの実行ユニット（EU）により、コールバック要求を第１の両端キュー（Deque）にプッシュするステップであり、Dequeは、第１及び第２のプロセッサに結合された共有仮想メモリ（SVM）に記憶されるステップと、第２のプロセッサ上で実行する要求ハンドラスレッドにより、第１のDequeからコールバック要求の１つをポップするステップと、要求ハンドラスレッドにより、ポップされたコールバック要求により指定された関数を実行するステップと、要求ハンドラスレッドにより、関数の完了に応じてEUへの完了信号を生成するステップとを含んでもよい。
【００４８】
例１１は、例１０の対象物を含んでもよく、コールバック要求は、第２のプロセッサにより実行される関数を指定するための関数ポインタと、実行される関数に提供されるデータ及び実行された関数により生成されてEUに提供される結果についてSVMにおける位置を指定するための引数ポインタとを含む。
【００４９】
例１２は、例１０及び１１の対象物を含んでもよく、要求ハンドラスレッドにより、第１のDequeが空であることを検出したことに応じて、第２のDequeからコールバック要求の１つをポップするステップであり、第２のDequeは、第２のEUに関連するステップを更に含む。
【００５０】
例１３は、例１０〜１２の対象物を含んでもよく、EU及び要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、SVMにおいてDequeをピンするステップを更に含む。
【００５１】
例１４は、例１０〜１３の対象物を含んでもよく、完了信号を生成するステップは、EUによりポーリングするために、SVMにおいて完了フラグを設定するステップを更に含む。
【００５２】
例１５は、例１０〜１４の対象物を含んでもよく、完了信号を生成するステップは、EU上で継続カーネルをトリガーするステップであり、継続カーネルは、前に保存されたスタック変数を復旧するステップを更に含む。
【００５３】
例１６は、例１０〜１５の対象物を含んでもよく、要求ハンドラスレッドにより、Dequeのいずれかからコールバック要求の１つをポップすることに失敗したことに応じて、スリープするステップを更に含む。
【００５４】
例１７は、例１０〜１６の対象物を含んでもよく、スリープするステップは、Monitor／Mwait命令を実行するステップを更に含む。
【００５５】
例１８によれば、プロセッサにより実行された場合、第１のプロセッサと第２のプロセッサとの間での関数コールバック要求のための以下の動作を生じる命令を記憶した少なくとも１つのコンピュータ読み取り可能記憶媒体が提供される。動作は、第１のプロセッサの実行ユニット（EU）により、コールバック要求を第１の両端キュー（Deque）にプッシュするステップであり、Dequeは、第１及び第２のプロセッサに結合された共有仮想メモリ（SVM）に記憶されるステップと、第２のプロセッサ上で実行する要求ハンドラスレッドにより、第１のDequeからコールバック要求の１つをポップするステップと、要求ハンドラスレッドにより、ポップされたコールバック要求により指定された関数を実行するステップと、要求ハンドラスレッドにより、関数の完了に応じてEUへの完了信号を生成するステップとを含んでもよい。
【００５６】
例１９は、例１８の対象物を含んでもよく、コールバック要求は、第２のプロセッサにより実行される関数を指定するための関数ポインタと、実行される関数に提供されるデータ及び実行された関数により生成されてEUに提供される結果についてSVMにおける位置を指定するための引数ポインタとを含む。
【００５７】
例２０は、例１８及び１９の対象物を含んでもよく、要求ハンドラスレッドにより、第１のDequeが空であることを検出したことに応じて、第２のDequeからコールバック要求の１つをポップするステップであり、第２のDequeは、第２のEUに関連するステップを更に含む。
【００５８】
例２１は、例１８〜２０の対象物を含んでもよく、EU及び要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、SVMにおいてDequeをピンするステップを更に含む。
【００５９】
例２２は、例１８〜２１の対象物を含んでもよく、完了信号を生成するステップは、EUによりポーリングするために、SVMにおいて完了フラグを設定するステップを更に含む。
【００６０】
例２３は、例１８〜２２の対象物を含んでもよく、完了信号を生成するステップは、EU上で継続カーネルをトリガーするステップであり、継続カーネルは、前に保存されたスタック変数を復旧するステップを更に含む。
【００６１】
例２４は、例１８〜２３の対象物を含んでもよく、要求ハンドラスレッドにより、Dequeのいずれかからコールバック要求の１つをポップすることに失敗したことに応じて、スリープするステップを更に含む。
【００６２】
例２５は、例１８〜２４の対象物を含んでもよく、スリープするステップは、Monitor／Mwait命令を実行するステップを更に含む。
【００６３】
例２６によれば、第１のプロセッサと第２のプロセッサとの間での関数コールバック要求のためのシステムが提供される。システムは、第１のプロセッサの実行ユニット（EU）により、コールバック要求を第１の両端キュー（Deque）にプッシュする手段であり、Dequeは、第１及び第２のプロセッサに結合された共有仮想メモリ（SVM）に記憶される手段と、第２のプロセッサ上で実行する要求ハンドラスレッドにより、第１のDequeからコールバック要求の１つをポップする手段と、要求ハンドラスレッドにより、ポップされたコールバック要求により指定された関数を実行する手段と、要求ハンドラスレッドにより、関数の完了に応じてEUへの完了信号を生成する手段とを含んでもよい。
【００６４】
例２７は、例２６の対象物を含んでもよく、コールバック要求は、第２のプロセッサにより実行される関数を指定するための関数ポインタと、実行される関数に提供されるデータ及び実行された関数により生成されてEUに提供される結果についてSVMにおける位置を指定するための引数ポインタとを含む。
【００６５】
例２８は、例２６及び２７の対象物を含んでもよく、要求ハンドラスレッドにより、第１のDequeが空であることを検出したことに応じて、第２のDequeからコールバック要求の１つをポップする手段であり、第２のDequeは、第２のEUに関連する手段を更に含む。
【００６６】
例２９は、例２６〜２８の対象物を含んでもよく、EU及び要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、SVMにおいてDequeをピンする手段を更に含む。
【００６７】
例３０は、例２６〜２９の対象物を含んでもよく、完了信号を生成する手段は、EUによりポーリングするために、SVMにおいて完了フラグを設定する手段を更に含む。
【００６８】
例３１は、例２６〜３０の対象物を含んでもよく、完了信号を生成する手段は、EU上で継続カーネルをトリガーする手段であり、継続カーネルは、前に保存されたスタック変数を復旧する手段を更に含む。
【００６９】
例３２は、例２６〜３１の対象物を含んでもよく、要求ハンドラスレッドにより、Dequeのいずれかからコールバック要求の１つをポップすることに失敗したことに応じて、スリープする手段を更に含む。
【００７０】
例３３は、例２６〜３２の対象物を含んでもよく、スリープする手段は、Monitor／Mwait命令を実行する手段を更に含む。
【００７１】
ここで使用されている用語及び表現は、限定ではなく、説明に関して使用されており、このような用語及び表現の使用において、図示及び記載した機能（又はその一部）のいずれかの均等物を除外する意図は存在せず、特許請求の範囲内において様々な変更が可能であることが分かる。したがって、特許請求の範囲は、全てのこのような均等物をカバーすることを意図する。様々な機能、態様及び実施例についてここで説明した。当業者により理解できるように、機能、態様及び実施例は、相互の組み合わせ並びに変更及び変形が可能である。したがって、この開示は、このような組み合わせ、変更及び変形を含むものと考えられるべきである。
【図１】
0006800850.tif 000002
【図２】
0006800850.tif 000003
【図３】
0006800850.tif 000004
【図４】
0006800850.tif 000005
【図５】
0006800850.tif 000006
【図６】
0006800850.tif 000007
【図７】
0006800850.tif 000008