IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ インテル コーポレイションの特許一覧

特許7087029中央処理装置(CPU)と補助プロセッサとの間の改善した関数コールバック機構
<>
  • 特許-中央処理装置(CPU)と補助プロセッサとの間の改善した関数コールバック機構 図1
  • 特許-中央処理装置(CPU)と補助プロセッサとの間の改善した関数コールバック機構 図2
  • 特許-中央処理装置(CPU)と補助プロセッサとの間の改善した関数コールバック機構 図3
  • 特許-中央処理装置(CPU)と補助プロセッサとの間の改善した関数コールバック機構 図4
  • 特許-中央処理装置(CPU)と補助プロセッサとの間の改善した関数コールバック機構 図5
  • 特許-中央処理装置(CPU)と補助プロセッサとの間の改善した関数コールバック機構 図6
  • 特許-中央処理装置(CPU)と補助プロセッサとの間の改善した関数コールバック機構 図7
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-06-10
(45)【発行日】2022-06-20
(54)【発明の名称】中央処理装置(CPU)と補助プロセッサとの間の改善した関数コールバック機構
(51)【国際特許分類】
   G06F 9/38 20060101AFI20220613BHJP
   G06F 9/54 20060101ALI20220613BHJP
   G06F 15/167 20060101ALI20220613BHJP
【FI】
G06F9/38 370C
G06F9/54 A
G06F9/54 B
G06F15/167 610A
【請求項の数】 20
【外国語出願】
(21)【出願番号】P 2020128188
(22)【出願日】2020-07-29
(62)【分割の表示】P 2017526871の分割
【原出願日】2015-11-24
(65)【公開番号】P2020173870
(43)【公開日】2020-10-22
【審査請求日】2020-07-29
(31)【優先権主張番号】14/574,545
(32)【優先日】2014-12-18
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】593096712
【氏名又は名称】インテル コーポレイション
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100091214
【弁理士】
【氏名又は名称】大貫 進介
(72)【発明者】
【氏名】ルイス,ブライアン ティー.
(72)【発明者】
【氏名】バリク,ラジキショア
(72)【発明者】
【氏名】シュペイスマン,タチアナ
【審査官】久保 光宏
(56)【参考文献】
【文献】特開平11-175359(JP,A)
【文献】特表2002-510819(JP,A)
【文献】特開2005-284749(JP,A)
【文献】特表2014-531687(JP,A)
【文献】Jeff A. Stuart, et al.,"GPU-to-CPU Callbacks",In: Euro-Par 2010, Parallel Processing Workshops ("Lecture Notes in Computer Science (LNCS), Volume 6586"),[online], Springer-Verlag,2011年,Pages 365-372,[令和3年9月2日検索], インターネット, <URL: https://link.springer.com/chapter/10.1007/978-3-642-21878-1_45>,ISBN: 978-3-642-21877-4, <DOI: https://doi.org/10.1007/978-3-642-21878-1_45>.
【文献】Jason Sanders(外1名)著,株式会社クイープ訳,「CUDA by Example 汎用GPUプログラミング入門」,初版,日本,株式会社インプレスジャパン,2011年02月11日,第183~203頁,ISBN: 978-4-8443-2978-7.
【文献】磯部泰徳(外2名),「ホモジニアスマルチコアCPUにおける異種OS間の連係機構の試作」,情報処理学会研究報告,日本,[online], 情報処理学会,2009年04月15日,Vol.2009-OS-111, No.17,第1~8頁,[令和3年9月4日検索],インターネット,<URL: http://id.nii.ac.jp/1001/00062095/>.
【文献】「結城浩のC#で学ぶアルゴリズムとデータ構造 第4回 配列と0記法」,C MAGAZINE,日本,ソフトバンクパブリッシング株式会社,2005年08月01日,Vol.17, No.8(2005年8月号),第113~120頁
(58)【調査した分野】(Int.Cl.,DB名)
G06F9/38
G06F9/46-9/54
G06F15/16-15/177
CSDB(日本国特許庁)
IEEEXplore(IEEE)
(57)【特許請求の範囲】
【請求項1】
中央処理装置(CPU)と、
グラフィック処理装置(GPU)と、
前記CPUによりアクセス可能であり、前記GPUによりアクセス可能な共有仮想メモリと、
前記CPUにより実行される関数に対応するデータを記憶するキューと
を含み、
前記キューは、データエレメントがバッファの一端に書き込まれること又はバッファの一端から読み取られることのうち少なくとも1つを可能にするように構成されたバッファにより実現され、
前記GPUは、前記データを前記キューに書き込み、前記CPUに前記関数を実行させ、
前記CPUは、前記関数を実行し、前記CPUによる前記関数の実行が完了したとき、前記GPUによりアクセス可能な完了フラグを設定し、
前記完了フラグは、前記関数の実行が完了した後に呼び出される前記GPU上のカーネルをトリガーし、前記カーネルは、前に保存されたスタック変数を復旧する、プロセッサプラットフォーム。
【請求項2】
前記データは、前記関数に関連する引数を指定する、請求項1に記載のプロセッサプラットフォーム。
【請求項3】
前記データは、前記関数へのポインタを含む、請求項2に記載のプロセッサプラットフォーム。
【請求項4】
前記キューは、前記共有仮想メモリにより実現される、請求項1に記載のプロセッサプラットフォーム。
【請求項5】
前記GPUは、
前記完了フラグが設定されることを検査し、
前記完了フラグが設定されたとき、前記共有仮想メモリ内の位置から前記CPUによる前記関数の前記実行の結果を読み取り、
前記位置は、前記データに含まれるポインタにより指定される、請求項1に記載のプロセッサプラットフォーム。
【請求項6】
前記キューは、前記CPUから前記GPUに前記完了フラグを通信する、請求項1に記載のプロセッサプラットフォーム。
【請求項7】
前記CPUは、スレッドを実行し、
前記キューから前記データを読み取り、
前記データに基づいて前記関数を実行し、
前記CPUによる前記関数の実行が完了したとき、前記完了フラグを設定する、請求項1に記載のプロセッサプラットフォーム。
【請求項8】
マルチプロセッサシステムにおいて実行される関数を呼び出す方法であって、
前記マルチプロセッサシステムのグラフィック処理装置(GPU)によって、データをキューに書き込むステップであり、前記キューは、データがバッファの一端に書き込まれること又はバッファの一端から読み取られることのうち少なくとも1つを可能にするように構成されたバッファにより実現され、前記データは前記関数に対応し、前記関数は、前記マルチプロセッサシステムの中央処理装置(CPU)により実行される、ステップと、
前記CPUによって、前記キューから前記データを読み取るステップと、
前記CPUによって、前記データに基づいて前記関数を実行するステップと、
前記CPUによって、前記関数の実行が完了したとき、前記GPUによりアクセス可能な完了フラグを設定するステップと
を含み、
前記完了フラグは、前記関数の実行が完了した後に呼び出される前記GPU上のカーネルをトリガーし、前記カーネルは、前に保存されたスタック変数を復旧する、方法。
【請求項9】
前記データは、前記関数に関連する引数に対応する、請求項8に記載の方法。
【請求項10】
前記データは、前記関数へのポインタを含む、請求項9に記載の方法。
【請求項11】
前記キューは、共有仮想メモリにより実現される、請求項8に記載の方法。
【請求項12】
前記GPUによって、前記完了フラグが設定されることを検査するステップと、
前記GPUによって、前記完了フラグが設定されたとき、共有仮想メモリ内の位置から前記CPUによる前記関数の前記実行の結果を読み取るステップであり、前記位置は、前記データに含まれるポインタにより指定される、ステップと
を更に含む、請求項8に記載の方法。
【請求項13】
前記キューを通じて前記完了フラグを通信するステップを更に含む、請求項8に記載の方法。
【請求項14】
前記CPUによってスレッドを実行するステップであり、前記スレッドは、
前記キューから前記データを読み取る動作と、
前記データに基づいて前記関数を実行する動作と、
前記CPUによる前記関数の実行が完了したとき、前記完了フラグを設定する動作と
を含む動作を実行する、ステップを更に含む、請求項8に記載の方法。
【請求項15】
中央処理装置(CPU)と、
グラフィック処理装置(GPU)と、
前記CPUにより実行される関数に対応するデータを記憶する手段と
を含み、
前記データを記憶する手段は、データがバッファの一端に書き込まれること又はバッファの一端から読み取られることのうち少なくとも1つを可能にするように構成されたバッファを含み、
前記GPUは、前記データを前記データを記憶する手段に書き込み、前記CPUに前記関数を実行させ、
前記CPUは、前記関数を実行し、前記CPUによる前記関数の実行が完了したとき、前記GPUによりアクセス可能な完了フラグを設定し、
前記完了フラグは、前記関数の実行が完了した後に呼び出される前記GPU上のカーネルをトリガーし、前記カーネルは、前に保存されたスタック変数を復旧する、プロセッサシステム。
【請求項16】
前記データは、前記関数に関連する引数を指定する、請求項15に記載のプロセッサシステム。
【請求項17】
前記データは、前記関数へのポインタを含む、請求項16に記載のプロセッサシステム。
【請求項18】
前記データを記憶する手段は、共有仮想メモリを含む、請求項15に記載のプロセッサシステム。
【請求項19】
前記GPUは、
前記完了フラグが設定されることを検査し、
前記完了フラグが設定されたとき、前記共有仮想メモリ内の位置から前記CPUによる前記関数の前記実行の結果を読み取り、
前記位置は、前記データに含まれるポインタにより指定される、請求項18に記載のプロセッサシステム。
【請求項20】
前記データを記憶する手段は、前記CPUから前記GPUに前記完了フラグを通信する、請求項15に記載のプロセッサシステム。
【発明の詳細な説明】
【技術分野】
【0001】
この開示は、補助プロセッサ(例えば、グラフィック処理装置(GPU:Graphics Processing Unit))から中央処理装置(CPU:Central Processing Unit)への関数コールバック要求に関し、より具体的にはこのようなコールバック要求のための効率的な改善に関する。
【背景技術】
【0002】
異種処理システム(例えば、チップ上にCPU及びGPU(又は補助プロセッサ若しくはアクセラレータ)を組み合わせたプロセッサ)は、ますます一般的になっている。グラフィック処理を実行することに加えて、GPUは、比較的並列インテンシブである計算タスクをCPUからオフロードするために使用されることがある。GPUアーキテクチャは、典型的には並列計算に向いているため、GPUは、CPUに比べて、これらの種類のタスクにより高い性能及びより低いエネルギー消費を提供することができる可能性がある。CPUからGPUへの関数呼び出しのサポートは、ハードウェア及びソフトウェアの双方において、まますます利用可能になってきている。
【0003】
これらの異種プロセッサ及びプログラミングフレームワークは、CPUがGPUに作業をオフロードすることを可能にし得るが、GPUが作業をCPUにオフロードし戻すための対応する機構は典型的には存在しない。このような機能は、例えば、(1)GPU上で実行されないことがあるオペレーティングシステム関数の呼び出し、(2)GPUにまだ移植されていないコードの呼び出し、及び(3)並列の実行にあまり適していない比較的順次的なコード又は不規則な制御パスに従うコードの実行を含む多くの状況に有用になることがある。
【図面の簡単な説明】
【0004】
特許請求の対象物の実施例の特徴及び利点は、以下の詳細な説明と共に明らかになる。図面を参照すると、同様の符号は同様の部分を示す。
図1】この開示に従った例示的な実施例のトップレベルのシステム図を示す。
図2】この開示に従った例示的な実施例のブロック図を示す。
図3】この開示に従った例示的な実施例の動作のフローチャートを示す。
図4】この開示に従った他の例示的な実施例の動作のフローチャートを示す。
図5】この開示に従った他の例示的な実施例の動作のフローチャートを示す。
図6】この開示に従った他の例示的な実施例の動作のフローチャートを示す。
図7】この開示に従った他の例示的な実施例のプラットフォームのシステム図を示す。
【発明を実施するための形態】
【0005】
以下の詳細な説明は、例示的な実施例を参照して行われるが、その多数の代案、変更及び変形が当業者に明らかになる。
【0006】
一般的に、この開示は、低減した待ち時間を含む改善した効率を備えた、補助プロセッサ(例えば、GPU又は他の種類のアクセラレータ)と中央処理装置(CPU:Central Processing Unit)との間の関数呼び出し及びコールバックのためのシステム、デバイス、方法及びコンピュータ読み取り可能媒体を提供する。異種プロセッサは、共有仮想メモリ(SVM:shared virtual memory)にアクセスするように構成された1つ以上のGPU及びCPUを含んでもよい。CPUは、作業をGPUにオフロードするために、GPUへの関数呼び出し要求を生成してもよい。次に、GPUは、その作業負荷の選択された部分を実行するために、CPUへの関数コールバック要求を生成してもよい。以下に更に詳細に説明するように、コールバック要求は、SVMに記憶された両端キュー(double-ended queue)を通じて通信されてもよい。コールバック要求は、CPU上で実行されるためのコールバック関数へのポインタ(例えば、メモリアドレス)と、コールバック関数に提供されるデータ及び/コールバック関数により戻されるデータへのポインタと、シグナリングフラグ及び継続カーネル(continuation kernel)を含む1つ以上のコールバック完了機構に関する更なる情報とを含んでもよい。
【0007】
図1は、この開示に従った1つの例示的な実施例のトップレベルのシステム図100を示している。1つ以上のGPU(又はGPUコア)102は、1つ以上のCPU104と仮想メモリ(SVM)106を共有するように構成される。GPU102及びCPU104は、異種プロセッサ又はシステム・オン・チップ(SoC:system on a chip)の一部でもよく、作業は、プロセッサの間で供給されてもよい。例えば、より汎用のプロセッサであるCPUは、比較的順次的(又は不規則)なフローで実行するタスクを扱うのにより適する可能性があり、より並列のアーキテクチャによって設計されたGPUは、並列計算タスクを扱うのにより適する可能性がある。CPU104は、GPUアーキテクチャに適した作業をGPUにオフロードするために、GPU102への関数呼び出し要求を生成するように構成されてもよい。GPU102は、CPUアーキテクチャにより適したその作業負荷の選択された部分を実行するために、CPU104への関数コールバック要求を生成するように構成されてもよい。コールバック要求の完了時に、CPU104は、要求を開始したGPU102への完了信号を生成してもよい。
【0008】
SVM106は、GPUがCPUにより行われた更新を見ることができ、その逆も見ることができるように、CPU104及びGPU102がデータ構造を含むポインタをトランスペアレントに共有し、メモリ整合性を提供することを可能にするように構成されてもよい。SVM106はまた、共有メモリへのアクセスを連携させ、CPU104とGPU102との間の競合を妨げるために、アトミック操作及びフェンス操作を提供するように構成されてもよい。
【0009】
コールバック要求及び完了信号は、SVM106に記憶された両端キュー(Deque)108を通じて通信されてもよい。キューは、複数のデータエレメントを保持するように構成された一種のデータ構造である。両端キュー(又はDeque)は、データエレメントがキューの先端又は末端のいずれかに追加又はいずれかから削除され得るように構成されたキューである。Dequeの先端は、「フロント」又は「トップ」エンドと呼ばれてもよく、末端は、「バック」又は「ボトム」エンドと呼ばれてもよい。先端及び末端の名称は、単にDequeの動作の記述における便宜的な基準点として使用されており、固定的な物理位置を示すものではない。言い換えると、先端及び末端という用語は、開示のいずれかの実施例の意味又は動作を変更することなく、以下の説明を通じて交換されてもよい。いくつかの実施例では、Dequeは、必要に応じてより効率的なサイズ調整を可能にするために、サーキュラバッファ又はリングバッファとして実現されてもよい。
【0010】
データをDequeに追加(又は書き込む)動作は、データをDequeの一端に「プッシュ」することと呼ばれてもよい。Dequeからデータを削除(又は読み取る)動作は、Dequeの他端からデータを「ドロップ」することと呼ばれてもよい。以下に更に詳細に説明するように、GPU102は、Deque108にコールバック要求をプッシュしてもよく、CPUは、実行のためにこれらをポップしてもよい。
【0011】
図2は、この開示に従った1つの例示的な実施例のブロック図200を示しており、図1のシステムがより詳細に示されている。GPU102は、いずれかの数のコア又は実行ユニット(EU:execution unit)102a、102bを含むように示されており、これらは、例えば、並列でタスクを実行するように構成されてもよい。これらのタスクは、作業をCPUからGPUにオフロードすることを意図するCPU104からの関数呼び出しに関連してもよい。次に、GPUコア又はEU102上で実行するタスクは、CPU104への関数コールバックを要求してもよい。
【0012】
CPU104は、CPUプロセッサ上で実行するいずれかの数のコールバック要求ハンドラスレッド(コールバックワーカースレッドとも呼ばれる)202a、202bを含むように示されている。共有仮想メモリ(SVM)106は、いずれかの数のDeque108a、108bを記憶するように構成されてもよいが、競合を回避して待ち時間を低減するために、典型的には、GPUコア毎に1つのDequeが存在し、Deque毎に1つの要求ハンドラスレッドが存在する。いくつかの実施例では、SVM106はまた、完了フラグ206a、206bを記憶するように構成されてもよい。特定のコア(例えば、102a)上で実行するGPUタスクは、コールバック要求をそのコア108aに関連するDequeにプッシュすることにより、関数コールバックをCPU104に要求してもよい。コールバック要求は、CPU上で実行されるコールバック関数へのポインタと、関数の引数へのポインタとを含んでもよい。引数ポインタは、典型的には、CPUが戻り結果を書き込み得る1つ以上のメモリ位置を含む、複数のデータアイテム及びパラメータを含むデータ構造へのポインタでもよい。
【0013】
CPU上の要求ハンドラスレッド202aは、そのDequeからコールバック要求を順次にポップし、そのコールバック要求に関連する関数を実行してもよい。そのコールバック要求関数の完了時に、要求ハンドラスレッドは、完了信号を生成してもよい。いくつかの実施例では、完了信号は、SVM106において完了フラグ206a(ブール変数)を設定するためのアトミック操作を実行することにより成されてもよい。完了フラグ206は、コールバック要求においてポインタにより指定されてもよい。GPUタスクは、例えば他のタスクを実行する間に、いつコールバック要求が完了したかを決定するために、定期的に(アトミック操作を使用して)完了フラグ206aを監視してもよい。したがって、GPUは、CPUによるコールバックの実行中にストールしない。
【0014】
いくつかの実施例では、要求ハンドラスレッド202は、アイドルになったときに(例えば、自分のDequeが空になったときに)、相互に作業を奪い取ってもよい。これは、1つ以上のコールバック要求をポップするために、別のDequeをランダムに選択することにより成されてもよい。このような作業の奪い取り(work stealing)は、複数の要求ハンドラスレッドの間で作業をより効率的に分配し得る。
【0015】
いくつかの実施例では、効率は、CPU又はGPUのいずれかによるページフォールトを回避するために、SVM106においてDeque108をピン又はロックダウンすることにより更に増加してもよい。Dequeのサイズが増加すると、更なるストレージもピンされる。さらに、作業のキューイングは、オペレーティングシステム(OS:operating system)又はGPUドライバへのリング遷移(ring transition)に関連するオーバーヘッドを回避するために、ユーザレベルで(例えば、SVMにおけるアトミック操作を通じて)実行されてもよい。
【0016】
1つのDequeは、そのEU上で実行するタスクにより共有されるため、各GPUコア(又はEU)に割り当てられてもよい。Dequeのボトムエンドは、そのEUのみによりアクセスされるので、異なるEU(又はGPUサブスライス)がそのDequeに関連するキャッシュラインに対して競合することが妨げられるため、データの局所性が改善され、競合が低減される。
【0017】
Deque当たり1つの専用の要求ハンドラスレッドを用いてCPUを構成することは、CPUコードを長期間動作することによりもたらされるDequeバックアップを回避するのに役立ち得る。Dequeは、残りのコールバック要求を含むが、このCPUスレッドは、実行を続ける。しかし、Dequeが空になった場合、CPUスレッドは、他のランダムに選択されたDequeからアイテムを奪い取ることを試みる。CPUスレッドが許可された数の奪い取りの試行の後にコールバック要求をうまく奪い取ることができない場合、更なる成功しない試行に関連するコストを回避するために、特定の期間だけ中断する。ユーザレベル(リング3)においてMonitor/Mwait命令が利用可能である場合、CPUスレッドは、新たなアイテムがDequeに追加されるまで待機するためにこれらを使用してもよい。そうでない場合、CPUスレッドは、ある期間だけスリープし、次にその通常動作(自分のコールバック要求の実行又は他のDequeからの奪い取り)を再開してもよい。
【0018】
図3は、この開示に従った1つの例示的な実施例の動作300のフローチャートを示している。GPUコア又は実行ユニット(EU)102a、102bの動作が示されている。動作302において、GPUコアは、CPUコールバックを開始する。動作304において、コールバック要求は、GPUコアに関連するDequeに追加される。次に動作306において、任意選択で、GPUコアは、コールバックの完了を待機しつつ他のタスクを実行してもよい。動作308において、要求に関連する完了フラグ206が検査され、設定されていない場合、GPUは、他のタスクを実行し続けてもよく(306)、更なるコールバック要求を追加してもよく(304)、或いは単に完了フラグの再検査の前にある期間だけ待機/スリープしてもよい。完了フラグが設定された場合、次に動作310において、GPUコアは、CPUコールバックから提供された結果を読み取る。これらの結果は、例えば、コールバック要求においてポインタにより指定されたSVMにおけるメモリ位置で取得されてもよい。CPUコールバックは、動作312で完了する。
【0019】
図4は、この開示に従った他の例示的な実施例の動作400のフローチャートを示している。CPUコールバックワーカースレッド202a、202bの動作は、動作402で始まるように示されている。動作404において、コールバック要求は、そのワーカースレッドに関連するDequeからポップされる。コールバック要求がうまくポップされた場合、次に動作416において、コールバック要求により指定された関数又はプロシージャは、コールバック要求により与えられたいずれかの引数で呼び出される/実行される。コールバック要求が完了した後に、動作418において、そのコールバック要求に関連する完了フラグが設定され、ワーカースレッドは、次のコールバック要求を扱うために動作404にループバックする。
【0020】
しかし、ポップが失敗した場合、例えば、そのワーカースレッドに関連するDequeにもはやコールバック要求が存在しない場合、次に動作406において、奪い取り試行回数がインクリメントされる。動作408において、奪い取り試行回数が最大閾値を超えた場合、次に動作410において、ワーカースレッドは、他のポップを試行する前に或る指定の期間だけ待機してもよい。いくつかの実施例では、待機は、Sleep命令又はMonitor/Mwait命令を実行することにより成されてもよい。そうでなく、奪い取り試行回数が最大閾値未満である場合、動作412において、他のワーカースレッドに関連する他のDequeの中から、別のDequeがランダムに選択される(例えば、奪い取られる)。次に動作414において、コールバック要求は、別の(奪い取られた)Dequeからポップされ、手順は前述の動作416に続く。
【0021】
図5は、この開示に従った他の例示的な実施例の動作500のフローチャートを示している。この実施例では、GPUがコールバック要求の完了を繰り返し検査することを要求することを回避するために、別の機構が提供される。これは、GPU効率及びエネルギー消費を改善し得る。この機構は、プログラムの所与の時点における計算の状態を表す「継続(continuation)」の使用を行う。コールバック要求は、CPUがコールバック要求を完了した後に呼び出す「継続カーネル(continuation kernel)」と呼ばれるGPUカーネルへのポインタ又はハンドルを含むように構成されてもよい。次に、GPU継続カーネルは、コールバック要求が行われた直後の時点の元のGPUタスク(又は呼び出しカーネル)の実行を論理的に再開する。したがって、GPU呼び出しカーネルはブロックされず、CPUコールバックが完了したか否かを繰り返し検査する必要はない。コールバック要求はまた、継続カーネルに戻されるデータポインタ(例えば、継続引数ポインタ)を含むように構成されてもよい。一般的に、コールバック要求を行うGPU呼び出しカーネルは、継続引数ポインタにより参照されるデータ構造におけるメモリ位置に基本変数の値を保存し、これにより、これらは後に継続カーネルにより使用されることができる。さらに、CPUコールバック関数が結果を戻す場合、そのデータ構造におけるメモリ位置に書き込むことにより、そうしてもよい。
【0022】
GPUコア上の呼び出しカーネル502の動作を記述する図5(a)を次に参照すると、動作504において、呼び出しカーネルは、CPUコールバックを開始する。動作506において、スタック変数は、コールバック要求の継続引数ポインタにより参照されるデータ構造に保存される。これらのスタック変数は、中断された時点から呼び出しカーネルを再開するために、後に継続カーネルにより使用される。動作508において、コールバック要求は、GPUコア又は実行ユニットに関連するDequeに追加(プッシュ)される。次に動作510において、GPUコア上の呼び出しカーネルは終了してもよく、したがって、例えば、GPUコアが他の作業を実行することを可能にする。呼び出しカーネルはこの時点で終了しているが、継続カーネルは、後に、コールバック要求を行った後に生じることを意図する計算又はタスクを再開することができ、GPUが繰り返しのテストを待機又は実行する必要なく、それを直接行うことができる。
【0023】
次に図5(b)を参照して、CPUコールバックワーカースレッド520の動作について説明する。動作522において、作業が選択され、前述の図4に関して説明したのと同様の方式で実行される。すなわち、コールバック要求がワーカースレッドに関連するDequeからポップされ、指定されたコールバック関数が実行される。完了時に、動作524において、CPUコールバックワーカースレッドは、そのコールバック要求に関連するGPU継続カーネルを呼び出す。
【0024】
次に図5(c)を参照して、GPUコア継続カーネル530の動作について説明する。動作532において、呼び出された継続カーネルは、呼び出しカーネルにより前に保存されたスタック変数をロードし、動作534において、存在する場合にはCPUコールバックから結果を読み取る。動作536において、GPUコア呼び出しカーネルは、復旧したスタック変数を使用して再開される。
【0025】
いくつかの実施例では、プログラマは、スタック変数の値を記憶する必要がある呼び出しカーネルのコードと、これらのスタック変数の値を再ロードするための継続カーネルのコードとを記述することにより、CPUコールバック要求を実現してもよい。しかし、他の実施例では、コンパイラ又は翻訳機は、このコードを出し、したがって、CPUコールバックを使用するために必要なプログラミング労力を簡略化するように構成されてもよい。関数コールバックの使用を更に簡略化するために、コンパイラは、CPUコールバックを含む単一のGPUカーネルを呼び出し及び継続カーネルの適切なシーケンス及び関連するスタック変数に翻訳し、コードを保存及び復旧するように更に構成されてもよい。
【0026】
図6は、この開示に従った他の例示的な実施例の動作600のフローチャートを示している。動作は、第1のプロセッサと第2のプロセッサとの間で関数コールバックを要求するための方法を提供する。動作610において、コールバック要求は、第1のプロセッサの実行ユニット(EU)により第1の両端キュー(Deque)にプッシュされる。Dequeは、第1及び第2のプロセッサに結合された共有仮想メモリ(SVM)に記憶される。動作620において、コールバック要求の1つが、第2のプロセッサ上で実行する要求ハンドラスレッドにより、第1のDequeからポップされる。動作630において、要求ハンドラスレッドは、ポップされたコールバック要求により指定された関数を実行する。動作640において、要求ハンドラスレッドは、関数の完了に応じてEUへの完了信号を生成する。
【0027】
図7は、この開示に従った1つの例示的な実施例のシステム図700を示している。システム700は、例えば、スマートフォン、スマートタブレット、パーソナルデジタルアシスタント(PDA)、モバイルインターネットデバイス(MID)、コンバーチブルタブレット、ノートブック若しくはラップトップコンピュータ、又は他の適切なデバイスのようなモバイルプラットフォーム710又はコンピューティングデバイスでもよい。しかし、ここに記載のシステムの実施例は、モバイルプラットフォームに限定されず、いくつかの実施例では、システム700は、ワークステーション又はデスクトップコンピュータでもよいことが分かる。デバイスは、一般的に、例えば、タッチスクリーン、液晶ディスプレイ(LCD)又は他の適切なディスプレイタイプのようなディスプレイエレメント760を介してユーザに様々なインタフェースを提示してもよい。
【0028】
システム700は、例えば汎用プロセッサとして構成されてもよい第1のプロセッサ又はCPU104と、より高い効率で並列動作を実行するように構成されてもよい第2のプロセッサ又はGPU102とを含むように示されている。いくつかの実施例では、プロセッサ102及び104は、いずれかの数のプロセッサコアとして実現されてもよい。一般的に、プロセッサ(又はプロセッサコア)は、例えば、マイクロプロセッサ、埋め込みプロセッサ、デジタルシグナルプロセッサ(DSP)、グラフィックプロセッサ(GPU)、ネットワークプロセッサ、フィールドプログラマブルゲートアレイ、又はコードを実行するように構成された他のデバイスのようないずれかの種類のプロセッサでもよい。プロセッサは、コア当たり1つより多くのハードウェアスレッドコンテキスト(又は「論理プロセッサ」)を含んでもよいという点で、マルチスレッドコアでもよい。システム700はまた、前述のようにプロセッサの間で改善した関数コールバック要求を実現するように構成されたいずれかの数のDeque108を含むSVM106を含むように示されている。
【0029】
システム700はまた、メモリ730を含むように示されている。メモリ730は、プロセッサに結合される。メモリ730は、既知の或いは当業者に利用可能な多種のメモリ(様々なレイヤのメモリ階層及び/又はメモリキャッシュを含む)のいずれかでもよい。プロセッサ及びメモリは、1つ以上のユーザアプリケーション又は他のソフトウェアモジュールを記憶、ホスト及び/又は実行するように構成されてもよい。これらのアプリケーションは、例えば、いずれかの種類の計算、通信、データ管理、データ記憶及び/又はユーザインタフェースタスクを含むが、これらに限定されない。いくつかの実施例では、これらのアプリケーションは、モバイルプラットフォーム710の他のコンポーネントを利用してもよく、或いは他のコンポーネントと相互作用してもよい。
【0030】
システム700はまた、プロセッサ102、104とディスプレイエレメント760及び/又はシステム700の外部の他のエレメント(図示せず)を含むシステム700の他のエレメントとの間のデータ通信を可能又は管理するように構成されてもよい入出力(IO)システム又はコントローラ750を含むように示されている。
【0031】
システム700はまた、プロセッサに結合され、プログラム、アプリケーション及び/又はデータを記憶するように構成されたストレージシステム740(例えば、ハードディスクドライブ(HDD)又はソリッドステートドライブ(SDD))を含むように示されている。
【0032】
システム700はまた、無線通信機能(例えば、セルラ通信、WiFi(Wireless Fidelity)、Bluetooth(登録商標)及び/又は近距離無線通信(NFC:Near Field Communication)等)を含んでもよいネットワークインタフェースモジュール770を含むように示されている。無線通信は、Bluetooth(登録商標)、Wi-Fi及び移動電話通信標準の過去、現在及び将来のバージョンを含むいずれか既存又は開発予定の通信標準に従ってもよく、或いはそれに準拠してもよい。
【0033】
いくつかの実施例では、システム700の様々なコンポーネントは、システム・オン・チップ(SoC)アーキテクチャで組み合わされてもよいことが分かる。いくつかの実施例では、コンポーネントは、ハードウェアコンポーネント、ファームウェアコンポーネント、ソフトウェアコンポーネント、又はハードウェア、ファームウェア若しくはソフトウェアのいずれか適切な組み合わせでもよい。
【0034】
ここに記載の方法の実施例は、1つ以上のプロセッサにより実行された場合、方法を実行する命令を個別に或いは組み合わせで記憶した1つ以上の記憶媒体を含むシステムにおいて実現されてもよい。ここで、プロセッサは、例えば、システムCPU(例えば、コアプロセッサ)及び/又はプログラム可能回路を含んでもよい。したがって、ここに記載の方法に従った動作は、例えば、複数の異なる物理位置における処理構造のように、複数の物理デバイスの間に分散されてもよいことを意図する。また、当業者に理解できるように、方法の動作は、個別に或いはサブコンビネーションで実行されてもよいことを意図する。したがって、フローチャートのそれぞれの動作の全てが実行される必要はなく、この開示は、当業者に理解できるように、このような動作の全てのサブコンビネーションが可能になることを明確に意図する。
【0035】
記憶媒体は、いずれかの種類の有形の媒体(例えば、フロッピーディスク、光ディスク、コンパクトディスク読み取り専用メモリ(CD-ROM)、再書き込み可能コンパクトディスク(CD-RW)、デジタル多用途ディスク(DVD)及び光磁気ディスクを含むいずれかの種類のディスク、読み取り専用メモリ(ROM)、ダイナミック及びスタティックRAMのようなランダムアクセスメモリ(RAM)、消去可能プログラム可能読み取り専用メモリ(EPROM)、電気的消去可能プログラム可能読み取り専用メモリ(EEPROM)、フラッシュメモリのような半導体デバイス、磁気若しくは光カード、又は電子命令を記憶するのに適したいずれかの種類の媒体)を含んでもよい。
【0036】
ここでいずれかの実施例で使用される「回路」は、例えば、ハードウェア回路、プログラム可能回路、状態機械回路及び/又はプログラム可能回路により実行される命令を記憶するファームウェアを単独で或いはいずれかの組み合わせで含んでもよい。アプリケーションは、ホストプロセッサ又は他のプログラム可能回路のようなプログラム可能回路上で実行され得るコード又は命令として具現されてもよい。ここでいずれかの実施例で使用されるモジュールは、回路として具現されてもよい。回路は、集積回路チップのような集積回路として具現されてもよい。
【0037】
したがって、この開示は、第1のプロセッサと第2のプロセッサとの間で関数コールバック要求を実現するためのシステム、デバイス、方法及びコンピュータ読み取り可能媒体を提供する。以下の例は更なる実施例に関する。
【0038】
例1によれば、第1のプロセッサと第2のプロセッサとの間で関数コールバック要求を実現するためのシステムが提供される。システムは、第1及び第2のプロセッサに結合された共有仮想メモリ(SVM)を含んでもよく、SVMは、少なくとも1つの両端キュー(Deque)を記憶するように構成される。この例のシステムはまた、第1のプロセッサの実行ユニット(EU)を含んでもよく、EUは、Dequeのうち第1のDequeに関連し、コールバック要求を第1のDequeにプッシュするように構成される。この例のシステムは、第1のDequeからコールバック要求の1つをポップし、ポップされたコールバック要求により指定された関数を実行し、関数の完了に応じてEUへの完了信号を生成するように構成された、第2のプロセッサ上で実行する要求ハンドラスレッドを更に含んでもよい。
【0039】
例2は、例1の対象物を含んでもよく、コールバック要求は、第2のプロセッサにより実行される関数を指定するための関数ポインタと、実行される関数に提供されるデータ及び実行された関数により生成されてEUに提供される結果についてSVMにおける位置を指定するための引数ポインタとを含む。
【0040】
例3は、例1及び2の対象物を含んでもよく、要求ハンドラスレッドは、第1のDequeが空であることを検出したことに応じて、第2のDequeからコールバック要求の1つを更にポップし、第2のDequeは、第2のEUに関連する。
【0041】
例4は、例1~3の対象物を含んでもよく、Dequeは、EU及び要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、SVMにおいてピンされる。
【0042】
例5は、例1~4の対象物を含んでもよく、完了信号は、SVMにおいて完了フラグを設定し、EUは、完了フラグを更にポーリングする。
【0043】
例6は、例1~5の対象物を含んでもよく、完了信号は、EU上で継続カーネルをトリガーし、継続カーネルは、前に保存されたスタック変数を復旧する。
【0044】
例7は、例1~6の対象物を含んでもよく、要求ハンドラスレッドは、Dequeのいずれかからコールバック要求の1つをポップすることに失敗したことに応じて、更にスリープする。
【0045】
例8は、例1~7の対象物を含んでもよく、スリープは、Monitor/Mwait命令の実行を含む。
【0046】
例9は、例1~8の対象物を含んでもよく、第1のプロセッサは、グラフィック処理装置(GPU)であり、第2のプロセッサは、汎用中央処理装置(CPU)である。
【0047】
例10によれば、第1のプロセッサと第2のプロセッサとの間での関数コールバック要求のための方法が提供される。方法は、第1のプロセッサの実行ユニット(EU)により、コールバック要求を第1の両端キュー(Deque)にプッシュするステップであり、Dequeは、第1及び第2のプロセッサに結合された共有仮想メモリ(SVM)に記憶されるステップと、第2のプロセッサ上で実行する要求ハンドラスレッドにより、第1のDequeからコールバック要求の1つをポップするステップと、要求ハンドラスレッドにより、ポップされたコールバック要求により指定された関数を実行するステップと、要求ハンドラスレッドにより、関数の完了に応じてEUへの完了信号を生成するステップとを含んでもよい。
【0048】
例11は、例10の対象物を含んでもよく、コールバック要求は、第2のプロセッサにより実行される関数を指定するための関数ポインタと、実行される関数に提供されるデータ及び実行された関数により生成されてEUに提供される結果についてSVMにおける位置を指定するための引数ポインタとを含む。
【0049】
例12は、例10及び11の対象物を含んでもよく、要求ハンドラスレッドにより、第1のDequeが空であることを検出したことに応じて、第2のDequeからコールバック要求の1つをポップするステップであり、第2のDequeは、第2のEUに関連するステップを更に含む。
【0050】
例13は、例10~12の対象物を含んでもよく、EU及び要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、SVMにおいてDequeをピンするステップを更に含む。
【0051】
例14は、例10~13の対象物を含んでもよく、完了信号を生成するステップは、EUによりポーリングするために、SVMにおいて完了フラグを設定するステップを更に含む。
【0052】
例15は、例10~14の対象物を含んでもよく、完了信号を生成するステップは、EU上で継続カーネルをトリガーするステップであり、継続カーネルは、前に保存されたスタック変数を復旧するステップを更に含む。
【0053】
例16は、例10~15の対象物を含んでもよく、要求ハンドラスレッドにより、Dequeのいずれかからコールバック要求の1つをポップすることに失敗したことに応じて、スリープするステップを更に含む。
【0054】
例17は、例10~16の対象物を含んでもよく、スリープするステップは、Monitor/Mwait命令を実行するステップを更に含む。
【0055】
例18によれば、プロセッサにより実行された場合、第1のプロセッサと第2のプロセッサとの間での関数コールバック要求のための以下の動作を生じる命令を記憶した少なくとも1つのコンピュータ読み取り可能記憶媒体が提供される。動作は、第1のプロセッサの実行ユニット(EU)により、コールバック要求を第1の両端キュー(Deque)にプッシュするステップであり、Dequeは、第1及び第2のプロセッサに結合された共有仮想メモリ(SVM)に記憶されるステップと、第2のプロセッサ上で実行する要求ハンドラスレッドにより、第1のDequeからコールバック要求の1つをポップするステップと、要求ハンドラスレッドにより、ポップされたコールバック要求により指定された関数を実行するステップと、要求ハンドラスレッドにより、関数の完了に応じてEUへの完了信号を生成するステップとを含んでもよい。
【0056】
例19は、例18の対象物を含んでもよく、コールバック要求は、第2のプロセッサにより実行される関数を指定するための関数ポインタと、実行される関数に提供されるデータ及び実行された関数により生成されてEUに提供される結果についてSVMにおける位置を指定するための引数ポインタとを含む。
【0057】
例20は、例18及び19の対象物を含んでもよく、要求ハンドラスレッドにより、第1のDequeが空であることを検出したことに応じて、第2のDequeからコールバック要求の1つをポップするステップであり、第2のDequeは、第2のEUに関連するステップを更に含む。
【0058】
例21は、例18~20の対象物を含んでもよく、EU及び要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、SVMにおいてDequeをピンするステップを更に含む。
【0059】
例22は、例18~21の対象物を含んでもよく、完了信号を生成するステップは、EUによりポーリングするために、SVMにおいて完了フラグを設定するステップを更に含む。
【0060】
例23は、例18~22の対象物を含んでもよく、完了信号を生成するステップは、EU上で継続カーネルをトリガーするステップであり、継続カーネルは、前に保存されたスタック変数を復旧するステップを更に含む。
【0061】
例24は、例18~23の対象物を含んでもよく、要求ハンドラスレッドにより、Dequeのいずれかからコールバック要求の1つをポップすることに失敗したことに応じて、スリープするステップを更に含む。
【0062】
例25は、例18~24の対象物を含んでもよく、スリープするステップは、Monitor/Mwait命令を実行するステップを更に含む。
【0063】
例26によれば、第1のプロセッサと第2のプロセッサとの間での関数コールバック要求のためのシステムが提供される。システムは、第1のプロセッサの実行ユニット(EU)により、コールバック要求を第1の両端キュー(Deque)にプッシュする手段であり、Dequeは、第1及び第2のプロセッサに結合された共有仮想メモリ(SVM)に記憶される手段と、第2のプロセッサ上で実行する要求ハンドラスレッドにより、第1のDequeからコールバック要求の1つをポップする手段と、要求ハンドラスレッドにより、ポップされたコールバック要求により指定された関数を実行する手段と、要求ハンドラスレッドにより、関数の完了に応じてEUへの完了信号を生成する手段とを含んでもよい。
【0064】
例27は、例26の対象物を含んでもよく、コールバック要求は、第2のプロセッサにより実行される関数を指定するための関数ポインタと、実行される関数に提供されるデータ及び実行された関数により生成されてEUに提供される結果についてSVMにおける位置を指定するための引数ポインタとを含む。
【0065】
例28は、例26及び27の対象物を含んでもよく、要求ハンドラスレッドにより、第1のDequeが空であることを検出したことに応じて、第2のDequeからコールバック要求の1つをポップする手段であり、第2のDequeは、第2のEUに関連する手段を更に含む。
【0066】
例29は、例26~28の対象物を含んでもよく、EU及び要求ハンドラによるアクセス試行に応じてページフォールトを妨げるために、SVMにおいてDequeをピンする手段を更に含む。
【0067】
例30は、例26~29の対象物を含んでもよく、完了信号を生成する手段は、EUによりポーリングするために、SVMにおいて完了フラグを設定する手段を更に含む。
【0068】
例31は、例26~30の対象物を含んでもよく、完了信号を生成する手段は、EU上で継続カーネルをトリガーする手段であり、継続カーネルは、前に保存されたスタック変数を復旧する手段を更に含む。
【0069】
例32は、例26~31の対象物を含んでもよく、要求ハンドラスレッドにより、Dequeのいずれかからコールバック要求の1つをポップすることに失敗したことに応じて、スリープする手段を更に含む。
【0070】
例33は、例26~32の対象物を含んでもよく、スリープする手段は、Monitor/Mwait命令を実行する手段を更に含む。
【0071】
ここで使用されている用語及び表現は、限定ではなく、説明に関して使用されており、このような用語及び表現の使用において、図示及び記載した機能(又はその一部)のいずれかの均等物を除外する意図は存在せず、特許請求の範囲内において様々な変更が可能であることが分かる。したがって、特許請求の範囲は、全てのこのような均等物をカバーすることを意図する。様々な機能、態様及び実施例についてここで説明した。当業者により理解できるように、機能、態様及び実施例は、相互の組み合わせ並びに変更及び変形が可能である。したがって、この開示は、このような組み合わせ、変更及び変形を含むものと考えられるべきである。
図1
図2
図3
図4
図5
図6
図7