(57)【特許請求の範囲】
【請求項１】
異種コンピュータ環境において親バッファに関連付けられた複数のサブバッファをコンピュータを用いて管理するコンピュータ制御方法であって、前記コンピュータが、
単一装置で実行される中央処理ユニット及びグラフィック処理ユニットを含む複数の異種コンピュータユニットを用いる処理のために前記親バッファを割当てる処理を実行し、
前記複数のサブバッファの各サブバッファに関し、
(a)複数の異種コンピュータユニットの１つのための特定サブバッファを前記親バッファから作成する処理であって、前記複数の異種コンピュータユニットの各々に対して異なるサブバッファがある当該処理と、
(b)前記特定サブバッファにサブバッファデータを記憶する処理とを実行し、
前記親バッファに関連付けられていない、複数の異種コンピュータユニットの１つに対応する各サブバッファに関し、対応するコンピュータユニットにあるプライベートメモリ内のサブバッファデータへの更新を管理する処理を実行する、ことを含む、コンピュータ制御方法。
【請求項２】
前記プライベートメモリ内のサブバッファデータへの更新を管理する処理は、
前記特定サブバッファのデータを前記特定サブバッファに対応する前記コンピュータユニットのプライベートメモリにコピーする処理と、
前記プライベートメモリ内のサブバッファデータへの更新を追跡する処理と、
前記更新を前記特定サブバッファに送信する処理と、
を含む、請求項１に記載のコンピュータ制御方法。
【請求項３】
前記特定サブバッファに関連付けられたコンピュータユニットが、前記親バッファに関連付けられたコンピュータユニットと同じである場合、
前記特定サブバッファへのポインタを作成し、そのポインタを用いて前記サブバッファにアクセスする処理、
を更に含む、請求項１に記載のコンピュータ制御方法。
【請求項４】
前記親バッファは、一次元バッファ、二次元バッファ、及び三次元バッファからなるグループから選択される、請求項１に記載のコンピュータ制御方法。
【請求項５】
前記親バッファはシステムメモリから構成される、請求項１に記載のコンピュータ制御方法。
【請求項６】
前記親バッファは、OpenCL（登録商標）プラットフォームのバッファである、請求項１に記載のコンピュータ制御方法。
【請求項７】
前記親バッファに関連付けられたコンピュータユニットが中央処理ユニットであり、前記親バッファに関連付けられていないコンピュータユニットがグラフィック処理ユニットである、請求項１に記載のコンピュータ制御方法。
【請求項８】
前記親バッファに関連付けられた前記複数の異種コンピュータユニットの一つに対応するサブバッファは、前記親バッファに関連付けられていない前記複数の異種コンピュータユニットの一つに対応する前記サブバッファとは異なるメモリ領域を占める、請求項１に記載のコンピュータ制御方法。
【請求項９】
異種コンピュータ環境において親バッファに関連付けられた複数のサブバッファを管理する処理を１以上の処理ユニットに実行させる命令を記録した不揮発性のマシーン読み取り可能記録媒体であって、前記１以上の処理ユニットに対し、
単一装置で実行される中央処理ユニット及びグラフィック処理ユニットを含む複数の異種コンピュータユニットを用いる処理のために前記親バッファを割当てる処理と、
前記複数のサブバッファの各サブバッファに関し、
(a)複数の異種コンピュータユニットの１つのための特定サブバッファを前記親バッファから作成する処理であって、前記複数の異種コンピュータユニットの各々に対して異なるサブバッファがある当該処理と、
(b)前記特定サブバッファにサブバッファデータを記憶する処理と、
前記親バッファに関連しない、複数の異種コンピュータユニットの１つに対応する各サブバッファに関し、対応するコンピュータユニットにあるプライベートメモリ内のサブバッファデータへの更新を管理する処理と、を実行させるための命令を記録した不揮発性のマシーン読み取り可能記録媒体。
【請求項１０】
前記プライベートメモリ内のサブバッファデータへの更新を管理する処理は、
前記特定サブバッファのデータを前記特定サブバッファに対応する前記コンピュータユニットのプライベートメモリにコピーする処理と、
前記プライベートメモリ内のサブバッファデータへの更新を追跡する処理と、
前記更新を前記特定サブバッファに送信する処理と、
を含むものである、請求項９に記載のマシーン読み取り可能記録媒体。
【請求項１１】
前記特定サブバッファに関連付けられたコンピュータユニットが、前記親バッファに関連付けられたコンピュータユニットと同じである場合、
前記特定サブバッファへのポインタを作成し、そのポインタを用いて前記サブバッファにアクセスする処理を更に実行させる命令を記録した、請求項９に記載のマシーン読み取り可能記録媒体。
【請求項１２】
前記親バッファは、一次元バッファ、二次元バッファ、及び三次元バッファからなグループから選択される、請求項９に記載のマシーン読み取り可能記録媒体。
【請求項１３】
前記親バッファは、OpenCL（登録商標）プラットフォームのバッファである、請求項９に記載のマシーン読み取り可能記録媒体。
【請求項１４】
前記親バッファに関連付けられたコンピュータユニットが中央処理ユニットであり、前記親バッファに関連付けられていないコンピュータユニットがグラフィック処理ユニットである、請求項９に記載のマシーン読み取り可能記録媒体。
【請求項１５】
前記親バッファに関連付けられた前記複数の異種コンピュータユニットの一つに対応するサブバッファは、前記親バッファに関連付けられていない前記複数の異種コンピュータユニットの一つに対応する前記サブバッファとは異なるメモリ領域を占める、請求項９に記載のマシーン読み取り可能記録媒体。
【請求項１６】
異種コンピュータ環境において親バッファに関連付けられた複数のサブバッファを管理するための装置であって、
単一装置で実行される複数の異種コンピュータユニットを用いる処理のために前記親バッファを割当てる手段であって、前記複数の異種コンピュータユニットは、中央処理ユニット及びグラフィック処理ユニットを含む当該手段と、
前記複数のサブバッファの各サブバッファに関し、
(a)複数の異種コンピュータユニットの１つのための特定サブバッファを前記親バッファから作成するための手段であって、前記複数の異種コンピュータユニットの各々に対して異なるサブバッファがある当該手段と、
(b)前記特定サブバッファにサブバッファデータを記憶する手段と、
前記親バッファに関連しない、複数の異種コンピュータユニットの１つに対応する各サブバッファに関し、対応するコンピュータユニットにあるプライベートメモリ内のサブバッファデータへの更新を管理する手段と、
を備えたことを特徴とする装置。
【請求項１７】
前記プライベートメモリ内のサブバッファデータへの更新を管理する手段は、
前記特定サブバッファのデータを、前記特定サブバッファに対応するコンピュータユニットのプライベートメモリにコピーするための手段と、
前記プライベートメモリ内のサブバッファデータへの更新を追跡するための手段と、    前記更新を前記特定サブバッファに送信するための手段と、
を更に含む、請求項１６に記載の装置。
【請求項１８】
前記特定サブバッファに関連付けられたコンピュータユニットが、前記親バッファに関連付けられたコンピュータユニットと同じである場合、
前記特定サブバッファ内へのポインタを作成し、そのポインタを用いて前記サブバッファにアクセスするための手段を更に備える、請求項１６に記載の装置。
【請求項１９】
前記親バッファは、OpenCL（登録商標）プラットフォームのバッファである、請求項１６に記載の装置。
【請求項２０】
前記親バッファに関連付けられたコンピュータユニットが中央処理ユニットであり、前記親バッファに関連付けられていないコンピュータユニットがグラフィック処理ユニットである、請求項１６に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
（関連出願）
本出願は、全ての開示内容が引用により本明細書に組み入れられる２０１０年５月２０日に出願された同時係属中の米国仮特許出願番号６１／３４６，８６６に基づく優先権の利益を請求する。
【０００２】
（技術分野）
本発明は、一般的に、データ並列コンピュータ計算に関する。より詳細には、本発明は、異種のマルチコンピュータユニット環境におけるバッファに関連付けられるサブバッファオブジェクトを管理することに関する。
【背景技術】
【０００３】
ＧＰＵ（グラフィック処理ユニット）が高性能並列コンピュータ装置への進化を続けるにつれて、汎用コンピュータ装置に類似したＧＰＵにおけるデータ並列コンピュータ計算を実行するために多数のアプリケーションが作成されている。今日、これらのアプリケーションは、コンピュータメーカ固有のインターフェイスを使用した特定のＧＰＵで実行されるよう設計されている。従って、これらのアプリケーションは、ＧＰＵとＣＰＵの両方がデータ処理システムで利用可能である場合でもＣＰＵの処理資源を活用することはできない。これらのアプリケーションが実行されている場合に、種々のコンピュータメーカからのＧＰＵを超えて処理資源を活用することもできない。
【０００４】
しかしながら、より多くのＣＰＵがデータ並列コンピュータ計算を実行するために複数のコアを含むようになるにつれ、利用可能なＣＰＵ及び／又はＧＰＵのいずれかによってより多くの処理タスクをサポートすることができる。従来、ＧＰＵ及びＣＰＵは、互いに互換性のない別々のプログラミング環境によって設定されてきた。多くのＧＰＵは、コンピュータメーカ固有の専用プログラムを必要とする。その結果、アプリケーションにとって、ＣＰＵ及びＧＰＵ双方の処理資源を活用すること、例えば、マルチコアＣＰＵの処理資源と共にデータ並列コンピュータ計算能力を備えたＧＰＵの処理資源を活用することは非常に難しい。
【０００５】
更に、ＣＰＵ及びＧＰＵは別々のメモリアドレス空間を使用する。メモリバッファは、割り当てられてデータを処理するためにＧＰＵのＧＰＵメモリにコピーする必要がある。アプリケーションがデータバッファの領域で動作するためにＣＰＵ及び１つ又はそれ以上のＧＰＵを要求する場合、アプリケーションは、ＣＰＵとＧＰＵとの間で、又は各ＧＰＵにわたって共有されることになるバッファの適切な領域からのデータの割り当て及びコピーを管理する必要がある。
【発明の概要】
【発明が解決しようとする課題】
【０００６】
従って、バッファを共有するＣＰＵ及びＧＰＵの異種混合を有する最新データ処理システムの必要性が存在する。
【課題を解決するための手段】
【０００７】
異種コンピュータユニット間で並列にデータ処理タスクを実行するためにサブバッファを使用する並列コンピュータプログラムのための方法及び装置を説明する。コンピュータユニットは、中央処理ユニット（ＣＰＵ）及びグラフィック処理ユニット（ＧＰＵ）の異種混合を含むことができる。システムは、複数の異種コンピュータユニットの各々に対する親バッファからサブバッファを作成する。サブバッファが親バッファと同じコンピュータユニットに関連付けられていない場合、システムは、サブバッファからのデータをそのコンピュータユニットのメモリにコピーする。システムは、更に、データへの更新を追跡しこれらの更新をサブバッファに転送する。
本発明の他の特徴は、添付の図面から及び以下の詳細な説明から明らかになるであろう。
【０００８】
本発明は、例示的であり、同じ参照番号が同じの構成要素を示す添付図面によって限定されるものではない。
【図面の簡単な説明】
【０００９】
【図１】アプリケーションのためのデータ並列コンピュータ計算を実行するためのＣＰＵ及び／又はＧＰＵを含むコンピュータ装置を構成するためのシステムの１つの実施形態を示すブロック図である。
【図２】複数のスレッドを同時に実行するために並列に動作する複数のコンピュータプロセッサを備えたコンピュータ装置の実施例を示すブロック図である。
【図３】コンピュータ装置識別子を使用して論理コンピュータ装置として構成された複数の物理コンピュータ装置の１つの実施形態を示すブロック図である。
【図４】複数のサブバッファに細分されたバッファの１つの実施形態を示すブロック図である。
【図５】一次元バッファにおける複数のサブバッファの１つの実施形態を示すブロック図である。
【図６】複数のサブバッファに細分された二次元画像の１つの実施形態を示すブロック図である。
【図７】複数のサブバッファに細分された三次元画像の１つの実施形態を示すブロック図である。
【図８】アプリケーションから受信された能力要件に一致させることによってコンピュータ装置識別子を備えた複数の物理コンピュータ装置を構成するための処理の実施形態を示すフローチャートである。
【図９】論理コンピュータ装置でコンピュータ実行命令を実行するための処理の実施形態を示すフローチャートである。
【図１０】複数のコンピュータユニットによってサブバッファを作成し使用するためのランタイム処理の実施形態を示すフローチャートである。
【図１１】内部及び外部従属を有するイベントに関連付けられたコールバックを実行するための処理の１つの実施形態を示すフローチャートである。
【図１２】内部及び外部従属を有するイベントのチェーンの１つの実施形態を示すブロック図である。
【図１３】複数の物理コンピュータ装置で実行されるコンピュータカーネル実行命令のためのコンピュータカーネルソースの実施例を示すサンプルソースコードである。
【図１４Ａ】ＡＰＩを呼び出すことによって複数の物理コンピュータ装置で複数の実行命令の１つを実行するための論理コンピュータ装置を構成するための実施例を示すサンプルソースコードである。
【図１４Ｂ】ＡＰＩを呼び出すことによって複数の物理コンピュータ装置で複数の実行命令の１つを実行するための論理コンピュータ装置を構成するための実施例を示すサンプルソースコードである。
【図１４Ｃ】ＡＰＩを呼び出すことによって複数の物理コンピュータ装置で複数の実行命令の１つを実行するための論理コンピュータ装置を構成するための実施例を示すサンプルソースコードである。
【図１５】本明細書で説明される実施形態に関して使用することができる複数のＣＰＵ及びＧＰＵ（グラフィック処理ユニット）を備えた一般的なコンピュータシステムの１つの実施例を示す図である。
【発明を実施するための形態】
【００１０】
以下に親バッファから作成されたサブバッファを使用するマルチプロセッサでのデータ並列コンピュータ計算のための方法及び装置を説明する。以下の説明では、本発明の実施形態の詳細な説明を提供するために、多数の具体的詳細が示されている。しかしながら、当業者であれば、本発明の実施形態はこれらの具体的詳細がなくても実施できることは理解できるはずである。場合によっては、本説明の理解が曖昧にならないように、公知の構成要素、構造、及び技術は詳細に説明されていない。
【００１１】
本明細書における「１つの実施形態」又は「ある実施形態」の引用は、実施形態に関して説明された特定の特徴、構造、又は特性が、本発明の少なくとも１つの実施形態に含まれることを意味する。本明細書における種々の箇所での「１つの実施形態では」という句の出現は、必ずしも全てが同じ実施形態を参照するものではない。
【００１２】
以下の図に示される処理は、ハードウェア（回路、専用ロジックなど）、ソフトウェア（汎用コンピュータシステム又は専用機械で実行されるものなど）、又はこれらの組合せを含む処理ロジックによって実行される。以下では幾つかの連続した動作に関して処理を説明しているが、説明される動作の幾つかを異なる順序で実行できることを理解されたい。更に、幾つかの動作は、連続ではなく並列に実行することができる。
【００１３】
グラフィック処理ユニット（ＧＰＵ）は、２Ｄ、３Ｄグラフィック処理及び／又はデジタルビデオに関する機能などの高効率グラフィック処理を実行する専用グラフィックプロセッサとすることができる。ＧＰＵは、グラフィック処理、例えば、ブリッター処理、テクスチャマッピング、ポリゴンレンダリング、画素シェーディング、及びバーテックスシェーディングを実行するための特別な（プログラム可能）ハードウェアを含むことができる。ＧＰＵは、フレームバッファからデータを取り出して画像を表示のためのフレームバッファにレンダリングするために画素をブレンドすることで知られる。また、ＧＰＵは、フレームバッファを制御することができ、ディスプレイ、例えばＣＲＴ又はＬＣＤディスプレイをリフレッシュするためにフレームバッファを使用できるようにする。ＣＲＴ又はＬＣＤディスプレイのいずれかは、少なくとも２０Ｈｚの速度でリフレッシュを必要とする短持続性ディスプレイである（例えば、１／３０秒毎に、ディスプレイがフレームバッファからのデータによってリフレッシュされる）。通常、ＧＰＵは、ディスプレイコントローラを介してラスタグラフィック画像をディスプレイ装置に出力するために、ＧＰＵに結合されたＣＰＵからグラフィック処理タスクを取得することができる。本明細書における「ＧＰＵ」の参照は、引用により本明細書に組み入れられる米国特許第７０１５９１３のＬｉｎｄｈｏｌｄｍ等の「プログラム可能グラフィックプロセッサにおけるデータのマルチスレッド処理のための方法及び装置」、及び米国特許第６９７０２０６のＳｗａｎ等の「グラフィックプロセッサによってインタレースビデオをデインタレースするための方法」に説明されるグラフィックプロセッサ又はプログラム可能グラフィックプロセッサとすることができる。
【００１４】
１つの実施形態では、ＣＰＵ又はＧＰＵなどの複数の異なるタイプのプロセッサは、データ処理システムにおける利用可能な処理資源の使用効率を上げるために１つ又はそれ以上のアプリケーションに対するデータ並列処理タスクを同時に実行することができる。データ処理システムの処理資源は、ＣＰＵ又はＧＰＵなどの複数の物理コンピュータ装置に基づくことができる。物理コンピュータ装置は、１つ又はそれ以上のコンピュータユニットを含むことができる。１つの実施形態では、データ並列処理タスク（又はデータ並列タスク）は、プロセッサの複数のタイプ、例えば、タスクを実行することができるＣＰＵ又はＧＰＵに任せることができる。データ並列タスクは、プロセッサからの幾つかの特定の処理能力を要求することがある。処理能力は、例えば、専用テクスチャリングハードウェアサポート、倍精度浮動小数点演算、専用ローカルメモリ、ストリームデータキャッシュ、又は同期基本命令とすることができる。プロセッサの別々のタイプは、処理能力の種々の重なり合ったグループを提供することができる。例えば、ＣＰＵ及びＧＰＵの両方は、倍精度浮動小数点コンピュータ計算を実行することができる。１つの実施形態では、アプリケーションは、データ並列処理タスクを実行するために、どちらが利用できるとしてもＣＰＵ又はＧＰＵのいずれかを活用することができる。
【００１５】
別の実施形態では、本システムは、親バッファを割り当てることができ、この親バッファを複数のサブバッファに更に細分することができる。サブバッファに対するコンピュータユニットが、親バッファに関連付けられたものと同じコンピュータユニットである場合、このコンピュータユニットは、ポインタを使用してサブバッファデータにアクセスする。サブバッファに対するコンピュータユニットが、親バッファに対するコンピュータユニットとは異なる場合、システムは、サブバッファに対するコンピュータユニットにローカルのメモリにサブバッファからのデータをコピーする。更に、本システムは、コピーされたデータへの更新を追跡し、更新されたデータをサブバッファに転送する。
【００１６】
図１は、アプリケーションのためのデータ並列コンピュータ計算を実行するためにＣＰＵ及び／又はＧＰＵを含むコンピュータ装置を構成するためのシステム１００の１つの実施形態を示すブロック図である。システム１００は、並列コンピュータ計算アーキテクチャを実行することができる。１つの実施形態では、システム１００は、データバス１１３を介して１つ又はそれ以上の中央プロセッサ１１７及びメディアプロセッサ１１５などの１つ又はそれ以上の他のプロセッサに結合された１つ又はそれ以上のホストプロセッサを含むグラフィックシステムとすることができる。複数のホストプロセッサは、ホスト側システム１０１において共にネットワーク化することができる。複数の中央プロセッサ１１７は、異なるコンピュータメーカからのマルチコアＣＰＵを含むことができる。ＣＰＵ又はＧＰＵなどのコンピュータプロセッサ又はコンピュータユニットに能力グループを関連付けることができる。例えば、メディアプロセッサは、専用テクスチャレンダリングハードウェアを備えたＧＰＵとすることができる。別のメディアプロセッサは、専用テクスチャレンダリングハードウェア及び倍精度浮動小数点演算の両方をサポートするＧＰＵとすることができる。複数のＧＰＵは、スケーラブルリンクインターフェイス（ＳＬＩ）又はクロスファイア構成のために互いに接続することができる。
【００１７】
１つの実施形態では、ホスト側システム１０１は、ソフトウェアスタックをサポートすることができる。ソフトウェアスタックは、アプリケーション１０３、コンピュータプラットフォームレイヤ１４１、例えば、ＯｐｅｎＣＬ（登録商標）（オープンコンピューティング言語）プラットフォーム、コンピュータランタイムレイヤ１０９、コンピュータコンパイラ１０７、及びコンピュータアプリケーションライブラリ１０５などのソフトウェアスタック構成要素を含むことができる。アプリケーション１０３は、ＡＰＩ呼出しを介して他のスタック構成要素にインターフェイス接続することができる。１つ又はそれ以上のスレッドは、ホスト側システム１０１におけるアプリケーション１０３に関して同時に実行することができる。コンピュータプラットフォームレイヤ１４１は、データ構造、或いはコンピュータ装置データ構造、各付属の物理コンピュータ装置に対する記憶処理能力を維持することができる。１つの実施形態では、アプリケーションは、コンピュータプラットフォームレイヤ１４１を介してホスト側システム１０１の利用可能な処理資源に関する情報を検索することができる。アプリケーションは、コンピュータプラットフォームレイヤ１４１を介して処理タスクを実行するための能力要件を選択及び指定することができる。従って、コンピュータプラットフォームレイヤ１４１は、処理タスクのための付属のＣＰＵ１１７及び／又はＧＰＵ１１５からの処理資源を割り当て及び初期化するための物理コンピュータ装置に対する構成を決定することができる。１つの実施形態では、コンピュータプラットフォームレイヤ１４１は、構成された１つ又はそれ以上の実際の物理コンピュータ装置に対応するアプリケーションのための１つ又はそれ以上の論理コンピュータ装置を生成することができる。
【００１８】
コンピュータランタイムレイヤ１０９は、例えば、１つ又はそれ以上の論理コンピュータ装置に基づいて、アプリケーション１０３のための構成された処理資源に従って処理タスクの実行を管理することができる。１つの実施形態では、処理タスクの実行は、処理タスクを表すコンピュータプログラムオブジェクトを作成する段階、及び、例えば、実行命令、入力／出力データなどを保持するためのメモリ資源を割り当てる段階を含むことができる。コンピュータプログラムオブジェクトのためにロードされた実行命令は、コンピュータプログラム実行命令とすることができる。コンピュータプログラム実行命令は、ＣＰＵ又はＧＰＵなどのコンピュータプロセッサ又はコンピュータユニットで実行されるコンピュータプログラムオブジェクトに含むことができる。コンピュータランタイムレイヤ１０９は、処理タスクの実際の実行を行うために割り当てられた物理装置と対話することができる。１つの実施形態では、コンピュータランタイムレイヤ１０９は、処理タスクのために構成されたＣＰ又はＧＰＵなどの各プロセッサのランタイム状態に従って種々のアプリケーションからの複数の処理タスクの実行を調整することができる。コンピュータランタイムレイヤ１０９は、ランタイム状態に基づいて、処理タスクを実行するよう構成された物理コンピュータ装置から１つ又はそれ以上のプロセッサを選択することができる。処理タスクを実行する段階は、複数の物理コンピュータ装置で１つ又はそれ以上の実行命令の複数のスレッドを同時に実行する段階を含むことができる。１つの実施形態では、コンピュータランタイムレイヤ１０９は、各プロセッサのランタイム実行状態を監視することによって各々の実行された処理タスクの状態を追跡することができる。
【００１９】
ランタイムレイヤは、アプリケーション１０３からの処理タスクに対応するコンピュータプログラム実行命令として、１つ又はそれ以上の実行命令をロードすることができる。１つの実施形態では、コンピュータランタイムレイヤ１０９は、コンピュータアプリケーションライブラリ１０５から処理タスクを実行するために必要な付加的な実行命令を自動的にロードする。コンピュータランタイムレイヤ１０９は、アプリケーション１０３又はコンピュータアプリケーションライブラリ１０５からコンピュータプログラムオブジェクトのための実行命令及びそれに対応するソースプログラムをロードすることができる。コンピュータプログラムオブジェクトに対するソースプログラムは、コンピュータプログラムソースとすることができる。単一のコンピュータプログラムソースに基づく複数の実行命令は、物理コンピュータ装置の複数のタイプ及び／又は種々のバージョンを含むよう構成された論理コンピュータ装置に従ってロードすることができる。１つの実施形態では、コンピュータランタイムレイヤ１０９は、目標プロセッサ、例えば実行命令を実行するよう構成されたＣＰＵ又はＧＰＵに対して最適化された実行命令に、ロードされたソースプログラムをオンラインでコンパイルするように、コンピュータコンパイラ１０７を起動することができる。
【００２０】
オンラインでコンパイルされた実行命令は、対応するソースプログラムに従って既存の実行命令に加えて将来の呼出しのために記憶することができる。更に、実行命令は、オフラインでコンパイルすることができ、ＡＰＩ呼出しを使用してコンピュータランタイム１０９にロードすることができる。コンピュータアプリケーションライブラリ１０５及び／又はアプリケーション１０３は、アプリケーションからのライブラリＡＰＩ要求に応じて関連の実行命令をロードすることができる。新しくコンパイルされた実行命令は、コンピュータアプリケーションライブラリ１０５又はアプリケーション１０３のために動的に更新することができる。１つの実施形態では、コンピュータランタイム１０９は、コンピュータ装置の新しくアップグレードされたバージョンに対してコンピュータコンパイラ１０７を介してオンラインでコンパイルされた新しい実行命令によって、アプリケーションにおける既存のコンピュータプログラム実行命令を置き換えることができる。コンピュータランタイム１０９は、コンピュータアプリケーションライブラリ１０５を更新するためにオンラインでコンパイルされた新しい実行命令を挿入することができる。１つの実施形態では、コンピュータランタイム１０９は、処理タスクのための実行命令をロードする場合にコンピュータコンパイラ１０７を呼び出すことができる。別の実施形態では、コンピュータコンパイラ１０７は、コンピュータアプリケーションライブラリ１０５のための実行命令を作成するためにオフラインで呼び出すことができる。コンピュータコンパイラ１０７は、コンピュータプログラム実行命令を生成するために、コンピュータカーネルプログラムをコンパイルしリンクすることができる。１つの実施形態では、コンピュータアプリケーションライブラリ１０５は、例えば、開発ツールキット及び／又は画像処理をサポートするための複数の機能を含むことができる。各ライブラリ機能は、複数の物理コンピュータ装置のためのコンピュータアプリケーションライブラリ１０５に記憶されたコンピュータプログラムソース及び１つ又はそれ以上のコンピュータプログラム実行命令に対応することができる。
【００２１】
図２は、複数のスレッドを同時に実行するために並列に動作する複数のコンピュータプロセッサ（コンピュータユニットなど）を備えたコンピュータ装置の実施例を示すブロック図である。各コンピュータプロセッサは、複数のスレッドを並列に（或いは同時に）実行することができる。コンピュータプロセッサ又はコンピュータユニットで並列に実行することができるスレッドは、スレッドグループと呼ばれる。コンピュータ装置は、並列に実行することができる複数のスレッドグループを有することができる。例えば、コンピュータ装置２０５においてスレッドグループとして実行されるＭ個のスレッドが示されている。複数のスレッドグループ、例えば、コンピュータプロセッサ＿１  ２０５のスレッド１及びコンピュータプロセッサ＿Ｌ  ２０３のスレッドＮは、１つのコンピュータ装置における別々のコンピュータプロセッサにわたって又は複数のコンピュータ装置にわたって並列に実行することができる。複数のコンピュータプロセッサにわたる複数のスレッドグループは、コンピュータプログラム実行命令を並列に実行することができる。１つより多いコンピュータプロセッサは、ＡＳＩＣ（特定用途向け集積回路）装置などの単一チップに基づくことができる。１つの実施形態では、アプリケーションからの複数のスレッドを、複数のチップにわたる１つより多いコンピュータプロセッサで同時に実行することができる。
【００２２】
コンピュータ装置は、プロセッサ＿１  ２０５及びプロセッサ＿Ｌ  ２０３などの１つ又はそれ以上のコンピュータプロセッサ又はコンピュータユニットを含むことができる。ローカルメモリは、コンピュータプロセッサに結合することができる。コンピュータプロセッサで実行される単一のスレッドグループにおけるスレッド間で共有されるローカルメモリは、コンピュータプロセッサに結合されたローカルメモリによってサポートすることができる。スレッド１  ２１３及びスレッドＮ  ２０９などの異なるスレッドグループからの複数のスレッドは、コンピュータ装置２０１に接続されたコンピュータ装置メモリ２１７に記憶されたストリームなどのコンピュータメモリオブジェクトを共有することができる。コンピュータ装置メモリ２１７は、グローバルメモリ及び定数メモリを含むことができる。グローバルメモリは、ストリームなどのコンピュータメモリオブジェクトを割り当てるために使用することができる。コンピュータメモリオブジェクトは、コンピュータプログラム実行命令によって動作することができるデータ要素の集まりを含むことができる。コンピュータメモリオブジェクトは、画像、テクスチャ、フレームバッファ、スカラデータタイプのアレイ、ユーザ定義構造のアレイ、バッファ、サブバッファ、又は変数などを表すことができる。定数メモリは、コンピュータプログラム実行命令によって頻繁に使用される定数変数を記憶する読み取り専用メモリとすることができる。
【００２３】
１つの実施形態では、コンピュータプロセッサ又はコンピュータユニットのためのローカルメモリは、スレッドグループ内の全てのスレッド又はスレッドグループによって共有される変数を割り当てるために使用することができる。ローカルメモリは、プロセッサ＿１のためのローカル共有メモリ２１９及びプロセッサ＿Ｌのためのローカル共有メモリ２１１などの専用ローカル記憶装置として実装することができる。別の実施形態では、コンピュータプロセッサのためのローカルメモリは、コンピュータ装置２０１におけるコンピュータプロセッサ２０５、２０３に関するデータキャッシュ２１５などの、コンピュータ装置の１つ又はそれ以上のコンピュータプロセッサに関するコンピュータ装置メモリのための読み取り−書き込みキャッシュとして実装することができる。専用ローカル記憶装置は、異なるスレッドグループにわたるスレッドによって共有することはできない。プロセッサ＿１  ２０５などのコンピュータプロセッサのローカルメモリが読み取り−書き込みキャッシュ、例えばデータキャッシュ２１５として実装される場合、ローカルメモリにあると宣言される変数は、コンピュータ装置メモリ２１７から割り当て、読み取り−書き込みキャッシュ、例えばローカルメモリを実装するデータキャッシュ２１５にキャッシュすることができる。スレッドグループ内のスレッドは、例えば、読み取り−書き込みキャッシュ又は専用ローカル記憶装置のいずれも対応するコンピュータ装置に利用できない場合、コンピュータ装置メモリ２１７において割り当てられたローカル変数を共有することができる。１つの実施形態では、各スレッドは、スレッドにおいて呼び出された機能によって使用されるスレッドプライベート変数を記憶するためのプライベートメモリを関連付けられている。例えば、プライベートメモリ１  ２１１は、スレッド１  ２１３以外のスレッドによって見られることはない。
【００２４】
更に、１つの実施形態では、コンピュータ装置メモリ２１７は、プロセッサ＿１  ２０５−プロセッサ＿Ｌ２０３によって使用されるデータを記憶するのに使用されるバッファ２２３を含む。バッファ２２３は、一次元バッファ、二次元画像バッファ、三次元画像バッファ、又は当技術分野で公知の他のタイプのバッファとすることができる。１つの実施形態では、コンピュータ装置２０１は、バッファ２２３にプロセッサ（プロセッサ１＿２０５−プロセッサ＿Ｌ  ２０３など）が操作するデータを記憶する。例えば、１つの実施形態では、バッファは、データのアレイ、二次元画像、三次元画像など、及び／又は当技術分野では公知の他のデータを記憶することができる。１つの実施形態では、バッファ２２３と、システム２０１の他のメモリ（プライベートメモリ２１１、２０７、ローカル共有メモリ２１９、２２１、データキャッシュ２１５など）との間のデータは、メモリ間データ転送のための当技術分野では公知の任意の方法（ダイレクトＰＣＩｅ転送、非同期ダイレクトメモリアクセスなど）を使用して転送することができる。
【００２５】
図３は、コンピュータ装置識別子を使用して論理コンピュータ装置として構成された複数の物理コンピュータ装置の１つの実施形態を示すブロック図である。１つの実施形態では、アプリケーション３０３及びプラットフォームレイヤ１１１は、ホストＣＰＵ３０１で実行することができる。アプリケーション３０３は、図１のアプリケーション１０３の１つとすることができる。ホスト側システム１０１は、ホストＣＰＵ３０１を含むことができる。物理コンピュータ装置Ｐｈｙｓｉｃａｌ＿Ｃｏｍｐｕｔｅ＿Ｄｅｖｉｃｅ−１  ３０５からＰｈｙｓｉｃａｌ＿Ｃｏｍｐｕｔｅ＿Ｄｅｖｉｃｅ−Ｎ  ３１１の各々は、図１のＣＰＵ１１７又はＧＰＵ１１５の１つとすることができる。１つの実施形態では、コンピュータプラットフォームレイヤ１１１は、ＡＰＩ要求に含まれた能力要件のリストに従ってデータ並列処理資源を構成するためのアプリケーション３０３からのＡＰＩ要求に応じてコンピュータ装置識別子３０７を生成することができる。コンピュータ装置識別子３０７は、コンピュータプラットフォームレイヤ１１１による構成に従う実際の物理コンピュータ装置Ｐｈｙｓｉｃａｌ＿Ｃｏｍｐｕｔｅ＿Ｄｅｖｉｃｅ−１  ３０５からＰｈｙｓｉｃａｌ＿Ｃｏｍｐｕｔｅ＿Ｄｅｖｉｃｅ−Ｎ  ３１１の選択を参照することができる。１つの実施形態では、論理コンピュータ装置３０９は、ホストＣＰＵ３０１とは別の選択された実際の物理コンピュータ装置のグループを表すことができる。
【００２６】
図４は、複数のサブバッファに細分されたバッファの１つの実施形態を示すブロック図である。１つの実施形態では、バッファ４０８は、図２に示されるバッファ２２３である。図４では、バッファ４０８は、コンピュータユニット４０２Ａ−Ｄによって使用されるデータを記憶するために使用される割り当てメモリである。バッファ４０８は、一次元アレイ、二次元画像バッファ、三次元画像バッファ、又は当技術分野では公知の他のタイプのバッファとすることができる。バッファ４０８は、複数のサブバッファ４１０Ａ−Ｄに更に細分される。１つの実施形態では、各サブバッファ４１０Ａ−Ｄは、バッファへのポインタ４１２Ａ−Ｄによって参照される。例えば、１つの実施形態では、サブバッファ４１０Ａはポインタ４１２Ａによって参照され、サブバッファ４１０Ｂはポインタ４１２Ｂによって参照され、サブバッファ４１０Ｃはポインタ４１２Ｃによって参照され、サブバッファ４１０Ｄはポインタ４１２Ｄによって参照される。１つの実施形態では、これらのポインタ４１２Ａ−Ｄは、各バッファの始まりを指示する。この実施形態では、サブバッファ４１０Ａ−Ｄのデータにアクセスするために、コンピュータユニット４０２Ａ−Ｄは、対応するポインタ４１２Ａ−Ｄ及びサブバッファ４１０−Ｄの所望の領域までのオフセットを提供することになる。
【００２７】
１つの実施形態では、各コンピュータユニット４０２Ａ−Ｄに、バッファ４０８のサブバッファ４１０Ａ−Ｄの１つが関連付けられる。１つの実施形態では、これらのコンピュータユニット４０２Ａ−Ｄの各々は、各コンピュータユニットに割り当てられたコンピュータタスクに関するデータを使用する。コンピュータユニットの各々は、対応するサブバッファ４１０Ａ−Ｄにおいてデータを読み取り及び／又はデータを書き込むことができる。例えば、１つの実施形態では、コンピュータユニット４０２Ａは、サブバッファ４１０Ａを使用し、コンピュータユニット４０２Ｂはサブバッファ４１０Ｂを使用し、コンピュータユニット４０２Ｃはサブバッファ４１０Ｃを使用し、コンピュータユニット４０２Ｄはサブバッファ４１０Ｄを使用する。この実施形態では、サブバッファ４１０Ａ−Ｄのデータにアクセスするために、コンピュータユニット４０２Ａ−Ｄは、対応するポインタ４１２Ａ−Ｄ及びサブバッファ４１０−Ｄの所望の領域までのオフセットを提供することになる。オフセットは、アレイインデックス、二次元参照、三次元参照などとすることができる。バッファ４０８の構造を以下の図５−７で更に説明する。
【００２８】
１つの実施形態では、各サブバッファは、機能呼出しによって作成され、バッファポインタ及びサブバッファサイズ値を提供する。サブバッファの作成は以下の図１０で更に説明する。
【００２９】
１つの実施形態では、コンピュータユニット４０２Ａ−Ｄは、対応するサブバッファ４０２Ａ−Ｄから該コンピュータユニット４０２Ａ−Ｄのプライベートメモリ４０４Ａ−Ｄにデータを転送する。１つの実施形態では、プライベートメモリ４０４Ａ−Ｄは、コンピュータユニットにローカル接続されるメモリ（図２に示されるプライベートメモリ１−Ｍ２１１、プライベートメモリ１−Ｎ２０７、ローカル共有メモリ２１９及び２２１、及び／又はデータキャッシュ２１５など）である。１つの実施形態では、コンピュータユニット４０２Ａ−Ｄは、コンピュータユニット４０２Ａ−Ｄ及びバッファ４０８を含むメモリを結合するバスを経由してデータを転送する。例えば、１つの実施形態では、結合バスは、周辺構成要素インターフェイスタイプバス（ＰＣＩ、ＰＣＩ-Ｅｘｐｒｅｓｓ（ＰＣＩｅ）など）であり、転送機構は、ＰＣＩダイレクトメモリ転送である。
【００３０】
図５は、一次元バッファ５００における複数のサブバッファ５０２Ａ−Ｄの１つの実施形態を示すブロック図である。図５では、４つのサブバッファ５０２Ａ−Ｄを有するバッファ５００が示されているが、他の実施形態では、バッファ５００は、これより多い又は少ないサブバッファ及び／又は可変サイズのサブバッファを有することができる。１つの実施形態では、バッファ５００はデータタイプ（整数、浮動、ストリング、ユーザ定義の構造、ユーザ定義のオブジェクトなど）の一次元アレイである。データを参照するために、サブバッファ５０２Ａ−Ｄの１つ、サブバッファ５０２Ａ−Ｄの開始ポインタ５０４Ａ−Ｄからのオフセットを使用することができる。例えば、１つの実施形態では、バッファ５００は、各々が１０億浮動小数の２アレイである。この実施例では、コンピュータユニットは、アレイのコンテンツを共に追加し、各サブバッファ５０２Ａ−Ｄは、２アレイの部分を含む（例えば、各サブバッファ５０２Ａ−Ｄは２アレイの各々に対して１０億浮動小数の半分、合計で１０億浮動小数を有する）。この実施例におけるコンピュータユニットは、コンピュータユニットに対応するサブバッファからデータを転送し、浮動小数を追加し、更に結果値をサブバッファに記憶する。
【００３１】
図６は、複数のサブバッファ６０２Ａ−Ｄに細分された二次元画像バッファ６００の１つの実施形態を示すブロック図である。図６では、４つのサブバッファ６０２Ａ−Ｄを備えたバッファ６００が示されているが、他の実施形態では、バッファ６００は、より多い又は少ないサブバッファ及び／又は可変サイズのサブバッファを有することができる。図６では、二次元画像バッファ６００は、ｘオフセット及びｙオフセットによって参照されるデータを含む二次元バッファである。このバッファは、可変タイプのデータ（整数、浮動小数、ストリング、ユーザ定義構造、ユーザ定義オブジェクトなど）を記憶することができる。例えば、１つの実施形態では、バッファ６００は、ｘ及びｙ方向に二次元画像の画素を記憶することができる。例えば。１つの実施形態では、バッファ６００は、記憶された画像のカラーヒストグラムを計算するために二次元画像を記憶する。この実施例では、画像は、４つのサブバッファ６０２Ａ−Ｄに細分され、各サブバッファ６０２Ａ−Ｄは、コンピュータユニットが処理している画像の一部を保持するためにコンピュータユニットによって使用される。更に、各コンピュータユニット６０２Ａ−Ｄは、対応するサブバッファからの画像の関連部分をコンピュータユニットのプライベートメモリにコピーする。コンピュータユニットは、その画像データを使用してヒストグラム情報をコンピュータ計算し、ヒストグラム情報を戻す。
【００３２】
図７は、複数のサブバッファ７０２Ａ−Ｄに細分された三次元画像バッファ７００の１つの実施形態を示すブロック図である。図７では、４つのサブバッファ７０２Ａ−Ｄを備えるバッファ７００が示されており、他の実施形態では、バッファ７００は、より多い又は少ないサブバッファ及び／又は可変サイズのサブバッファを有することができる。図７では、三次元画像バッファ７００は、ｘ、ｙ、及びｚオフセットによって参照されるデータ、又は三次元空間における位置を参照するための他の適切なシステムを含む三次元バッファである。バッファ５００及び６００と同様に、このバッファ７００は、可変タイプのデータ（整数、浮動小数、ストリング、ユーザ定義構造、ユーザ定義オブジェクトなど）を記憶することができる。例えば、１つの実施形態では、バッファ７００は、ｘ、ｙ、及びｚ方向の三次元画像の画素を記憶することができる。
【００３３】
図８は、アプリケーションから受信された能力要件に一致させることによって、コンピュータ装置識別子を用いて複数の物理コンピュータ装置を構成するための処理８００の実施形態を示すフローチャートである。例示的な処理８００は、ハードウェア（回路、専用ロジックなど）、ソフトウェア（専用機械で実行されるようなもの）、又は両方の組合せを含むことができる処理ロジックによって実行することができる。例えば、処理８００は、ホスト側システム１０１によってホストされるデータ処理システムにおける図１のシステム１００に従って実行することができる。データ処理システムは、図１のコンピュータプラットフォームレイヤ１４１などのプラットフォームレイヤをホストするホストプロセッサ、及び図１のＣＰＵ１１７及びＧＰＵ１１５などのホストプロセッサに付属の複数の物理コンピュータ装置を含むことができる。
【００３４】
ブロック８０１で、１つの実施形態では、処理８００の処理ロジックは、１つ又はそれ以上の対応する能力に関連付けられた複数の物理コンピュータ装置を表すデータ構造（又はコンピュータ装置データ構造）を構築することができる。各物理コンピュータ装置は、処理８００の処理ロジックを実行する処理システムに付属させることができる。ＣＰＵ又はＧＰＵなどの物理コンピュータ装置の能力又はコンピュータ計算能力は、物理コンピュータ装置が、処理能力、メモリアクセス機構、指定された拡張、又は関連の制限をサポートするかどうかを含むことができる。処理能力は、専用テクスチャリングハードウェアサポート、倍精度浮動小数点演算、又は同期サポート（相互排除など）に関係付けることができる。
【００３５】
コンピュータ装置の能力は、コンピュータ装置に関連付けられる処理特性又は制限を指示するタイプを含むことができる。アプリケーションは、要求されるコンピュータ装置のタイプを指定するか、又はＡＰＩを使用して特定のコンピュータ装置のタイプを問い合わせることができる。コンピュータ装置の種々のタイプの実施例を以下の表に示す。
（表１）
0005939524.tif 000002
【００３６】
更に、コンピュータ装置の能力は、例えば、以下の表に示される構成値を含むことができる。
（表２）
0005939524.tif 000003
【００３７】
（表２続き）
0005939524.tif 000004
【００３８】
（表２続き）
0005939524.tif 000005
【００３９】
（表２続き）
0005939524.tif 000006
【００４０】
（表２続き）
0005939524.tif 000007
【００４１】
（表２続き）
0005939524.tif 000008
注１）プラットフォームプロファイルは、ＯｐｅｎＣＬ（登録商標）フレームワークによって実施されるプロファイルを戻す。戻されたプラットフォームプロファイルがＦＵＬＬ＿ＰＲＯＦＩＬＥである場合、ＯｐｅｎＣＬ（登録商標）フレームワークは、ＦＵＬＬ＿ＰＲＯＦＩＬＥである装置をサポートすることになり、ＥＭＢＥＤＤＥＤ＿ＰＲＯＦＩＬＥである装置もサポートすることができる。コンパイラは、全ての装置に対して利用可能でなくてはならない、すなわち、ＣＬ＿ＤＥＶＩＣＥ＿ＣＯＭＰＩＬＥＲ＿ＡＶＡＩＬＡＢＬＥはＣＬ＿ＴＲＵＥである。戻されたプラットフォームプロファイルがＥＭＢＥＤＤＥＤ＿ＰＲＯＦＩＬＥである場合、次にＥＭＢＥＤＤＥＤ＿ＰＲＯＦＩＬＥのみである装置がサポートされる。
【００４２】
物理処理装置のためのメモリアクセス機構は、変数キャッシュのタイプ（例えば、サポートなし、読み取りのみ、又は読み取り−書き込み）、コンピュータメモリオブジェクトキャッシュのタイプ、キャッシュサポートのサイズ、専用ローカルメモリサポート、又は関連の制限に関係付けることができる。メモリアクセス制限は、コンピュータプログラム実行命令によって同時に読み取る又は書き込むことができるコンピュータメモリオブジェクトの最大数、割り当てることができるコンピュータメモリオブジェクトの最大数、又は多次元コンピュータメモリオブジェクトの次元に沿った最大サイズ、例えば、２Ｄ（二次元）画像のためのコンピュータメモリオブジェクトの最大幅を含むことができる。データ処理システムのシステムアプリケーションは、新しい物理コンピュータ装置をデータ処理システムに加えたことに応じてデータ構造を更新することができる。１つの実施形態では、物理コンピュータ装置の能力を事前に決定することができる。別の実施形態では、データ処理システムのシステムアプリケーションは、ランタイム中に新しく付け加えられた物理処理装置を発見することができる。システムアプリケーションは、加えられた物理コンピュータ装置及びその対応する能力を表すデータ構造を更新するために、新しく発見された物理コンピュータ装置の能力を検索することができる。
【００４３】
１つの実施形態によると、処理８００の処理ロジックは、ブロック８０３でアプリケーションからコンピュータ能力要件を受信することができる。アプリケーションは、ＡＰＩを呼び出すことによってコンピュータ能力要件をシステムアプリケーションに送信することができる。システムアプリケーションは、アプリケーションに関するホスト側システムでのソフトウェアスタックのプラットフォームレイヤに対応することができる。１つの実施形態では、コンピュータ能力要件は、アプリケーションに関するタスクを実行するために処理資源を要求するための所要能力のリストを識別することができる。１つの実施形態では、アプリケーションは、複数のスレッドにおけるタスクを同時に実行するために、要求された処理資源を必要とする場合がある。これに応じて、処理８００の処理ロジックは、ブロック８０５で付け加えられた物理コンピュータ装置から物理コンピュータ装置のグループを選択することができる。選択は、能力データ構造に記憶されたコンピュータ能力とコンピュータ能力要件の間のマッチングに基づいて決定することができる。１つの実施形態では、処理８００の処理ロジックは、能力要件によって提供されたヒントに従ってマッチングを実行することができる。
【００４４】
処理８００の処理ロジックは、物理コンピュータ装置とコンピュータ能力要件の間でマッチングされたコンピュータ能力の数に従ってマッチングスコアを決定することができる。１つの実施形態では、処理８００の処理ロジックは、最高マッチングスコアを持つ複数の物理コンピュータ装置を選択することができる。別の実施形態では、処理８００の処理ロジックは、能力要件における各能力がマッチした場合、物理コンピュータ装置を選択することができる。処理８００の処理ロジックは、ブロック８０５でマッチング物理コンピュータ装置の複数のグループを決定することができる。１つの実施形態では、マッチング物理コンピュータ装置の各グループは、各装置のロードバランシング能力に従って選択される。ブロック８０７において、１つの実施形態では、処理８００の処理ロジックは、ブロック８０５で選択された物理コンピュータ装置の各グループに対するコンピュータ装置識別子を生成することができる。処理８００の処理ロジックは、呼出しＡＰＩを介して生成されたコンピュータ装置識別子の１つ又はそれ以上をアプリケーションに戻すことができる。アプリケーションは、コンピュータ装置識別子に従ってタスクを実行するために利用する処理資源を選択することができる。１つの実施形態では、処理８００の処理ロジックは、受信された各能力要件のためにブロック８０７で多くても１つのコンピュータ装置識別子を生成することができる。
【００４５】
ブロック８０９で、１つの実施形態では、処理８００の処理ロジックは、対応するコンピュータ装置識別子に従ってブロック８０５で選択された物理コンピュータ装置のグループに関する論理コンピュータ装置を初期化するために資源を割り当てることができる。論理コンピュータ装置は、１つ又はそれ以上の物理コンピュータ装置を含むコンピュータ装置グループとすることができる。処理８００の処理ロジックは、ブロック８０５での選択に従って１つ又はそれ以上のコンピュータ装置識別子を受信したアプリケーションからのＡＰＩ要求に応じて、論理コンピュータ装置の初期化を実行することができる。
【００４６】
処理８００の処理ロジックは、ブロック８１１でアプリケーションのための論理コンピュータ装置におけるコンテクストオブジェクトを作成することができる。コンピュータメモリオブジェクトで動作するコマンド、コンピュータプログラムオブジェクト、及び／又はコンテクストオブジェクトに対するコンピュータプログラム実行命令は、順番に（例えば、同期して）又はコンテクストオブジェクトを作成したときにＡＰＩ要求で指示されたパラメータに従う順序とは異なって（例えば、非同期で）実行することができる。コンピュータメモリオブジェクト、コンピュータプログラム、又はコンピュータカーネルで動作するプロファイリングコマンドは、ＡＰＩ要求を使用してコンテクストオブジェクトに対して使用可能になる。１つの実施形態では、コンテクストオブジェクトは、アプリケーションを実行するホスト側システムにおける１つのアプリケーションスレッドに関連付けられている。１つの論理コンピュータ装置で又は種々の論理コンピュータ装置にわたって同時に処理タスクを実行する複数のスレッドは、別々のコンテクストオブジェクトに基づくことができる。
【００４７】
１つの実施形態では、処理８００の処理ロジックは、ｃｌＣｒｅａｔｅＣｏｎｔｅｘｔ、ｃｌＲｅｔａｉｎＣｏｎｔｅｘｔ、及びｃｌＲｅｌｅａｓｅＣｏｎｔｅｘｔを含む複数のＡＰＩに基づくことができる。ＡＰＩｃｌＣｒｅａｔｅＣｏｎｔｅｘｔは、コンピュータコンテクストを作成する。コンピュータコンテクストは、コンピュータコンテクストオブジェクトに対応することができる。ＡＰＩｃｌＲｅｔａｉｎＣｏｎｔｅｘｔは、ｃｌＲｅｔａｉｎＣｏｎｔｅｘｔへの入力引数としてコンテクストによって識別された特定のコンピュータコンテクストを使用するインスタンス数を増加させる。ＡＰＩｃｌＣｒｅａｔｅＣｏｎｔｅｘｔは、暗黙の保存を行う。これは、一般的にはアプリケーションによって渡されたコンテクストを取得するサードパーティライブラリにとって有益である。しかしながら、アプリケーションがライブラリに通知することなくコンテクストを削除することができる。複数のインスタンスをコンテクストに加え、コンテクストからリリースできるようにすることで、もはや有効ではないライブラリによって使用されるコンピュータコンテクストの問題を解決する。ｃｌＲｅｔａｉｎＣｏｎｔｅｘｔへの入力引数が有効コンピュータコンテクストオブジェクトに対応しない場合、ｃｌＲｅｔａｉｎＣｏｎｔｅｘｔは、ＣＵ＿ＩＮＶＡＬＩＤ＿ＣＯＮＴＥＸＴを戻す。ＡＰＩｃｌＲｅｌｅａｓｅＣｏｎｔｅｘｔは、有効コンピュータコンテクストからインスタンスをリリースする。ｃｌＲｅｌｅａｓｅＣｏｎｔｅｘｔへの入力引数が有効コンピュータコンテクストオブジェクトに対応しない場合、ｃｌＲｅｌｅａｓｅＣｏｎｔｅｘｔは、ＣＵ＿ＩＮＶＡＬＩＤ＿ＣＯＮＴＥＸＴを戻す。
【００４８】
図９は、論理コンピュータ装置でコンピュータ実行命令を実行するための実施例の処理９００の実施形態を示すフローチャートである。１つの実施形態では、処理９００は、図１のコンピュータランタイムレイヤ１０９などのデータ処理システムにおけるランタイムレイヤによって実行することができる。ブロック９０１で、処理９００の処理ロジックは、コンピュータ実行命令を実行するために、論理コンピュータ装置で１つ又はそれ以上のコンピュータメモリオブジェクト（ストリームなど）を割り当てることができる。コンピュータメモリオブジェクトは、例えば、画像メモリオブジェクト又はアレイメモリオブジェクトを表すための１つ又はそれ以上のデータ要素を含むことができる。アレイメモリオブジェクトは、データ要素の一次元の集合とすることができる。画像メモリオブジェクトは、二次元、三次元、又はテクスチャ、フレームバッファ、或いは画像などの他の多次元データを記憶するための集合とすることができる。処理タスクは、入力コンピュータメモリオブジェクトから読み取り、出力コンピュータメモリオブジェクトに書き込む段階を含む、コンピュータメモリＡＰＩを使用してコンピュータメモリオブジェクト又はストリームで動作するコンピュータプログラム実行命令によって実行することができる。１つの実施形態では、コンピュータメモリオブジェクトは、コンピュータメモリＡＰＩを使用して、データオブジェクトを更新するためのバッファオブジェクト、テクスチャオブジェクト、又はレンダーバッファオブジェクトなどのデータオブジェクトに加えることができる。データオブジェクトは、データオブジェクトにおけるテキストレンダリングなどのグラフィックデータ処理動作を起動するＡＰＩに関連付けることができる。１つの実施形態では、メモリオブジェクトは、図２に説明される複数のサブバッファを備えたバッファである。
【００４９】
コンピュータメモリオブジェクトを割り当てる場合、処理９００の処理ロジックは、割り当てがＡＰＩにおける仕様に従って常駐しなければならない場所を決定することができる。例えば、コンピュータメモリオブジェクトは、図１のホスト側システム１０１に関するホストメモリなどのホストメモリ、及び／又は図２のグローバルメモリ又は定数メモリ２１７などのコンピュータ装置メモリから割り当てることができる。ホストメモリで割り当てられたコンピュータメモリオブジェクトは、コンピュータ装置メモリにキャッシュする必要がある。処理９００の処理ロジックは、例えばデータがコンピュータメモリオブジェクトにロードされたかどうかを示す同期データを含む生成されたイベントオブジェクトに基づいて、非ブロッキングＡＰＩインターフェイスを使用して、割り当てられたコンピュータメモリオブジェクトに非同期にデータをロードすることができる。１つの実施形態では、処理９００の処理ロジックは、割り当てられたコンピュータメモリオブジェクトから読み取りこれに書き込む場合にメモリアクセス動作をスケジュールすることができる。処理９００の処理ロジックは、アプリケーションの論理アドレスを形成するために割り当てられたストリームメモリをマップすることができる。１つの実施形態では、処理９００の処理ロジックは、図１のアプリケーション１０３などのホストプロセッサで実行されるアプリケーションからのＡＰＩ要求に基づいてブロック９０１での動作を実行することができる。
【００５０】
ブロック９０３で、１つの実施形態では、処理９００の処理ロジックは、論理コンピュータ装置（コンピュータ装置グループなど）のためのコンピュータプログラムオブジェクトを作成することができる。コンピュータプログラムオブジェクトは、エクスポートされた機能又はデータ並列プログラムのエントリポイントを表すコンピュータカーネルのグループを含むことができる。コンピュータカーネルは、データ並列タスク（機能など）を実行するためにコンピュータユニットで実行することができるコンピュータプログラム実行命令へのポインタを含むことができる。各コンピュータカーネルに、ブロック９０１で割り当てられたストリームなどの機能入力又は出力のために割り当てられたコンピュータメモリオブジェクト又はストリームを含む機能引数のグループを関連付けることができる。
【００５１】
処理９００の処理ロジックは、ブロック９０９でコンピュータプログラムライブラリバイナリ及び／又はコンピュータプログラムソースをコンピュータプログラムオブジェクトにロードすることができる。コンピュータプログラムバイナリは、コンピュータ装置で実行されるコンピュータプログラム実行命令を記述するビットを含むことができる。コンピュータプログラムバイナリは、コンピュータプログラム実行命令及び／又はコンピュータプログラム実行命令に変換されるコンピュータプログラムソースの中間表現とすることができる。１つの実施形態では、コンピュータプログラム実行命令は、例えば、目標物理コンピュータ装置のタイプ（ＧＰＵ又はＣＰＵなど）、バージョン、及び／又はスレッドグループサイズ及び／又はスレッドグループ規模などのコンピレーション選択肢又はフラグが関連付けられた記述データを含むことができる。コンピュータプログラムソースは、コンピュータプログラム実行命令がコンパイルされるソースコードとすることができる。処理９００の処理ロジックは、ブロック９０９でコンピュータプログラムソースに対応する複数のコンピュータプログラム実行命令をロードすることができる。１つの実施形態では、処理９００の処理ロジックは、アプリケーションから又は図１のコンピュータアプリケーションライブラリ１０５などのコンピュータライブラリを介してコンピュータプログラム実行命令をロードすることができる。コンピュータプログラム実行命令は、対応するコンピュータプログラムソースと共にロードすることができる。処理９００の処理ロジックは、ブロック９０５で、コンピュータプログラムオブジェクトのための機能引数をセットアップすることができる。１つの実施形態では、処理９００の処理ロジックは、アプリケーションからのＡＰＩ要求に従って、ブロック９０３、９０５、及び９０９での動作を実行することができる。
【００５２】
ブロック９１１で、処理９００の処理ロジックは、論理コンピュータ装置によってコンピュータカーネルオブジェクトを実行するために実行待ち行列を更新することができる。処理９００の処理ロジックは、図１のアプリケーション１０３又はコンピュータアプリケーションライブラリ１０５などのアプリケーション又はコンピュータアプリケーションライブラリから、コンピュータランタイム、例えば図１のコンピュータランタイム１０９への適切な引数を備えたＡＰＩ呼出しに応じてコンピュータカーネルを実行することができる。コンピュータカーネルの実行は、コンピュータカーネルに関連付けられるコンピュータプログラム実行命令を実行する段階を含むことができる。１つの実施形態では、処理９００の処理ロジックは、コンピュータカーネルを実行するためにコンピュータカーネル実行インスタンスを生成することができる。図１のコンピュータランタイム１０９などのコンピュータランタイムへのＡＰＩ呼出しは、コンピュータカーネルを実行するために、本質的に非同期とすることができる。実行インスタンスは、図１のコンピュータランタイム１０９などのコンピュータランタイムによって戻すことができるコンピュータイベントオブジェクトによって識別することができる。コンピュータカーネル実行インスタンスは、コンピュータカーネルインスタンスを実行するために実行待ち行列に付加することができる。
【００５３】
１つの実施形態では、コンピュータカーネルを実行するためのコンピュータランタイムへのＡＰＩ呼出しは、スレッドグループとしてコンピュータプロセッサで同時に並列に実行されるスレッドの数を含むことができる。ＡＰＩ呼出しは、使用するコンピュータプロセッサの数を含むことができる。コンピュータカーネル実行インスタンスは、対応するコンピュータプログラム実行命令を実行するために要求される優先順位を指示する優先順位値を含むことができる。また、コンピュータカーネル実行インスタンスは、以前の実行インスタンス及び／又は予想されるスレッドの総数及び実行を行うためのスレッドグループの数を識別するイベントオブジェクトを含むことができる。スレッドグループの数及びスレッドの総数は、ＡＰＩ呼出しにおいて指定することができる。１つの実施形態では、イベントオブジェクトは、イベントオブジェクトを含む実行インスタンスとイベントオブジェクトによって識別される別の実行インスタンスとの間の実行順序関係を指示することができる。イベントオブジェクトを含む実行インスタンスは、イベントオブジェクトによって識別された別の実行インスタンスが実行を終えた後に実行されるよう要求することができる。イベントオブジェクトは、ｑｕｅｕｅ＿ａｆｔｅｒ＿ｅｖｅｎｔ＿ｏｂｊｅｃｔと呼ぶことができる。イベント及びイベント従属は、以下の図１１及び１２に更に説明する。１つの実施形態では、実行待ち行列は、対応するコンピュータプログラム実行命令を実行するための複数のコンピュータカーネル実行インスタンスを含むことができる。コンピュータプログラム実行命令のための１つ又はそれ以上のコンピュータカーネル実行インスタンスは、実行待ち行列における実行のためにスケジュールすることができる。１つの実施形態では、処理９００の処理ロジックは、アプリケーションからのＡＰＩ要求に応じて実行待ち行列を更新することができる。実行待ち行列は、アプリケーションが実行されているホスト側データシステムによってホストすることができる。
【００５４】
ブロック９１３で、処理９００の処理ロジックは、実行のための実行待ち行列からコンピュータカーネル実行インスタンスを選択することができる。１つの実施形態では、処理９００の処理ロジックは、対応する論理コンピュータ装置に従って同時に実行される１つより多いコンピュータカーネル実行インスタンスを選択することができる。処理９００の処理ロジックは、コンピュータカーネル実行インスタンスが、実行待ち行列における関連の優先順位及び他の実行インスタンスとの従属関係に基づいて実行待ち行列から選択されるかどうか決定することができる。コンピュータカーネル実行インスタンスは、コンピュータカーネルオブジェクトにロードされた実行命令に従って対応するコンピュータカーネルオブジェクトを実行することによって実行することができる。
【００５５】
ブロック９１７で、１つの実施形態では、処理９００の処理ロジックは、コンピュータカーネルオブジェクトのための論理コンピュータ装置に関連付けられた物理コンピュータ装置で実行するための、選択されたコンピュータカーネルインスタンスに対応するコンピュータカーネルオブジェクトにロードされた複数の実行命令の１つを選択することができる。処理９００の処理ロジックは、１つのコンピュータカーネル実行インスタンスのために１つより多い物理コンピュータ装置で並列に実行される１つより多い実行命令を選択することができる。選択は、選択されたコンピュータカーネル実行インスタンスに関連付けられる論理コンピュータ装置に対応する物理コンピュータ装置の現在の実行ステータスに基づくことができる。物理コンピュータ装置の実行ステータスは、実行中のスレッド数、ローカルメモリ使用レベル、及びプロセッサ使用レベル（単位時間当たりの動作のピーク数など）などを含むことができる。１つの実施形態では、選択は、事前に決められた使用レベルに基づくことができる。別の実施形態では、選択は、コンピュータカーネル実行インスタンスに関連付けられたスレッドの数及びスレッドグループの数に基づくことができる。処理９００の処理ロジックは、物理コンピュータ装置から実行ステータスを検索することができる。１つの実施形態では、処理９００の処理ロジックは、ホスト側システムで実行されるアプリケーションに非同期にブロック９１３、９１７で実行するために、実行待ち行列からコンピュータカーネル実行インスタンスを選択するための動作を実行することができる。
【００５６】
ブロック９１９で、処理９００の処理ロジックは、実行待ち行列における実行のためにスケジュールされたコンピュータカーネル実行インスタンスの実行ステータスをチェックすることができる。各実行インスタンスは、固有のコンピュータイベントオブジェクトによって識別することができる。対応するコンピュータカーネル実行インスタンスが図１のランタイム１０９などのコンピュータランタイムに従って待ち行列に入れられた場合、イベントオブジェクトは、実行インスタンスを実行するためにＡＰＩを呼び出す図１のアプリケーション１０３又はコンピュータアプリケーションライブラリ１０５などのアプリケーション又はコンピュータアプリケーションライブラリに戻すことができる。１つの実施形態では、処理９００の処理ロジックは、アプリケーションからのＡＰＩ要求に応じて実行ステータスチェックを行うことができる。処理９００の処理ロジックは、コンピュータカーネル実行インスタンスを識別するコンピュータイベントオブジェクトのステータスを問い合わせることによって、コンピュータカーネル実行インスタンスの実行の完了を決定することができる。処理９００の処理ロジックは、コンピュータカーネル実行インスタンスの実行が完了してアプリケーションからのＡＰＩ呼出しに戻るまで待つことができる。処理９００の処理ロジックは、コンピュータイベントオブジェクトに基づいて種々のストリームから読み取る及び／又は書き込む処理実行インスタンスを制御することができる。
【００５７】
ブロック９２１で、１つの実施形態によると、処理９００の処理ロジックは、コンピュータカーネル実行インスタンスを実行した結果を検索することができる。続いて、処理９００の処理ロジックは、コンピュータカーネル実行インスタンスを実行するために割り当てられた処理資源を整理することができる。１つの実施形態では、処理９００の処理ロジックは、コンピュータカーネル実行命令を実行した結果を保持するストリームメモリをローカルメモリにコピーすることができる。処理９００の処理ロジックは、ブロック９０１で割り当てられた変数ストリーム又は画像ストリームを削除することができる。処理９００の処理ロジックは、コンピュータカーネル実行が完了した時間を検出するためのカーネルイベントオブジェクトを削除することができる。特定のコンピュータカーネルオブジェクトに関連付けられた各コンピュータカーネル実行インスタンスが完全に実行された場合、処理９００の処理ロジックは、特定のコンピュータカーネルオブジェクトを削除することができる。１つの実施形態では、処理９００の処理ロジックは、アプリケーションによって初期化されたＡＰＩ要求に基づいてブロック９２１で動作を実行することができる。
【００５８】
図１０は、複数のコンピュータユニットによってサブバッファを作成して使用するためのランタイム処理１０００の実施形態を示すフローチャートである。例示的な処理１０００は、ハードウェア（回路、専用ロジックなど）、ソフトウェア（専用機械で実行されるものなど）、又はこれらの組合せを含むことができる処理ロジックによって実行することができる。例えば、処理１０００は、図１のホスト側システム１０１によってホストされるデータ処理システムのシステム１００に従って実行することができる。データ処理システムは、図１のコンピュータプラットフォームレイヤ１４１などのプラットフォームレイヤをホストするホストプロセッサ、及び図１のＣＰＵ１１７及びＧＰＵ１１５などのホストプロセッサに付属する複数の物理コンピュータ装置を含むことができる。
【００５９】
図１０では、処理１０００は、コンピュータユニットに関するサブバッファを作成し、サブバッファはバッファに関連付けられる。１つの実施形態では、処理１０００は、現在割り当てられているバッファからサブバッファを作成する。例えば、１つの実施形態では、処理１０００は、機能呼出しを使用して割り当てられたバッファからサブバッファを作成する：
ｃｌ＿ｍｅｍ  ｃｌＣｒｅａｔｅＳｕｂＢｕｆｆｅｒ（ｃｌ＿ｍｅｍ  ｂｕｆｆｅｒ、
ｃｌ＿ｍｅｍ＿ｆｌａｇｓ．ｆｌａｇｓ、
ｃｌ＿ｂｕｆｆｅｒ＿ｃｒｅａｔｅ＿ｔｙｐｅ  ｂｕｆｆｅｒ＿ｃｒｅａｔｅ＿ｔｙｐｅ、
ｃｏｎｓｔ  ｖｏｉｄ*ｂｕｆｆｅｒ＿ｃｒｅａｔｅ＿ｉｎｆｏ、
ｃｌ＿ｉｎｔ*ｅｒｒｃｏｄｅ＿ｒｅｔ）
ここで、バッファは既存のバッファであり、フラグは、作成される画像メモリオブジェクトに関する割り当て及び使用情報を指定するために使用されるビット−フィールドであり表３で説明され、サイズは、割り当てられるサブバッファメモリオブジェクトのバイトサイズであり、
ｂｕｆｆｅｒ＿ｃｒｅａｔｅ＿ｔｙｐｅ及びｂｕｆｆｅｒ＿ｃｒｅａｔｅ＿ｉｎｆｏは、作成されるバッファオブジェクトのタイプを記述する。ｂｕｆｆｅｒ＿ｃｒｅａｔｅ＿ｔｙｐｅのサポート値のリスト及びｂｕｆｆｅｒ＿ｃｒｅａｔｅ＿ｉｎｆｏが示す対応する記述子を表４で説明する。
（表３）
サブバッファメモリ作成フラグ
0005939524.tif 000009
【００６０】
（表４）
ＣＬ＿ＢＵＦＦＥＲ＿ＣＲＥＡＴＥ＿ＴＹＰＥ値
0005939524.tif 000010
【００６１】
ブロック１００４で、処理１０００は、サブバッファに関するコンピュータユニットが親バッファと同じコンピュータユニットであるかどうか決定する。例えば、１つの実施形態では、処理１０００は、サブバッファがＣＰＵに対して作成されたと決定する。コンピュータユニットが異なる場合、処理１０００は、サブバッファに関連付けられたコンピュータユニットのプライベートメモリにデータをコピーする。例えば、１つの実施形態では、コンピュータユニットがＧＰＵでありバッファに関連付けられたコンピュータユニットがＣＰＵである場合、処理１０００は、サブバッファに関連付けられるデータをＧＰＵのメモリにコピーすることになる。図４を参照すると、処理１０００は、サブバッファの１つ（サブバッファ４１０Ａなど）からのデータをＧＰＵのメモリ（コンピュータユニット４０２Ａのプライベートメモリ４０４Ａなど）にコピーする。コンピュータユニットがサブバッファ及びバッファに対して同じである場合、処理１０００は、ブロック１００６でサブバッファにおけるデータにアクセスするためにポインタを使用する。例えば、１つの実施形態では、処理１０００は、図４で説明されたようにサブバッファ４１０Ａにおけるデータにアクセスするためにポインタ４１２Ａを使用する。処理１０００はポインタを使用してデータにアクセスすると共に変更されたデータを更新する必要がないので、処理１０００は１００６で終了する。
【００６２】
他方で、処理１０００がサブバッファに関連付けられたコンピュータユニットのプライベートメモリにデータをコピーした場合、処理１０００は、そのコンピュータユニットのプライベートメモリにおけるデータへの更新を追跡する。例えば、１つの実施形態では、ブロック１０１０で追跡された更新に基づいて、処理１０００は、ブロック１０１２において、更新を親バッファに送信する。１つの実施形態では、処理１０００は一度で更新を送信するが、他の実施形態では、処理１０００は、異なる方式で更新を送信する（例えば、定期的に更新を送信する、自動的に更新を送信する等）。
【００６３】
コンピュータユニットに関するサブバッファの作成、使用、及び／又は管理に加えて、システム１００は、図８及び９を参照して前述したように、コンテクストの動作を同期させるためにイベントを使用することができる。１つの実施形態では、イベントオブジェクトは、コマンドなどの動作のステータスをカプセル化する。この実施形態では、これらのオブジェクトは、コンテクストにおける動作を同期させるために使用することができる。更に、システム１００は、特定のコマンドが実行を開始する時間を制御するためにイベント待機リストを使用することができる。イベント待機リストは、イベントオブジェクトのリストである。図１１は、内部及び外部従属を有するイベントに関連付けられるコールバックを実行するための処理１１００の１つの実施形態を示すフローチャートである。１つの実施形態では、コールバックは、コンテクスト内で起こるイベント（例えば、エラーなど）を報告するために使用される。図８を参照して前述したように、コンテクストは、１つ又はそれ以上のコンピュータユニットによって作成され、コマンド−待ち行列、メモリ、プログラム、カーネルオブジェクトなどのオブジェクトを管理するために使用され、コンテクストで指示された１つ又はそれ以上のコンピュータユニットでカーネルを実行するためのものである。
【００６４】
例示的な処理１１００は、ハードウェア（回路、専用ロジックなど）、ソフトウェア（専用機械で実行されるものなど）、又はこれら両方の組合せを含むことができる処理ロジックによって実行することができる。例えば、処理１１００は、図１のホスト側システム１０１によってホストされるデータ処理システムのシステム１００に従って実行することができる。データ処理システムは、図１のコンピュータプラットフォームレイヤ１４１などのプラットフォームレイヤをホストするホストプロセッサ、及び図１のＣＰＵ１１７及びＧＰＵ１１５などのホストプロセッサに付属の複数の物理コンピュータ装置を含むことができる。
【００６５】
イベントがブロック１１０２で外部従属を有する場合、処理１１００は、コンテクストを用いてコールバックを実行するためにイベントを登録する。１つの実施形態では、イベントは、内部従属、外部従属を持つこと及び／又は従属を持たないことができる。内部従属を持つイベントは、イベントに関連付けられたコールバックが実行される前に、内部従属が解消されることを意味する。１つの実施形態では、内部従属は、カーネル実行コマンド又は管理コマンド（例えば、メモリオブジェクトの読み取り−書き込み、マップ、コピーコマンド）などのシステムが認識するイベントである。外部従属はユーザ定義のイベントであり、この外部従属は、コールバックが実行される前に解消する必要がある。例えば、１つの実施形態では、ユーザ定義イベントによって、待機状態コマンドが対応するコンピュータユニットによって実行される前に、アプリケーションは、ユーザイベントが終了するのを待つコマンドを待ち行列に入れることができる。別の実施形態では、ユーザイベントオブジェクトは、アプリケーション固有のエラー状態を報告するために使用することができる。１つの実施形態では、イベント従属をイベント待機リストに記憶することができる。
【００６６】
ブロック１１０４で、処理１１００は、登録されたイベントが発生したという通知を受信する。１つの実施形態では、処理１１００は、イベントを待つ機能を呼び出すことによって、イベントの通知を受信する。ブロック１１０６で、処理１１００は、登録されたイベントが何らかの解消されていない内部イベントを有するかどうか決定する。例えば、１つの実施形態では、処理１１００は、登録されたイベントに関連付けられるイベント待機リストが何らかの内部従属を有するかどうか決定する。何らかの内部従属が存在する場合、処理１１００は、ブロック１１１２でコールバックの実行を遅らせる。１つの実施形態では、処理１１００は、内部従属が解消されるまで実行を遅らせる。例えば、１つの実施形態では、従属を解消する段階は、従属イベントに関連付けられるコマンドが完了するのを待つ段階を含むことができる。
【００６７】
登録されたイベントに対する内部従属がない場合、処理１１００は、登録されたイベントが何らかの外部従属を有するかどうかブロック１１０８で決定する。例えば、１つの実施形態では、処理１１００は、登録されたイベントに関連付けられるイベント待機リストが何らかの外部従属を有するかどうか決定する。何らかの外部従属が存在する場合、処理１１００は、ブロック１１１２でコールバックの実行を遅らせる。１つの実施形態では、処理１１００は、外部従属が解消されるまで実行を遅らせる。例えば、１つの実施形態では、従属を解消する段階は、従属イベントに関連付けられるコマンドが完了するのを待つ段階を含むことができる。
【００６８】
図１２は、内部及び外部従属を持つイベントチェーン１２０２Ａ−Ｄの１つの実施形態を示すブロック図である。図１２では、イベント１２０２Ａは、３つの内部イベント１２０２Ｂ−Ｄ及び外部イベント、ユーザイベント１２０４を含む従属のチェーンを有する。例えば、１つの実施形態では、イベント１２０２Ａは、イベント１２０２Ｂに従属し、イベント１２０２Ｂは、イベント１２０２Ｃに従属し、イベント１２０２Ｃは、イベント１２０２Ｄに従属し、イベント１２０２Ｄは、ユーザイベント１２０４に従属する。この実施形態では、イベント１２０２Ｄは、ユーザイベント１２０４が解消されるのを待ち、イベント１２０２Ｃは、イベント１２０２Ｄ及び１２０４が解消されるのを待ち、イベント１２０２Ｂは、イベント１２０２Ｃ−Ｄ及び１２０４が解消されるのを待ち、イベント１２０２Ｂは、イベント１２０２Ｂ−Ｄ及び１２０４が解消されるのを待つ。
【００６９】
図１３は、複数の物理コンピュータ装置で実行されるコンピュータプログラム実行命令のためのコンピュータプログラムソースコードの実施例を示すサンプルソースコードである。実施例１３００は、変数１３０１及びストリーム（又はコンピュータメモリオブジェクト）１３０３を含む引数を持つＡＰＩ機能を表すことができる。実施例１３００は、図１のシステム１３１などの並列コンピュータ環境に対するプログラミング言語に基づくことができる。１つの実施形態では、並列プログラミング言語は、本明細書で説明される実施形態の１つ又はそれ以上を実施するよう設計された付加的な拡張及び制限を有するＡＮＳＩ（米国規格協会）Ｃ規格に従って記述することができる。拡張は、コンピュータ装置で実行されるコンピュータカーネル機能を規定するために、限定子１３０５などの機能限定子を含むことができる。コンピュータカーネル機能は、他のコンピュータカーネル機能によって呼び出すことはできない。１つの実施形態では、コンピュータカーネル機能は、並列プログラム言語におけるホスト機能によって呼び出すことができる。ホスト機能は、標準のＡＮＳＩ  Ｃ機能とすることができる。ホスト機能は、コンピュータカーネル機能を実行するコンピュータ装置とは別のホストプロセッサで実行することができる。１つの実施形態では、拡張は、スレッドグループの全てのスレッドによって共有されることになるコンピュータ装置に関連付けられるローカルメモリに割り当てる必要がある変数を記述するために、ローカル限定子を含むことができる。ローカル限定子は、コンピュータカーネル機能の内部で宣言することができる。制約が侵害された場合、エラーメッセージを出力する又は実行を終了するなどのエラー状態を引き起こすために、コンパイラ時間又は作動時間の間に並列プログラミング言語の制約を強制することができる。
【００７０】
図１４Ａ−１４Ｃは、ＡＰＩを呼び出すことによって複数の物理コンピュータ装置において、複数の実行命令の１つを実行するための論理コンピュータ装置を構成するための実施例を示すサンプルソースコードを含む。実施例１４００Ａ−１４００Ｃは、図１のホスト側システム１０１などの複数の物理コンピュータ装置が取り付けられたホストシステムで実行されるアプリケーションによって実行することができる。実施例１４００Ａ−１４００Ｃは、並列プログラミング言語のホスト機能を規定することができる。実施例１４００Ａ−１４００Ｃにおける処理動作は、図８の処理８００及び／又は図９の処理９００などの処理によるＡＰＩ呼出しとして実行することができる。コンピュータ装置、コンピュータ装置グループ、又は論理コンピュータ装置１４０１からコンテクストオブジェクトを作成するための処理動作は、図８の処理８００のブロック８１１の処理ロジックによって実行することができる。入力／出力画像メモリオブジェクト（コンピュータメモリオブジェクトなど）を割り当てるための処理動作は、図９の処理９００のブロック９０１の処理ロジックによって実行することができる。
【００７１】
ここで図１４Ｂを参照すると、アレイメモリオブジェクト１４０３ｂを割り当ててロードするための処理動作は、図９の処理９００のブロック９０１の処理ロジックによって実行することができる。コンピュータプログラムオブジェクト１４０５を作成するための処理動作は、図９の処理９００のブロック９０３の処理ロジックによって実行することができる。処理動作１４０７は、図９の実施例９００などのコンピュータプログラムソースを、作成されたコンピュータプログラムオブジェクトにロードすることができる。処理動作１４０９は、ロードされたコンピュータプログラムソースからコンピュータプログラム実行命令を明示的に作成することができる。１つの実施形態では、処理動作１４０９は、既に作成されたコンピュータプログラム実行命令を作成されたコンピュータプログラムオブジェクトにロードすることができる。従って、処理動作１４１１は、コンピュータ装置での実行をスケジュールするための構築コンピュータプログラム実行命令を示す、コンピュータカーネルオブジェクトを作成することができる。
【００７２】
ここで図１４Ｃを参照すると、１つの実施形態では、処理動作１４１３が、作成されたコンピュータカーネルオブジェクトに関する機能引数としての変数及びコンピュータメモリオブジェクトを加えることができる。処理動作１４１３は、図９の処理９００のブロック９０５の処理ロジックによって実行することができる。処理動作１４１５は、作成されたコンピュータカーネルオブジェクトを実行することができる。１つの実施形態では、処理動作１４１５は、図９の処理９００のブロック９１１の処理ロジックによって実行することができる。処理動作１４１５は、作成されたコンピュータカーネルオブジェクトに対応するコンピュータカーネル実行インスタンスによって実行待ち行列を更新させることができる。処理動作１４１７は、作成コンピュータカーネルオブジェクトの実行の完了を同期して待つことができる。１つの実施形態では、処理動作１４１９は、コンピュータカーネルオブジェクトの実行の結果を検索することができる。結果的に、処理動作１１９１は、イベントオブジェクトなどのコンピュータカーネルオブジェクト、作成されたコンピュータカーネルオブジェクトを実行するための割り当てられた資源、及び割り当てられたメモリをクリーンアップすることができる。１つの実施形態では、処理動作１４１７は、カーネルイベントオブジェクトが設定されたかどうかに基づいて非同期に実行することができる。処理動作１４１７は、図９のブロック９１９での処理９００によって実行することができる。
【００７３】
図１５は、本発明の１つの実施形態に関連して使用することができるコンピュータシステム１５００の１つの実施例を示す。例えば、システム１５００は、図１に示されたシステムの一部として実行することができる。図１５は、コンピュータシステムの種々の構成要素を示すが、これらの詳細構造は本発明と密接に結び付いていないので、構成要素を相互接続する任意の特定のアーキテクチャ又は方式を表すものではない点に留意されたい。ネットワークコンピュータ、及び少ない構成要素又は多くの構成要素を有する他のデータ処理システム（例えば、手持ち式コンピュータ、携帯情報端末（ＰＤＡ）、セルラー電話、娯楽システム、消費者電子装置など）は、本発明の１つ又はそれ以上の実施形態を実施するために関連して使用できることを理解されたい。
【００７４】
図１５に示されるように、データ処理システムの１つの形式であるコンピュータシステム１５００は、ＣＰＵ及び／又はＧＰＵなどのマイクロプロセッサ１５０５、ＲＯＭ（読み取り専用メモリ）１５０７、揮発性ＲＡＭ１５０９、及び不揮発性メモリ１９１１に接続されたバス１５０３を含む。マイクロプロセッサ１５０５は、メモリ１５０７、１５０９、１９１１から命令を読み出し、キャッシュ１５２１を使用して命令を実行して前述の動作を行うことができる。バス１５０３は、これらの種々の構成要素を互いに相互接続し、これらの構成要素１５０５、１５０７、１５０９、及び１５１１をディスプレイコントローラ及びディスプレイ装置１５１３に、更に当技術分野では公知のマウス、キーボード、モデム、ネットワークインターフェイス、プリンタ、及び他の装置とすることができる入力／出力（Ｉ／Ｏ）装置などの周辺装置に相互接続する。一般的には、入力／出力装置１５１５は、入力／出力コントローラ１５１７を介してシステムに結合される。揮発性ＲＡＭ（ランダムアクセスメモリ）１５０９は、一般的にメモリ内のデータをリフレッシュ又は維持するために継続して電力を必要とする動的ＲＡＭ（ＤＲＡＭ）として実装される。ディスプレイ装置１５１３に接続されたディスプレイコントローラは、ディスプレイデータを処理するための１つ又はそれ以上のＧＰＵを随意的に含むことができる。随意的に、ディスプレイ装置１５１３に含まれたＧＰＵをサポートするためにＧＰＵメモリ１５１９を提供することができる。
【００７５】
大容量記憶装置１５１１は、一般的に、磁気ハードドライブ又は磁気光学ドライブ又は光学ドライブ又はＤＶＤ  ＲＡＭ又はフラッシュメモリ又は電力がシステムから取り除かれた後でもデータ（大量のデータなど）を維持する他の形式のメモリシステムである。一般的には、大容量記憶装置１５１１は、必要とされることはないがランダムアクセスメモリとすることもできる。図１５は、大容量記憶装置１５１１がデータ処理システムの構成要素の残りに直接接続されたローカル装置であることを示しているが、本発明は、モデム又はイーサネットインターフェイス又は無線ネットワーキングインターフェイスなどのネットワークインターフェイスを介してデータ処理システムに接続されるネットワーク記憶装置などの、システムから遠隔にある不揮発性メモリを利用できることを理解されたい。バス１５０３は、当技術分野では公知のように、種々のブリッジ、コントローラ、及び／又はアダプタを介して互いに接続された１つ又はそれ以上のバスを含むことができる。
【００７６】
前述の一部分は、専用ロジック回路などの論理回路又はプログラムコード命令を実行するマイクロコントローラ又は処理コアの他の形式によって実行することができる。従って、前記の説明によって教示された処理は、特定の機能を行うために機械にこれらの命令を実行させる機械実行可能命令などのプログラムコードによって実行することができる。これに関連して、「機械」は、中間形式（又は「アブストラクト」）命令をプロセッサ固有の命令（「仮想機械」（Ｊａｖａ仮想機械など）、インタプリタ、共通言語ランタイム、ハイレベル言語仮想機械などのアブストラクト実行環境）に変換する機械、及び／又は汎用プロセッサ及び／又は特定用途プロセッサなどの命令を実行するよう設計された半導体チップ（トランジスタによって実行される「論理回路」など）に配置される電子回路とすることができる。また、前記の説明によって教示される処理は、プログラムコードを実行することなく処理（又は一部の処理）を行うよう設計された電子回路（機械の代わりに又は機械と組み合わせて）によって実行することができる。
【００７７】
例えば、複数のトークンを含むプログラムコードを記憶するために製造物品を使用することができる。プログラムコードを記憶する製造物品は、限定されるものではないが、１つ又はそれ以上のメモリ（例えば、１つ又はそれ以上のフラッシュメモリ、ランダムアクセスメモリ（静的、動的、又はその他）、光学ディスク、ＣＤ−ＲＯＭ、ＤＶＤ  ＲＯＭ、ＥＰＲＯＭ、ＥＥＰＲＯＭ、磁気又は光学カード、又は他の形式の電子命令を記憶するのに適したマシーン読み取り可能な記録媒体として実装することができる。プログラムコードは、遠隔コンピュータ（サーバなど）から要求側コンピュータ（クライアントなど）に伝搬媒体に組み込まれるデータ信号によって（例えば、通信リンク（ネットワーク接続など）を使用して）ダウンロードすることもできる。
【００７８】
前述の詳細な説明は、コンピュータメモリ内のデータビットにおける動作のアルゴリズム及び記号表現を用いて提示される。これらのアルゴリズムの説明及び表現は、当業者にその作業内容を最も効率的に伝えるために、データ処理技術に精通した業者によって使用されるツールである。アルゴリズムは、一般的に、所望の結果をもたらす動作の自己矛盾のないシーケンスであると考えられる。動作は、物理量の物理的操作を要求するものである。通常、必須ではないが、これらの量は、記憶、転送、結合、比較、及びそうでなければ操作することができる電気又は磁気信号の形式を取る。主に共通使用の理由で、これらの信号は、ビット、値、要素、記号、文字、用語、数字等として呼ぶことが好都合であることが分かっている。
【００７９】
しかしながら、これらの全て及び類似の表現は適切な物理量に関連付けられ、単にこれらの量に適用される好都合な表記であることに留意されたい。前記の説明から明らかなように、他に具体的に指示がない限り、説明全体を通して、「処理する」又は「コンピュータ計算する」又は「計算する」又は「決定する」又は「表示する」又は「コピーする」又は「追跡する」又は「送信する」等の用語を利用した説明は、コンピュータシステムのレジスタ及びメモリ内の物理（電子）量として表されるデータを処理して、コンピュータシステムメモリ又はレジスタ又は他の情報記憶、送信、又はディスプレイ装置内の物理量として同様に表現される他のデータに変換する、コンピュータシステム又は類似の電子コンピュータ装置の動作及び処理を参照することを理解されたい。
【００８０】
また、本発明は、本明細書で説明された動作を実行するための装置を示す。この装置は、所望の目的のために特別に構成すること、又はコンピュータに記憶されたコンピュータプログラムによって選択的に起動又は再構成される汎用コンピュータを含むことができる。このようなコンピュータプログラムは、限定されるものではないが、フロッピーディスク、光学ディスク、ＣＤ−ＲＯＭ、及び磁気光学ディスクを含む任意の形式のディスク、読み取り専用メモリ（ＲＯＭ）、ＲＡＭ、ＥＰＲＯＭ、ＥＥＰＲＯＭ、磁気又は光学カード、又は電子命令を記憶するのに適した任意の形式の媒体であり、各々がコンピュータシステムバスに結合される、コンピュータ可読記憶媒体に記憶できる。
【００８１】
本明細書に示される処理及び表示は、何らかの特定のコンピュータ又は他の装置に本質的に結び付いているものではない。種々の汎用システムは、本明細書の教示に従ってプログラムと共に使用できること、又は説明した動作を実行するための専用装置を構成することが好都合であることが分かっている。これらの様々なシステムの所要の構造は、以下の説明から明らかになるはずである、更に、本発明は、何らかの特定のプログラミング言語を参照して説明されていない。様々なプログラミング言語は、本明細書で説明される本発明の教示を実施するために使用できることを理解されたい。
【００８２】
前述の説明は、単に、本発明の幾つかの例示的な実施形態を説明するものである。当業者であれば、これらの説明、添付図面、及び請求項から、本発明の精神及び範囲から逸脱することなく種々の修正が可能であることを容易に理解できるはずである。
【図１】
0005939524.tif 000011
【図２】
0005939524.tif 000012
【図３】
0005939524.tif 000013
【図４】
0005939524.tif 000014
【図５】
0005939524.tif 000015
【図６】
0005939524.tif 000016
【図７】
0005939524.tif 000017
【図８】
0005939524.tif 000018
【図９】
0005939524.tif 000019
【図１０】
0005939524.tif 000020
【図１１】
0005939524.tif 000021
【図１２】
0005939524.tif 000022
【図１３】
0005939524.tif 000023
【図１４Ａ】
0005939524.tif 000024
【図１４Ｂ】
0005939524.tif 000025
【図１４Ｃ】
0005939524.tif 000026
【図１５】
0005939524.tif 000027