(57)【特許請求の範囲】
【請求項１】
コンピュータによってマルチスレッドコンピューティングを実行する方法であって、
プロデューサカーネルとコンシューマカーネルとの間の１つ以上のチャネルを定義することと、
前記プロデューサカーネルを定義することであって、前記プロデューサカーネルは、前記１つ以上のチャネルにデータを書き込むように構成されている、ことと、
前記コンシューマカーネルを定義することであって、前記コンシューマカーネルは、前記１つ以上のチャネルから前記データを読み出すように構成されている、ことと、
１つ以上のチャネルイベントを登録することであって、各チャネルイベントは、前記１つ以上のチャネルのうちの１つのチャネルに関連付けられており、関連付けられたチャネルのチャネル条件が満たされたことに応じて前記コンシューマカーネルを起動するために登録される、ことと、
前記チャネルイベントに関連付けられたチャネルの前記チャネル条件が満たされたことに応じて、前記１つ以上のチャネルイベントのうちの１つのチャネルイベントに関連付けられたチャネルから前記データを消費するために、前記コンシューマカーネルを起動することであって、前記コンシューマカーネルは、前記コンシューマカーネルのブロッキングを防止してシステムリソースを使用するために、前記チャネル条件に応じて必要とされた場合にのみ起動される、ことと、
前記コンシューマカーネルにおいて、前記チャネルイベントに関連付けられたチャネルから前記データを読み出して消費することと、
システムリソースを解放するために、前記チャネルイベントに関連付けられたチャネルからの前記データの読み出し及び消費の完了に基づいて前記コンシューマカーネルを終了することと、
を含む、方法。
【請求項２】
前記データの少なくとも１つのブロックが前記チャネル内に存在する場合に、前記チャネルイベントに関連付けられたチャネルのチャネル条件を満たす、請求項１に記載の方法。
【請求項３】
前記チャネルイベントに関連付けられたチャネルが満杯である場合に、前記チャネル条件を満たす、請求項１に記載の方法。
【請求項４】
実行時に前記１つ以上のチャネルを処理ユニットのメモリユニットに割り当てることをさらに含む、請求項１に記載の方法。
【請求項５】
前記１つ以上のチャネルイベントを監視し、前記コンシューマカーネルの前記起動をトリガするように構成されたハードウェアスケジューリングシステムを実行することをさらに含む、請求項１に記載の方法。
【請求項６】
命令が記憶されたコンピュータ可読記憶デバイスであって、前記命令は、コンピューティングデバイスによって実行されると、前記コンピューティングデバイスに、
プロデューサカーネルとコンシューマカーネルとの間の１つ以上のチャネルを定義することと、
前記プロデューサカーネルを定義することであって、前記プロデューサカーネルは、前記１つ以上のチャネルにデータを書き込むように構成されている、ことと、
前記コンシューマカーネルを定義することであって、前記コンシューマカーネルは、前記１つ以上のチャネルから前記データを読み出すように構成されている、ことと、
１つ以上のチャネルイベントを登録することであって、各チャネルイベントは、前記１つ以上のチャネルのうちの１つのチャネルに関連付けられており、関連付けられたチャネルのチャネル条件が満たされたことに応じて前記コンシューマカーネルを起動するために登録される、ことと、
前記チャネルイベントに関連付けられたチャネルの前記チャネル条件が満たされたことに応じて、前記１つ以上のチャネルイベントのうちの１つのチャネルイベントに関連付けられたチャネルから前記データを消費するために、前記コンシューマカーネルを起動することであって、前記コンシューマカーネルは、前記コンシューマカーネルのブロッキングを防止してシステムリソースを使用するために、前記チャネル条件に応じて必要とされた場合にのみ起動される、ことと、
前記コンシューマカーネルにおいて、前記チャネルイベントに関連付けられたチャネルから前記データを読み出して消費することと、
システムリソースを解放するために、前記チャネルイベントに関連付けられたチャネルからの前記データの読み出し及び消費の完了に基づいて前記コンシューマカーネルを終了することと、
を含む動作を行わせる、コンピュータ可読記憶デバイス。
【請求項７】
前記データの少なくとも１つのブロックが前記チャネル内に存在する場合に、前記チャネルイベントに関連付けられたチャネルのチャネル条件を満たす、請求項６に記載のコンピュータ可読記憶デバイス。
【請求項８】
前記チャネルイベントに関連付けられたチャネルが満杯である場合に、前記チャネル条件を満たす、請求項６に記載のコンピュータ可読記憶デバイス。
【請求項９】
前記動作は、
実行時に前記１つ以上のチャネルを処理ユニットのメモリユニットに割り当てることをさらに含む、請求項６に記載のコンピュータ可読記憶デバイス。
【請求項１０】
前記動作は、
前記１つ以上のチャネルイベントを監視し、前記コンシューマカーネルの前記起動をトリガするように構成されたハードウェアスケジューリングシステムを実行することをさらに含む、請求項６に記載のコンピュータ可読記憶デバイス。
【請求項１１】
モジュールを記憶するように構成されたメモリと、
前記モジュールを処理するように構成された１つ以上のプロセッサと、
を備えるシステムであって、
前記モジュールは、
１つ以上のチャネルを定義するように構成されたモジュールと、
前記１つ以上のチャネルにデータを書き込むように構成されたプロデューサカーネルと、
前記１つ以上のチャネルから前記データを読み出すように構成されたコンシューマカーネルと、
１つ以上のチャネルイベントを登録するように構成された登録モジュールであって、各チャネルイベントは、前記１つ以上のチャネルのうちの１つのチャネルに関連付けられており、関連付けられたチャネルのチャネル条件が満たされたことに応じて前記コンシューマカーネルを起動するために登録される、登録モジュールと、を備え、
前記コンシューマカーネルは、前記チャネルイベントに関連付けられたチャネルの前記チャネル条件が満たされたことに応じて、前記１つ以上のチャネルイベントのうちの１つのチャネルイベントに関連付けられたチャネルから前記データを消費することであって、前記コンシューマカーネルは、前記コンシューマカーネルのブロッキングを防止してシステムリソースを使用するために、前記チャネル条件に応じて必要とされた場合にのみ起動される、ことと、システムリソースを解放するために、前記チャネルからの前記データの読み出し及び消費の完了に基づいて終了することと、を行うように構成されている、
システム。
【請求項１２】
前記データの少なくとも１つのブロックが前記１つ以上のチャネル内に存在する場合に、前記チャネルイベントに関連付けられたチャネルのチャネル条件を満たす、請求項１１に記載のシステム。
【請求項１３】
前記チャネルイベントに関連付けられたチャネルが満杯である場合に、前記チャネル条件を満たす、請求項１１に記載のシステム。
【請求項１４】
実行時に前記１つ以上のチャネルを前記１つ以上のプロセッサのメモリユニットに割り当てるように構成された割り当てモジュールをさらに備える、請求項１１に記載のシステム。
【請求項１５】
前記１つ以上のチャネルイベントを監視し、前記コンシューマカーネルの前記起動をトリガするように構成されたハードウェアスケジューリングシステムをさらに備える、請求項１１に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、ソフトウェアプログラミングに関し、より具体的には、マルチスレッドプログラミング技術に関する。
【背景技術】
【０００２】
多くの高性能コンピューティングアプリケーションは、マルチスレッディング技術を用いて記述されている。マルチスレッディング技術を用いた場合には、複数の実行スレッドが、処理パイプラインに対して同時に又は交互にアクセスすることによって、異なるタスクにおいて作業することができる。例えば、１つのタスクを２つの別個のサブタスクに分解することができる場合には、それぞれ異なるサブタスクを処理する２つの別個のスレッドを作成することが有用であり得る。これらのスレッドは、次いで、各々の対応する結果を生成し、この結果は、合わせてタスク全体を解決する。
【０００３】
作業をタスクに割り当てるための異なる技術が存在する。１つの手法は、一般に、「プロデューサ−コンシューマ設計」と称されている。プロデューサ−コンシューマ設計手法では、１つ以上のスレッドが、データを生成する役割を果たし、１つ以上のスレッドが、生成したデータを消費する役割を果たす。一例として、プロデューサスレッドは、ファイルからのデータを、コンシューマスレッドによってアクセス可能なメモリ領域に読み込む役割を果たす。コンシューマスレッドは、そのメモリ領域からデータを検索し、必要に応じて当該データを処理（消費）する。
【０００４】
コンシューマスレッドの役割がより複雑になると、一般的に、コンシューマスレッドのリソース要件もより複雑になる。プロデューサ−コンシューマ設計手法において、コンシューマスレッドは、データがプロデューサスレッドからメモリ領域に到着したときに、データを処理するために利用可能である。コンシューマスレッドをメモリ内に常駐させたままにするという要件は、過剰なリソースの活用を必要とする。また、アクティブメモリの内外でコンシューマスレッドをスワップすることは、メモリ領域が空であるときにコンシューマスレッドがいかなる動作を行わない場合であっても、（例えば、過剰な処理サイクル、完了までの時間、電力、および、他の態様に関して）コストがかかる。
【０００５】
したがって、コンシューマスレッドのリソース要件を低減させるための技術が望まれている。
【発明の概要】
【課題を解決するための手段】
【０００６】
本発明の一実施形態は、チャネルを定義することと、前記チャネルからデータを読み出すように構成されたコンシューマカーネルを定義することと、データを前記チャネルに書き込むように構成されたプロデューサカーネルを定義することと、前記チャネルの条件を満たす場合にコンシューマカーネルを起動するように構成されたチャネルイベントを登録することとを含む、方法を含む。
【０００７】
本発明の別の実施形態は、命令が記憶されたコンピュータ可読記憶デバイスを含む。前記命令は、コンピューティングデバイスによって実行されると、コンピューティングデバイスに、チャネルを定義することと、前記チャネルからデータを読み出すように構成されたコンシューマカーネルを定義することと、データを前記チャネルに書き込むように構成されたプロデューサカーネルを定義することと、前記チャネルの条件を満たす場合にコンシューマカーネルを起動するように構成されたチャネルイベントを登録することと、を含む動作を行わせる。
【０００８】
本発明のさらなる実施形態は、システムを含む。前記システムは、モジュールを記憶するように構成されたメモリと、前記モジュールを処理するように構成された１つ以上のプロセッサとを有する。前記モジュールは、チャネルと、前記チャネルからデータを読み出すように構成されたコンシューマカーネルと、データを前記チャネルに書き込むように構成されたプロデューサカーネルと、前記チャネルの条件を満たす場合にコンシューマカーネルを起動するように構成されたチャネルイベントを登録するように構成された登録モジュールとを備える。
【０００９】
本発明のさらなる特徴および利点、ならびに、本発明の様々な実施形態の構造および動作は、添付図面を参照して以下に詳細に説明される。本発明は、本明細書に記載される特定の実施形態に限定されないことに留意されたい。このような実施形態は、単に例示の目的で本明細書に提示されている。追加の実施形態は、本明細書に包含される教示に基づき、当業者において明らかとなるであろう。
【００１０】
本明細書に組み込まれ、本明細書の一部を構成する添付図面は、本発明の実施形態を示し、または、明細書とともにさらに本発明の原理を説明することで、当業者が本発明を実施し、使用することを可能にする役割を果たす。
【図面の簡単な説明】
【００１１】
【図１】従来の技術を用いた例示的なマルチスレッドアプリケーションを示す図である。
【図２】本発明の一実施形態によるマルチスレッドアプリケーションを示す図である。
【図３】本発明の一実施形態によるマルチスレッドアプリケーションを開発する動作を示すフローチャートである。
【図４】本発明の一実施形態による拡張チャネルおよびイベント処理の動作を示すフローチャートである。
【図５】本発明の一実施形態による例示的なプロデューサ−コンシューマ実装と一致するコンシューマカーネルの動作を示すフローチャートである。
【図６】本発明の実施形態が実現され得る例示的なコンピュータシステムを表す図である。
【発明を実施するための形態】
【００１２】
以下、添付図面を参照して、本発明を説明する。図において、全般的に、同一の参照番号は、同一または機能的に類似する要素を示す。加えて、全般的に、図面において、参照番号の左端の数字は、参照番号が最初に現れる図面を識別する。
【００１３】
以下の本発明の詳細な説明では、本発明に一致する例示的な実施形態を示す添付図面を参照する。他の実施形態が可能であり、また、本発明の趣旨および範囲の範囲内で、実施形態に対して修正が行われ得る。したがって、詳細な説明は、本発明を限定することを意味しない。むしろ、本発明の範囲は、添付の特許請求の範囲によって定義される。
【００１４】
当業者には、本発明の態様が、以下に説明されるように、図面で示されるソフトウェア、ハードウェア、ファームウェアおよび／またはエンティティの多くの異なる実施形態で実現できることが明らかになるであろう。本発明を実現するためのハードウェアの特殊な制御を伴ういかなる実際のソフトウェアコードも、本発明を限定しない。したがって、本発明の動作挙動は、本明細書で提示される詳細のレベルを考慮して、実施形態の修正および変形が可能であるという了解の下で説明される。
【００１５】
加えて、当業者には明らかであるように、本発明の種々の実施形態のシミュレーション、合成および／または製造は、汎用プログラミング言語（ＣまたはＣ＋＋等）、Ｖｅｒｉｌｏｇ  ＨＤＬ、ＶＨＤＬ、Ａｌｔｅｒａ  ＨＤＬ（ＡＨＤＬ）等を含むハードウェア記述言語（ＨＤＬ）、または、他の利用可能なプログラミングツールおよび／もしくは図式的なキャプチャツール（例えば回路キャプチャツール等）を含む（上述した）コンピュータ可読コードの使用を通して、部分的に達成され得る。このコンピュータ可読コードは、半導体、磁気ディスク、光ディスク（例えばＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ等）を含む、任意の既知のコンピュータ使用可能な媒体内に、および、コンピュータ使用可能な（例えば、読み出し可能な）伝送媒体（搬送波、または、デジタル、光もしくはアナログに基づく媒体を含む任意の他の媒体等）内で具体化されるコンピュータデータ信号として、配置することができる。よって、コードは、インターネットおよびインターネットを含む通信ネットワークを通じて伝送することができる。上記のシステムおよび技術によって達成される機能および／または提供される構造は、プログラムコードで具体化されるコア（例えばグラフィックス処理ユニット（ＧＰＵ）コア等）で表すことができること、および、集積回路の製造の一部としてハードウェアに変換され得ることを理解されたい。認識されるように、他のタイプのコアまたは処理ユニットは、本発明の態様を具体化する機能および／または構造を提供することができる。これらの処理ユニットとしては、例えば、中央処理ユニット（ＣＰＵ）、上述したグラフィックス処理ユニット、デジタル信号プロセッサ、アプリケーションプロセッサ等が挙げられる。
【００１６】
本明細書および特許請求の範囲におけるモジュールに対する言及は、指示された機能を行うためのハードウェアまたはソフトウェア構成要素の任意の組み合わせを意味する。モジュールは、厳密に定義されたエンティティである必要はなく、したがって、複数のモジュールでは、機能性においてハードウェアおよびソフトウェア構成要素が重複し得る。例えば、ソフトウェアモジュールは、プロシージャ内の単一行のコードを指してもよく、該プロシージャは、それ自体が別個のソフトウェアモジュールである。当業者は、例えば、モジュールの機能が、いくつかの文体的または性能最適化技術に従って定義され得ることを理解するであろう。
【００１７】
図１は、従来の技術を用いた例示的なマルチスレッドアプリケーション１００を示す図である。この実施例では、ステップ１０２で、主プロセスがスレッドを生じ、具体的には、１つ以上のプロデューサスレッドおよび１つ以上のコンシューマスレッドが、プロデューサ−コンシューマ設計手法に従って生成される。当業者は、他のスレッディングモデルが存在し本開示に関連すること、ならびに、プロデューサ−コンシューマ設計手法が、本開示のこの箇所および他の箇所で一例として使用されることを認識するであろう。
【００１８】
ステップ１０４で、プロデューサスレッドには、データを発生させるタスクが与えられる。例えば、プロデューサスレッドは、ファイルまたはデータベースからデータを読み出し得る。このデータは、例えば一組の行で構成されたグラフィック等のような、アプリケーション１００が処理するように構成された何らかのデータであり得る。この実施例では、グラフィックファイルからの１行または他の一組のデータの処理を、他の複数行または複数組のデータの処理と並列に扱うことができると仮定する。
【００１９】
ステップ１０６で、プロデューサは、データを配置するために、バッファ１１２に空きがあるかどうかを判定する。空きがない場合、ステップ１０８で示されるように、プロデューサは、空きが利用可能になるまで待機する。リソースが利用可能になるまで、スレッドがさらなる処理を行うことができないというこの待機状態は、ときには、「ブロッキング」として知られている。ブロッキングの間、スレッドは、いかなる有用な作業も行わないにもかかわらず、システムリソースを使用し続けることになる。
【００２０】
リソース（この場合では、バッファ１１２）が利用可能になると、ステップ１１０で、プロデューサは、データをバッファ１１２に配置する。プロデューサは、次いで、ステップ１０４に戻り、引き続き、任意の追加的なデータ（例えば、グラフィックファイルからの追加的な画像ライン）を生成する。
【００２１】
コンシューマスレッドには、プロデューサによってバッファ１１２に配置されたデータを処理するタスクが与えられる。プロデューサ−コンシューマ設計手法では、複数のプロデューサおよび複数のコンシューマを使用することができるが、コンシューマスレッドは、より時間のかかる処理の原因となるので、実際には、コンシューマは、プロデューサよりも数が多い傾向がある。
【００２２】
プロデューサ−コンシューマ設計手法のこの実施例を続けると、コンシューマスレッドは、グラフィックファイルからの個々の行または他の組のデータに対して作業を行うために提供される。一実施形態において、コンシューマスレッドは、真の並列動作で、グラフィックファイルからの他のデータとは独立にこの作業を行うことができる。例えば、コンシューマスレッドは、グラフィックの色空間（１ピクセルあたりに割り当てられたビット）を低減させるために使用されてもよく、それぞれが、グラフィックの対応するデータに対してそのように行うことができる。ここでも、当業者は、本願が一例として提供されるものであり、限定するものではないことを認識するであろう。
【００２３】
その作業を行うために、ステップ１１４で、コンシューマスレッドは、作業を行うデータがバッファ１１２にあるかどうかを判定する。利用可能ないかなるデータもない場合には、コンシューマスレッドは、続けることができず、ステップ１１６で示されるように、待機（ブロック）しなければならない。上述したように、コンシューマスレッドは、バッファ１１２でデータが利用可能になるまでのブロッキングの間、システムリソースを利用し続けることになる。
【００２４】
スレッドブロッキングのための種々の機構が存在する。例えば、スレッドは、条件をテストし、その条件を満たすまでブロックすることができる（例えば、バッファがデータを有するかどうかのテスト、ロックのためのテスト等）。その条件を満たす場合に、次いで、スレッドを続けることができる。この場合、スレッドは、ステップ１１８に進み、バッファ１１２からデータを検索する。スレッドは、次いで、ステップ１２０で、データを処理する（例えば、１行のグラフィックデータの色空間を低減させる）ことによって、データを消費する。コンシューマスレッドは、次いで、ステップ１１４に戻り、追加的な作業ができる状態にある。
【００２５】
方法１００で説明されるこの手法による重大な問題は、いかなる有用な作業も行われていなくても、ブロッキング状態（例えば、上記のステップ１０８，１１６）にある間、スレッドによってかなりのリソースが利用されることである。これは、コンテキスト切り替えプロセッサにおいて、ブロックされたスレッドを処理パイプラインから切り替えて、他のスレッドが処理リソースの一部を利用することを可能にすることによって、ある程度改善することができる。そうであっても、コンテキスト切り替えは、切り替えられたスレッドについてスレッド１つあたりの状態情報の保持を必要とし、よって、それらの状態情報が元に切り替えられるときに、それらは保持される。また、それでも、マルチスレッドプログラミングを行うことができる多数のＧＰＵ等の全てのプロセッサが、必要なコンテキスト切り替え動作を行うことができるわけではない。
【００２６】
その結果、空のチャネルに対する読み出しスレッドのブロッキングの間、１つのスレッドが書き込み、別のスレッドが読み出すという従来の実装は、効率的な手法ではない。これは、システムリソースを占有する長時間続くスレッドにつながり、スケジューラによって切り替える必要があり得る。加えて、切り替えた場合であっても、これらのスレッドは、スレッド１つあたりの状態情報を保持するために、リソースを消費し続ける。
【００２７】
図２は、本発明の一実施形態によるマルチスレッドアプリケーション２００を示す図である。マルチスレッドアプリケーション２００、および、これによって具体化される技術は、スレッドブロッキングと関連付けられた従来のリソース利用問題の非効率性に対する解決策を提供する。また、本明細書の議論は、プロデューサ−コンシューマモデルに照らして提示されるが、当業者は、ブロッキングが起こり得る他のマルチスレッディングモデルに対するこの手法の適用性を認識するであろう。
【００２８】
マルチスレッドアプリケーション２００は、本発明の一実施形態によるプロデューサカーネル２０２およびコンシューマカーネル２０８を提供する。非限定的な例として、本明細書での実装の詳細は、Ｋｈｒｏｎｏｓ  Ｇｒｏｕｐによって開発されたＯｐｅｎＣＬ（登録商標）並列プログラミング規格に照らして論じられる。しかしながら、当業者は、他の開発プラットフォームに対するこれらの技術の適用性を認識するであろう。
【００２９】
プロデューサカーネル２０２およびコンシューマカーネル２０８は、ＯｐｅｎＣＬ（登録商標）「カーネル」用語を用いた、プロデューサタスクおよびコンシューマタスクの各々に対応するコードブロックである。ＯｐｅｎＣＬ（登録商標）において、カーネルは、１つのスレッドまたは一組の並列スレッドによって扱われるタスクである。ＯｐｅｎＣＬ（登録商標）ランタイムは、コマンドキューで実行されるようにカーネルを配置し、特定のデバイスで実行するためのカーネル（スレッド）をキューイングする。ＯｐｅｎＣＬ（登録商標）の柔軟性は、ＣＰＵおよびＧＰＵの双方を含む多数の処理デバイスに対するカーネルのキューイングを可能にする。認識されるように、ＯｐｅｎＣＬ（登録商標）以外のＡＰＩも用いることができる。例えば、マイクロソフト（登録商標）によるＤｉｒｅｃｔＣｏｍｐｕｔｅ（商標）は、使用可能な別のＡＰＩである。
【００３０】
プロデューサカーネル２０２およびコンシューマカーネル２０８によるデータフローを示すために、図２はさらに、本発明の一実施形態によるプロデューサキュー２０４およびコンシューマキュー２１０の使用を示す。プロデューサキュー２０４は、文字通りのキューである必要はなく、むしろ、本発明の一実施形態による１つ以上のコンシューマカーネル２０８として実行するための作業を提供するために、プロデューサカーネル２０２を読み出す、ある種のデータソースである。上記の実施例に戻って参照すると、グラフィックデータのラインを含むファイルは、プロデューサキュー２０４として処理することができ、プロデューサカーネル２０２は、ファイルからグラフィックデータのラインを読み出す。当業者は、他のデータソースを利用することができること、および、プロデューサキュー２０４が、一例として提供されるものであって限定するものではないことを認識するであろう。
【００３１】
同様に、コンシューマキュー２１０は、文字どおりのキューである必要はなく、むしろ、本発明の一実施形態によるコンシューマカーネル２０８によって処理されるいくつかの作業先を表す。上記の実施例に戻って参照すると、各コンシューマカーネル２０８は、本発明の一実施形態に従って、コンシューマキュー２１０からグラフィックデータの個々のラインを取り出し、それを処理する。複数のコンシューマカーネル２０８の各々は、同様に作業を行うことができる。当業者は、コンシューマカーネル２０８に対して作業の他のソースが使用され得ること、および、コンシューマキュー２１０が、一例として提供されるものであって限定するものではないことを認識するであろう。
【００３２】
図１の簡単なバッファの実施例を使用する代わりに、本発明の一実施形態によるマルチスレッドアプリケーション２００は、チャネル２０６を導入する。チャネル２０６は、サポート機能性とともに、コンシューマスレッドによるブロッキングを除去する能力を提供する。
【００３３】
チャネル２０６は、単一のバッファまたはキューではなく、代わりに、チャネルに関連するカーネル起動トリガの登録を可能にする、プロデューサカーネル２０２とコンシューマキュー２０８との間のより精巧な通信経路を提供する。このカーネル起動トリガは、コンシューマキュー２０８に作業が存在する等の条件を満たす場合に、コンシューマカーネル２１０を起動する。
【００３４】
図３は、本発明の一実施形態による本手法を利用するためにマルチスレッドアプリケーションを開発する動作を示す方法３００のフローチャートである。方法は、ステップ３０２から始まり、ステップ３０４に進み、そこでは、プロデューサカーネルが定義される。非限定的な例として、本明細書で開示される新規なチャネルおよびイベント処理概念に適応するように拡張されたＯｐｅｎＣＬ（登録商標）構文を使用すると、プロデューサカーネルは、以下の様式で定義することができる。
0006336399.tif 000002
【００３５】
この例示的なプロデューサカーネルでは、２つの別個のチャネルが書かれている。各チャネルは、この実施例においてデータ値が５よりも大きいかどうか等の条件が与えられるプロデューサカーネルによって、配列「ａ」（すなわち、プロデューサキュー２０４）から検索されるデータでポピュレートされる。
【００３６】
ステップ３０６で、本発明の一実施形態によるコンシューマカーネルが定義される。拡張ＯｐｅｎＣＬ（登録商標）構文を有する上記の非限定的な実施例を続けると、コンシューマカーネルは、使用されている各チャネル（チャネルｂおよびｃ）について定義される。本発明の一実施形態において、これらのコンシューマカーネルは、以下の様式で定義される。
0006336399.tif 000003
【００３７】
上の例示的なコンシューマカーネルにおいて、各カーネルは、それぞれのチャネルから整数値を読み出し、その値をグローバルな整数値（すなわち、コンシューマキュー２１０）に加えるという、類似したタスクを行う。
【００３８】
ステップ３０８で、本発明の一実施形態によるチャネルが定義される。ステップ３１０で、チャネルの一定の条件を満たす場合に、チャネルイベントがトリガアクションに登録される。
【００３９】
拡張ＯｐｅｎＣＬ（登録商標）構文による上記の非限定的な実施例を続けると、ステップ３０８で、対応するイベントトリガとともに、２つのチャネル（ｃｈａｎｎｅｌＢおよびｃｈａｎｎｅｌＣ）が定義される。これらのチャネルおよびイベントは、以下の様式で定義することができる。
0006336399.tif 000004
【００４０】
上記の実施例において、チャネルは、特定のチャネル条件を満たす場合に使用するために、あるサイズパラメータおよびイベントハンドラの指示によって作成される。非限定的な例として、ＯｐｅｎＣＬ（登録商標）用のコンパイラ等のプログラミング言語コンパイラは、以下の関数によって、上述したようなチャネルオブジェクトの作成を扱うように拡張される。
0006336399.tif 000005
【００４１】
この例示的な非限定的な定義において、パラメータは、以下の使用法をとる。
・ｃｏｎｔｅｘｔは、チャネルオブジェクトを作成するために使用される有効なＯｐｅｎＣＬ（登録商標）コンテキストである
・ｆｌａｇｓは、作成されているチャネルメモリオブジェクトに関する情報の割り当ておよび使用法を指定するために使用されるビットフィールドである
・ｎｕｍｂｅｒ＿ｏｆ＿ｅｌｅｍｅｎｔｓは、要素の数を指す
・ｅｌｅｍｅｎｔ＿ｓｉｚｅは、要素タイプのバイト単位のサイズである
・ｂｌｏｃｋ＿ｓｉｚｅは、その後にＣＬ＿ＣＨＡＮＮＥＬ＿ＢＬＯＣＫ＿ＲＥＡＤＹ状態がブロック準備イベントに設定される要素の数である
・ｅｒｒｃｏｄｅ＿ｒｅｔは、適切なエラーコードを返し、ｅｒｒｃｏｄｅ＿ｒｅｔがＮＵＬＬである場合は、いかなるエラーコードも返さない
【００４２】
例示的な非限定的な定義を続けると、ｅｒｒｃｏｄｅ＿ｒｅｔは、関数が成功裏に実行された場合に、条件ＣＬ＿ＳＵＣＣＥＳＳを返すために利用することができ、または、以下の例示的なエラー値のうち１つのエラー値を有するＮＵＬＬ値を返す。
・ＣＬ＿ＩＮＶＡＬＩＤ＿ＣＯＮＴＥＸＴ  コンテキストが有効なコンテキストでない場合
・ＣＬ＿ＩＮＶＡＬＩＤ＿ＶＡＬＵＥ  フラグで指定された値が有効でない場合
・ＣＬ＿ＩＮＶＡＬＩＤ＿ＣＨＡＮＮＥＬ＿ＳＩＺＥ  サイズがＣＬ＿ＤＥＶＩＣＥ＿ＣＨＡＮＮＥＬ＿ＭＡＸ＿ＳＩＺＥで指定された値を超えた場合
・ＣＬ＿ＭＥＭ＿ＯＢＪＥＣＴ＿ＡＬＬＯＣＡＴＩＯＮ＿ＦＡＩＬＵＲＥ  メモリを画像オブジェクトに割り当てることに不具合がある場合
・ＣＬ＿ＩＮＶＡＬＩＤ＿ＯＰＥＲＡＴＩＯＮ  チャネルをサポートするコンテキスト内にいかなるデバイスもない場合
・ＣＬ＿ＯＵＴ＿ＯＦ＿ＲＥＳＯＵＲＣＥＳ  デバイス上のＯｐｅｎＣＬ（登録商標）実装によって必要とされるリソースを割り当てることに不具合がある場合
・ＣＬ＿ＯＵＴ＿ＯＦ＿ＨＯＳＴ＿ＭＥＭＯＲＹ  ホスト上のＯｐｅｎＣＬ（登録商標）実装によって必要とされるリソースを割り当てることに不具合がある場合
【００４３】
イベントトリガが定義され、それらの対応するチャネルと関連付けられることにより、当該イベントトリガは、ステップ３１０で、特定のイベント条件を満たす場合に登録される。上記の非限定的な例を続けると、以下の様式で２つのイベントトリガが登録される。
0006336399.tif 000006
【００４４】
上記の例示的なイベントトリガ登録は、ＣＬ＿ＣＨＡＮＮＥＬ＿ＢＬＯＣＫ＿ＲＥＡＤＹ条件に対してトリガし、当該条件は、上述したように、ｃｌＣｒｅａｔｅＣｈａｎｎｅｌに渡されたｂｌｏｃｋ＿ｓｉｚｅ値で測定したときに、チャネル内に少なくとも１つのデータのブロックがある場合に設定される。代わりに、別のイベント、ＣＬ＿ＣＨＡＮＮＥＬ＿ＦＵＬＬを他のアプリケーションに利用することができ、当該イベントは、チャネルのサイズ値で測定したときに、チャネルが満杯である場合に設定される。当業者は、イベントトリガ関数を、所望に応じて拡張することができること、および、これらのイベントが、一例として提供されるものであって限定するものではないことを認識するであろう。
【００４５】
ＯｐｅｎＣＬ（登録商標）の場合、イベントトリガの作成は、本発明の一実施形態による関数ｃｌＡｄｄＥｖｅｎｔＴｒｉｇｇｅｒを定義することによって扱われる。この関数の例示的な非限定的な定義は、次のようになる。
0006336399.tif 000007
【００４６】
この例示的な非限定的な定義において、パラメータは、以下の使用法をとる。
・ｑｕｅｕｅは、カーネルがエンキュー（ｅｎｑｕｅｕｅｄ）される有効なＯｐｅｎＣＬ（登録商標）コマンドキューである
・ｋｅｒｎｅｌは、キューを加える有効なＯｐｅｎＣＬ（登録商標）カーネルである
・イベントリスト内のｎｕｍ＿ｅｖｅｎｔｓは、トリガを評価するために検査されるイベントの数を指す
・ｅｖｅｎｔ＿ｔｒｉｇｇｅｒ＿ｓｔａｔｅは、カーネルの起動が起こる１組の有効な状態に対する状態マスクであり、上記の新しい状態の追加を伴う通常の１組のＯｐｅｎＣＬ（登録商標）イベント状態からのものであり得る
・ｅｖｅｎｔは、起動したカーネルの状態を記述するイベントである
【００４７】
方法３００は、次いで、ステップ３１２で終了する。図３および図の他の個所で説明されるステップの順序は、プログラムが、コード内で、種々の順序でおよび種々の場所に現れる定義で書かれ得るため、固定する必要はない。
【００４８】
図４は、本発明の一実施形態による拡張チャネルおよびイベント処理の動作を示す方法４００のフローチャートである。本方法は、ステップ４０２から始まり、ステップ４０４に進み、そこでは、処理されるデータが受け取られ、チャネルに記憶される（例えば、チャネル内のキューに配置される）。ステップ４０６で、チャネルのためのイベントトリガ条件がテストされる。例えば、上述したように、この条件は、ＣＬ＿ＣＨＡＮＮＥＬ＿ＢＬＯＣＫ＿ＲＥＡＤＹ条件であってよく、当該条件は、チャネル内に少なくとも１つのデータのブロックがある場合に設定される。
【００４９】
条件のテストが肯定的であった場合は、ステップ４０８で、本発明の一実施形態による、対応するコンシューマカーネルがコマンドキューにディスパッチされる。上記の実施例において、データのブロックが「ｃｈａｎｎｅｌＢ」で利用可能である場合には、ｋｅｒｎｅｌＢが起動され、データを消費する。本方法は、ステップ４１０で終了する。
【００５０】
この手法の効果は、ブロッキングの間、コンシューマカーネルをアイドル状態にさせ、または、切り替えることを回避することである。代わりに、コンシューマカーネルは、必要なときにだけインスタンス化され、それらの作業が行われた後に終了される。本開示は、オンザフライでコンシューマカーネルを作成する背景でこのアプリケーションを提示しているが、当業者は、本明細書で開示されるチャネルイベント処理を、他のアプリケーションのためのカーネルをディスパッチするために適用することができることを認識するであろう。例えば、イベントトリガは、満杯のチャネルにおいて空きが利用可能になった場合にプロデューサカーネルをディスパッチするために使用することができ、空きを待機している間、プロデューサカーネルのブロッキングを防止する。
【００５１】
図５は、本発明の一実施形態による例示的なプロデューサ−コンシューマ実装と一致するコンシューマカーネルの動作を示す方法５００のフローチャートである。方法は、ステップ５０２から始まり、ステップ５０４へ進み、そこでは、コンシューマカーネルが起動される。本発明の一実施形態によるコンシューマカーネルは、ＯｐｅｎＣＬ（登録商標）実装においてコマンドキューから起動されるが、他のプログラミングモデルにおける特定の実装によってカーネルを起動するための他の技術が使用されてもよい。
【００５２】
ステップ５０６で、コンシューマカーネルは、チャネルからデータを読み出し、ステップ５０８で、データを消費する。データを消費するために必要とされる作業の量は、特定の実装によって変動する。しかしながら、全般的に、データを消費するために個々のコンシューマカーネルによって必要とされるリソースを低減させることが好まれる。コンシューマカーネルがデータに対する作業を完了したときに、ステップ５１０で、コンシューマカーネルが終了して、そのリソースを解放する。方法は、次いで、ステップ５１２で終了する。
【００５３】
本明細書で説明される技術の性能を向上させるために、プログラミング言語コンパイラ（例えば、ＯｐｅｎＣＬ（登録商標）コンパイラ）またはランタイムシステムに対する一定の最適化が、本発明の一実施形態に従って企図される。例えば、コンパイラは、ＧＰＵでの実行のためにコンパイルするとき、実行時に、グローバルメモリ（例えば、ＤＲＡＭ）等のＧＰＵメモリのあるレベルでの表現のために、チャネルを最適化し得る。代替として、チャネルは、ある程度のスレッドの持続を可能にして、メモリ帯域幅に対するトレードオフを提供するために、実行時に、グローバルデータシェア（ＧＤＳ）のＳＲＡＭ構造で、あるいは、コア基準のローカルデータシェア（ＬＤＳ）で表現することもできる。
【００５４】
イベントトリガの効果的な取り扱いは、本発明の一実施形態による、例えば現在のＧＰＵ上の制御プロセッサの拡大版等のハードウェアスケジューリングシステムの実装を通して、さらに促進することができる。スケジューリングシステムは、最小の待ち時間および高い効率でイベントを監視し、ハードウェアからカーネルの起動をトリガするように構成されており、小さいコンシューマブロックの迅速な起動を可能にする。
【００５５】
上述したように、本開示の全体にわたる実装の詳細は、全般的に、ＯｐｅｎＣＬ（登録商標）プログラミングモデルの背景におかれている。しかしながら、本開示によって提供される利点は、他のプログラミングモデルで実現することができる。代替のプログラミングモデルに実装される、上記の実施例に類似する実施例は、以下の通りである。
0006336399.tif 000008
【００５６】
本発明の種々の態様は、ソフトウェア、ファームウェア、ハードウェアまたはそれらの組み合わせによって実装することができる。図６は、本発明またはその一部をコンピュータ可読コードとして実装することの可能な例示的なコンピュータシステム６００を表す図である。例えば、図３のフローチャート３００、図４の４００および図５の５００によって示される方法を、システム６００に実装することができる。本発明の種々の実施形態は、この例示的なコンピュータシステム６００に関して説明される。この説明を読んだ後に、当業者には、他のコンピュータシステムおよび／またはコンピュータアーキテクチャを使用してどのように本発明を実装するのかが明らかになるであろう。
【００５７】
コンピュータシステム６００は、プロセッサ６０４等の１つ以上のプロセッサを含む。プロセッサ６０４は、特殊用途プロセッサまたは汎用プロセッサであってよい。プロセッサ６０４は、通信インフラストラクチャ６０６（例えば、バスまたはネットワーク）に接続されている。
【００５８】
コンピュータシステム６００は、メインメモリ６０８、好ましくはランダムアクセスメモリ（ＲＡＭ）を含み、または、二次メモリ６１０も含み得る。二次メモリ６１０は、例えば、ハードディスクドライブ６１２、リムーバブル記憶ドライブ６１４および／またはメモリースティックを含み得る。リムーバブル記憶ドライブ６１４は、フロッピー（登録商標）ディスクドライブ、磁気テープドライブ、光ディスクドライブ、フラッシュメモリ等を備え得る。リムーバブル記憶ドライブ６１４は、よく知られている様式でリムーバブル記憶ユニット６１７から読み出しおよび／またはリムーバブル記憶ユニット６１７に書き込む。リムーバブル記憶ユニット６１７は、リムーバブル記憶ドライブ６１４によって読み出され、それによって書き込まれる、フロッピー（登録商標）ディスク、磁気テープ、光ディスク等を備え得る。当業者によって認識されるように、リムーバブル記憶ユニット６１７は、コンピュータソフトウェアおよび／またはデータをその中に記憶した、コンピュータ使用可能な記憶媒体を含む。
【００５９】
代替の実現例において、二次メモリ６１０は、コンピュータプログラムまたは他の命令をコンピュータシステム６００にロードすることを可能にするための、他の類似した手段を含み得る。このような手段は、例えば、リムーバブル記憶ユニット６２２およびインターフェース６２０を含み得る。このような手段の例は、プログラムカートリッジおよびカートリッジインターフェース（例えばビデオゲームデバイスで見られるもの等）、リムーバブルメモリチップ（例えばＥＰＲＯＭまたはＰＲＯＭ等）、および、関連するソケット、ならびに、ソフトウェアおよびデータをリムーバブル記憶ユニット６２２からコンピュータシステム６００に転送することを可能にする、他のリムーバブル記憶ユニット６２２およびインターフェース６２０を含み得る。
【００６０】
また、コンピュータシステム６００は、通信インターフェース６２４も含み得る。通信インターフェース６２４は、ソフトウェアおよびデータを、コンピュータシステム６００と外部デバイスとの間で転送することを可能にする。通信インターフェース６２４としては、モデム、ネットワークインターフェース（イーサネット（登録商標）カード等）、通信ポート、ＰＣＭＣＩＡスロットおよびカード等が挙げられる。通信インターフェース６２４を介して転送されるソフトウェアおよびデータは、電子的、電磁気的、光学的であり得る信号、または、通信インターフェース６２４によって受け取ることができる他の信号の形態を有してよい。これらの信号は、通信経路６２６を介して、通信インターフェース６２４に提供される。通信経路６２６は、信号を搬送し、または、ワイヤもしくはケーブル、光ファイバ、電話回線、携帯電話リンク、ＲＦリンクまたは他の通信チャネルを使用して実装され得る。認識されるように、コンピュータシステム６００は、いくつかの異なるフォームファクタまたはタイプのコンピュータシステムで具体化され得る。例えば、本発明の態様は、ハンドヘルドもしくは他のモバイルコンピューティングシステム、セットトップボックス、従来のコンピュータ（例えば、ラップトップ、デスクトップ、サーバ）、タブレット、組み込みシステム、テレビ、オーディオ／ビデオ機器等において具体化され得る。本発明の態様を具体化するコンピュータシステムは、あるシナリオにおいて、コストの低減（例えば、低減し又はより効果的な処理、完了までの時間の低減、電力の低減等）をもたらし得る。
【００６１】
本明細書において、「コンピュータプログラム媒体」および「コンピュータ使用可能な媒体」という用語は、全般的に、リムーバブル記憶ユニット６１７、リムーバブル記憶ユニット６２２、および、ハードディスクドライブ６１２に取り付けられるハードディスク等の媒体を指すために使用される。また、通信経路６２６を通じて搬送される信号は、本明細書で説明される論理も具体化することができる。コンピュータプログラム媒体およびコンピュータ使用可能な媒体は、メモリ半導体（例えば、ＤＲＡＭ等）であってよい、メインメモリ６０８および二次メモリ６１０等のメモリも指す。これらのコンピュータプログラム製品は、ソフトウェアをコンピュータシステム６００に提供するための手段である。
【００６２】
コンピュータプログラム（コンピュータ制御論理とも呼ばれる）は、メインメモリ６０８および／または二次メモリ６１０に記憶される。また、コンピュータプログラムは、通信インターフェース６２４を介して受け取られてよい。そのようなコンピュータプログラムは、実行されたときに、コンピュータシステム６００が、本明細書で論じられる本発明を実装することを可能にする。具体的には、コンピュータプログラムは、実行されたときに、プロセッサ６０４が、上記図３のフローチャート３００、図４の４００、図５の５００によって示される方法のステップ等の、本発明のプロセスを実装することを可能にする。したがって、そのようなコンピュータプログラムは、コンピュータシステム６００のコントローラを表す。ソフトウェアを使用して本発明が実装される場合、当該ソフトウェアは、コンピュータプログラム製品に記憶されてもよく、また、リムーバブル記憶ドライブ６１４、インターフェース６２０、ハードドライブ６１２もしくは通信インターフェース６２４を使用してコンピュータシステム６００にロードされ得る。
【００６３】
また、本発明は、任意のコンピュータ使用可能な媒体に記憶されるソフトウェアを備えるコンピュータプログラム製品も対象とする。このようなソフトウェアは、１つ以上のデータ処理デバイスで実行されたときに、データ処理デバイスを本明細書で説明されるように動作させる。本発明の実施形態では、現在知られている媒体、または、将来の任意のコンピュータ利用可能もしくは読み出し可能な媒体を用いる。コンピュータ使用可能な媒体の例としては、主記憶デバイス（例えば、任意のタイプのランダムアクセスメモリ）、二次記憶デバイス（例えば、ハードドライブ、フロッピー（登録商標）ディスク、ＣＤ−ＲＯＭ、ＺＩＰディスク、テープ、磁気記憶デバイス、光記憶デバイス、ＭＥＭＳ、ナノテクノロジー記憶デバイス等）、および、通信媒体（例えば、有線および無線通信ネットワーク、ローカルエリアネットワーク、ワイドエリアネットワーク、イントラネット等）が挙げられるが、それらに限定されない。
【００６４】
本発明の種々の実施形態を上記のように説明してきたが、これらは一例として提示されたものであり、限定するものではないことを理解されたい。添付の特許請求の範囲において定義される本発明の趣旨および範囲から逸脱することなく、形態および細部の種々の変更が行われ得ることが、当業者によって理解されるであろう。本発明は、これらの実施例に限定されないことを理解されたい。本発明は、本明細書で説明されるように動作する任意の要素に適用することができる。したがって、本発明の広さおよび範囲は、上述した例示的な実施形態のいずれかに限定されるべきではなく、添付の特許請求の範囲およびそれらの均等物によってのみ定義されるべきである。
【図１】
0006336399.tif 000009
【図２】
0006336399.tif 000010
【図３】
0006336399.tif 000011
【図４】
0006336399.tif 000012
【図５】
0006336399.tif 000013
【図６】
0006336399.tif 000014