(57)【要約】【課題】ＣＰＵ及びＧＰＵの両方にわたるデータパラレルコンピューティングのためのアプリケーションプログラミングインターフェイス（ＡＰＩ）を提供する。【解決手段】ホストプロセッサにおいてＡＰＩをコールするパラレルコンピューティングプログラムが、計算ユニット間でデータ処理タスクをパラレルに遂行するための方法及び装置を開示する。計算ユニットは、中央処理ユニット（ＣＰＵ）及びグラフィック処理ユニット（ＧＰＵ）を含むホストプロセッサに結合される。データ処理タスクのためのソースコードに対応するプログラムオブジェクトが、ＡＰＩコールに基づきホストプロセッサに結合されたメモリにおいて発生される。計算ユニットのための実行可能なコードが、ＡＰＩコールに基づきプログラムオブジェクトから発生されて、データ処理タスクの遂行のために計算ユニット間で同時に実行されるようロードされる。【選択図】図３
2011523141.tif 000002
【特許請求の範囲】
【請求項１】
ホストプロセッサと、
前記ホストプロセッサに結合された１つ以上の計算ユニットと、
前記ホストプロセッサ及び前記１つ以上の計算ユニットの少なくとも１つに結合されたメモリと、
を備え、前記メモリには、パラレルコンピューティングプログラムが記憶され、このパラレルコンピューティングプログラムは、前記ホストプロセッサが、
データ処理タスクのためのソースコードに対応するプログラムオブジェクトを発生すること、
前記１つ以上の計算ユニットに対して前記プログラムオブジェクトから実行可能なコードを発生すること、及び
データ処理タスクを遂行するために前記１つ以上の計算ユニット間で同時に実行されるべき実行可能なコードをロードすること、
を遂行するために１つ以上のＡＰＩ（アプリケーションプログラミングインターフェイス）へのコールを含むものである、パラレルコンピューティングシステム。
【請求項２】
前記プログラムオブジェクトは、前記ソースコードからコンパイルされたバイナリーコードを含み、このバイナリーコードは、前記１つ以上の計算ユニットのうちの少なくとも１つについての記述を含み、そして前記１つ以上の計算ユニットは、中央処理ユニット（ＣＰＵ）又はグラフィック処理ユニット（ＧＰＵ）を含む、請求項１に記載のシステム。
【請求項３】
前記プログラムオブジェクトを発生することは、予めコンパイルされたライブラリーからバイナリーコードを検索することを含み、そのバイナリーコードは、前記実行可能なコードを含むものである、請求項２に記載のシステム。
【請求項４】
前記実行可能なコードを発生することは、前記１つ以上の計算ユニットのうちの少なくとも１つにおいて前記実行可能なコードの１つを実行するスレッドの数を指定するために多次元値を含む１つ以上のコンパイルフラグに基づいて前記ソースコードを前記バイナリーコードへとコンパイルすることを含む、請求項２に記載のシステム。
【請求項５】
前記実行可能なコードをロードすることは、
前記ソースコードでデータ処理タスクを具現化するファンクションを識別するファンクション名に関連したカーネルオブジェクトを発生することを含み、そのカーネルオブジェクトは、ファンクションの引数の記憶部を含み、
更に、前記１つ以上の計算ユニット間で前記実行可能なコードの実行をスケジューリングすることを含み、前記実行は、前記１つ以上の計算ユニットの少なくとも１つにおいて前記実行可能なコードの１つを同時に実行するためのスレッドグループにおけるスレッドの数を含む、請求項１に記載のシステム。
【請求項６】
前記実行可能なコードをロードすることは、更に、前記引数の記憶部に対応するメモリに１つ以上のメモリオブジェクトを割り当てることを含む、請求項５に記載のシステム。
【請求項７】
前記スケジューリングは、前記１つ以上の計算ユニットにおいて前記実行可能なコードをパラレルに実行するためのスレッドの合計数を決定することを含む、請求項５に記載のシステム。
【請求項８】
前記決定することは、前記バイナリーコードを分析して、データ処理タスクを遂行するためのファンクションに対するリソース要求を決定することを含む、請求項７に記載のシステム。
【請求項９】
前記決定することは、更に、前記１つ以上の計算ユニットのうちの少なくとも１つについてのランタイムリソース利用性に基づきスレッドグループにおけるスレッドの数を決定することを含む、請求項８に記載のシステム。
【請求項１０】
前記ロードすることは、更に、１つ以上のＡＰＩへの１つ以上のコールに応答してスレッドグループにおけるスレッドの数を検索することを含む、請求項５に記載のシステム。
【請求項１１】
ホストプロセッサが、
データ処理タスクのためのソースコードに対応するプログラムオブジェクトを発生すること、
前記ホストプロセッサに結合された１つ以上の計算ユニットに対して前記プログラムオブジェクトから実行可能なコードを発生すること、及び
データ処理タスクを遂行するために前記１つ以上の計算ユニット間で同時に実行されるべき実行可能なコードをロードすること、
を含む１つ以上のホストファンクションを遂行するための１つ以上のＡＰＩ（アプリケーションプログラミングインターフェイス）に対応するホストファンクショントークンと、
前記データ処理タスクのための前記ソースコードに対応するカーネルファンクショントークンと、
を含む複数のトークンを記憶するマシン読み取り可能な媒体。
【請求項１２】
前記プログラムオブジェクトは、前記ソースコードからコンパイルされたバイナリーコードを含み、このバイナリーコードは、前記１つ以上の計算ユニットのうちの少なくとも１つについての記述を含む、請求項１１に記載のマシン読み取り可能な媒体。
【請求項１３】
前記プログラムオブジェクトを発生することは、予めコンパイルされたライブラリーからバイナリーコードを検索することを含み、そのバイナリーコードは、前記実行可能なコードを含むものである、請求項１２に記載のマシン読み取り可能な媒体。
【請求項１４】
前記実行可能なコードを発生することは、前記１つ以上の計算ユニットのうちの少なくとも１つにおいて前記実行可能なコードの１つを実行するスレッドの数を指定するために多次元値を含む１つ以上のコンパイルフラグに基づき前記ソースコードを前記バイナリーコードへとコンパイルすることを含む、請求項１２に記載のマシン読み取り可能な媒体。
【請求項１５】
前記実行可能なコードをロードすることは、
前記ソースコードでデータ処理タスクを具現化するファンクションを識別するファンクション名に関連したカーネルオブジェクトを発生することを含み、そのカーネルオブジェクトは、ファンクションの引数の記憶部を含み、
更に、前記１つ以上の計算ユニット間で前記実行可能なコードの実行をスケジューリングすることを含み、前記スケジューリングは、前記１つ以上の計算ユニットの少なくとも１つにおいて前記実行可能なコードの１つを同時に実行するためのスレッドグループにおけるスレッドの数を含む、請求項１１に記載のマシン読み取り可能な媒体。
【請求項１６】
前記実行可能なコードをロードすることは、更に、前記引数の記憶部に対するメモリに１つ以上のメモリオブジェクトを割り当てることを含む、請求項１５に記載のマシン読み取り可能な媒体。
【請求項１７】
前記スケジューリングは、前記１つ以上の計算ユニットにおいて前記実行可能なコードをパラレルに実行するためのスレッドの合計数を決定することを含む、請求項１５に記載のマシン読み取り可能な媒体。
【請求項１８】
前記決定することは、前記バイナリーコードを分析して、データ処理タスクを遂行するためのファンクションに対するリソース要求を決定することを含む、請求項１７に記載のマシン読み取り可能な媒体。
【請求項１９】
前記決定することは、更に、前記１つ以上の計算ユニットのうちの少なくとも１つについてのランタイムリソース利用性に基づきスレッドグループにおけるスレッドの数を決定することを含む、請求項１８に記載のマシン読み取り可能な媒体。
【請求項２０】
前記スケジュールされた実行が完了したかどうか指示する状態値を含むイベントオブジェクトを発生すること、及び
前記１つ以上のＡＰＩへの１つ以上のコールに応答してパラレルコンピューティングプログラムに対する状態値を検索すること、
を更に備えた請求項１５に記載のマシン読み取り可能な媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、データパラレルコンピューティングに係る。より詳細には、本発明は、ＣＰＵ（中央処理ユニット）及びＧＰＵ（グラフィック処理ユニット）の両方にわたるデータパラレルコンピューティングのためのアプリケーションプログラミングインターフェイス（ＡＰＩ）に係る。
【０００２】
関連出願の相互参照：本出願は、参考としてここにそのまま援用するアーフタブＡムンシュ氏等の“Application Programming Interfaces for Data Parallel Computing on Multiple Processors”と題する２００８年６月６日に出願された米国プロビジョナル特許出願第６１／０５９，７３９号に係り、その利益を主張するものである。
【背景技術】
【０００３】
ＧＰＵが高性能パラレルコンピューティング装置に向けて進化し続けるにつれて、汎用コンピューティング装置と同様にＧＰＵでもデータパラレル計算を遂行するために益々多くのアプリケーションが書かれている。今日、これらアプリケーションは、ベンダー特有のインターフェイスを使用して特定のＧＰＵで実行されるように設計される。従って、これらアプリケーションは、ＧＰＵ及びＣＰＵの両方がデータ処理システムに利用できるときでも、ＣＰＵの処理リソースをレバレッジすることができない。又、そのようなアプリケーションが実行される異なるベンダーからＧＰＵにわたって処理リソースをレバレッジすることもできない。
【０００４】
しかしながら、データパラレル計算を遂行するために益々多くのＣＰＵが複数コアを含むにつれて、ＣＰＵ及び／又はＧＰＵのいずれか利用できるものによって益々多くの処理タスクをサポートできるようになった。慣習的に、ＧＰＵ及びＣＰＵは、互いに互換性のない個別のプログラミング環境を通して構成される。ほとんどのＧＰＵは、ベンダー特有の専用プログラムを必要とする。その結果、アプリケーションがＣＰＵ及びＧＰＵの両方の処理リソースをレバレッジすることが非常に困難であり、例えば、マルチコアＣＰＵと一緒にデータパラレルコンピューティング能力をもつＧＰＵの処理リソースをレバレッジすることが非常に困難である。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
それ故、近代的なデータ処理システムでは、以上の問題を克服し、タスクを遂行できるＣＰＵ及び１つ以上のＧＰＵのような利用可能な処理リソースを使用してタスクを遂行するアプリケーションを許すことが要望される。
【課題を解決するための手段】
【０００６】
本発明の実施形態は、ホストプロセッサにおいてＡＰＩをコールするパラレルコンピューティングプログラムが、ホストプロセッサに結合された中央処理ユニット（ＣＰＵ）及びグラフィック処理ユニット（ＧＰＵ）を含む計算ユニット間でデータ処理タスクをパラレルに遂行するための方法及び装置を包含する。データ処理タスクのためのソースコードに対応するプログラムオブジェクトが、ＡＰＩコールに基づきホストプロセッサに結合されたメモリにおいて発生される。計算ユニットのための実行可能なコードが、ＡＰＩコールに基づきプログラムオブジェクトから発生されて、データ処理タスクの遂行のために計算ユニット間で同時に実行されるようにロードされる。
【０００７】
本発明の他の特徴は、添付図面及び以下の詳細な説明から明らかとなろう。
【０００８】
本発明は、同じ要素が同じ参照番号で示された添付図面に一例として示されているが、これに限定されない。
【図面の簡単な説明】
【０００９】
【図１】アプリケーションについてのデータパラレル計算を遂行するようにＣＰＵ及び／又はＧＰＵを含むコンピューティング装置を構成するためのシステムの一実施形態を示すブロック図である。
【図２】複数スレッドを同時に実行するためにパラレルに動作する複数の計算プロセッサを伴うコンピューティング装置を例示するブロック図である。
【図３】コンピューティング装置識別子を使用する論理的コンピューティング装置として構成された複数の物理的コンピューティング装置の一実施形態を示すブロック図である。
【図４】アプリケーションから受け取られる能力要求とマッチングさせることによりコンピューティング装置識別子をもつ複数の物理的コンピューティング装置を構成するプロセスの一実施形態を示すフローチャートである。
【図５】論理的コンピューティング装置で計算実行可能体(a compute executable)を実行するためのプロセスの一実施形態を示すフローチャートである。
【図６】実行可能体(an executable)を実行すると決定された１つ以上の物理的コンピューティング装置のソースをコンパイルすることを含めて実行可能体をロードするためのランタイムプロセスの一実施形態を示すフローチャートである。
【図７】実行インスタンスに関連した論理的コンピューティング装置に対応する１つ以上の物理的コンピューティング装置において実行するために実行キューから計算カーネル実行インスタンスを選択するためのプロセスの一実施形態を示すフローチャートである。
【図８】複数の計算ユニット間で計算カーネルオブジェクトを同時に実行するための最適なスレッドグループサイズを決定するプロセスの一実施形態を示すフローチャートである。
【図９Ａ】ソースを記憶するＡＰＩ（アプリケーションプログラミングインターフェイス）ライブラリー、及びそのライブラリー内の１つ以上のＡＰＩに対する複数の実行可能体を複数の物理的コンピューティング装置により構築するプロセスの一実施形態を示すフローチャートである。
【図９Ｂ】ＡＰＩ要求に基づいてＡＰＩライブラリーから検索された対応ソースと共に複数の実行可能体の１つを実行するためのアプリケーションに対するプロセスの一実施形態を示すフローチャートである。
【図１０】複数の物理的コンピューティング装置において実行される計算カーネル実行可能体のための計算カーネルソースの一例を示すサンプルソースコードである。
【図１１Ａ】ＡＰＩをコールすることにより複数の物理的コンピューティング装置において複数の実行可能体の１つを実行するための論理的コンピューティング装置を構成する一例を示すサンプルソースコードである。
【図１１Ｂ】ＡＰＩをコールすることにより複数の物理的コンピューティング装置において複数の実行可能体の１つを実行するための論理的コンピューティング装置を構成する一例を示すサンプルソースコードである。
【図１１Ｃ】ＡＰＩをコールすることにより複数の物理的コンピューティング装置において複数の実行可能体の１つを実行するための論理的コンピューティング装置を構成する一例を示すサンプルソースコードである。
【図１２】ここに述べる実施形態に関連して使用できる複数のＣＰＵ及びＧＰＵ（グラフィック処理ユニット）をもつ典型的なコンピュータシステムの一例を示す。
【発明を実施するための形態】
【００１０】
複数のプロセッサにおいてデータパラレル計算を行うための方法及び装置について説明する。以下の説明では、本発明の実施形態を完全に説明するために多数の特定の細部について述べる。しかしながら、当業者であれば、本発明の実施形態は、これらの特定の細部がなくても実施できることが明らかであろう。他の点に関して、この説明の理解を不明瞭にしないために、良く知られたコンポーネント、構造及び技術は、詳細に説明しない。
【００１１】
本明細書において「一実施形態」又は「実施形態」とは、その実施形態に関連して述べる特定の特徴、構造又は特性が本発明の少なくとも１つの実施形態に含まれることを意味する。本明細書の種々の場所に現れる「一実施形態において」という句は、必ずしも全てが同じ実施形態を指していない。
【００１２】
図面に示されたプロセスは、ハードウェア（例えば、回路、専用ロジック、等）、ソフトウェア（汎用コンピュータシステム又は専用マシンにおいて実行されるような）、又はその両方の組み合わせより成る処理ロジックにより遂行される。これらプロセスは、順次のオペレーションに関して以下に述べるが、それらのオペレーションの幾つかは、異なる順序で遂行されてもよい。更に、あるオペレーションは、順次ではなくパラレルに遂行されてもよい。
【００１３】
グラフィック処理ユニット（ＧＰＵ）は、２Ｄ、３Ｄグラフィックオペレーション及び／又はデジタルビデオ関連ファンクションのような効率の高いグラフィックオペレーションを実施する専用グラフィックプロセッサである。ＧＰＵは、例えば、ブリッターオペレーション、テクスチャマッピング、多角形レンダリング、ピクセルシェーディング、及び頂点シェーディングのようなグラフィックオペレーションを遂行する特殊な（プログラム可能な）ハードウェアを含む。ＧＰＵは、フレームバッファからデータをフェッチし、そしてピクセルを一緒に混合し、映像をレンダリングして表示のためにフレームバッファへ戻す。又、ＧＰＵは、フレームバッファを制御すると共に、フレームバッファを使用して、例えば、ＣＲＴ又はＬＣＤディスプレイのようなディスプレイをリフレッシュすることもできる。ＣＲＴ又はＬＣＤのいずれのディスプレイも、少なくとも２０Ｈｚのレートでリフレッシュを必要とする短時間持続のディスプレイである（例えば、１／３０秒ごとにフレームバッファからのデータでディスプレイがリフレッシュされる）。通常、ＧＰＵは、ＧＰＵに結合されたＣＰＵからグラフィック処理タスクを取り込み、ディスプレイコントローラを経てディスプレイ装置へラスタグラフィック映像を出力する。本明細書において「ＧＰＵ」とは、参考としてここに援用するリンドホルド氏等の“Method and Apparatus for Multithreaded Processing of Data In a Programmable Graphics Processor”と題する米国特許第７，０１５，９１３号、及びスワン氏等の“Method for Deinterlacing Interlaced Video by A Graphics Processor”と題する米国特許第６，９７０，２０６号に述べられたグラフィックプロセッサ又はプログラム可能なグラフィックプロセッサでよい。
【００１４】
一実施形態において、ＣＰＵ又はＧＰＵのような複数の異なる形式のプロセッサは、データ処理システム内の利用可能な処理リソースの使用効率を高めるために１つ以上のアプリケーションに対するデータパラレル処理タスクを同時に遂行することができる。データ処理システムの処理リソースは、ＣＰＵ又はＧＰＵのような複数の物理的コンピューティング装置に基づくものである。物理的コンピューティング装置は、１つ以上の計算ユニットを含む。一実施形態において、データパラレル処理タスク（又はデータパラレルタスク）は、例えば、それらのタスクを遂行できるＣＰＵ又はＧＰＵのような複数の形式のプロセッサへデリゲートされる。データパラレルタスクは、プロセッサからのある特定の処理能力を必要とする。処理能力は、例えば、専用テクスチャハードウェアサポート、倍精度のフローティングポイント演算、専用ローカルメモリ、ストリームデータキャッシュ、又は同期プリミティブである。個々の形式のプロセッサは、異なるが重畳する処理能力グループをなす。例えば、ＣＰＵ及びＧＰＵの両方は、倍精度のフローティングポイント計算を遂行することができる。一実施形態において、アプリケーションは、ＣＰＵ又はＧＰＵのいずれか利用できる方をレバレッジして、データパラレル処理タスクを遂行することができる。
【００１５】
別の実施形態では、データパラレル処理タスクに対して複数の異なる形式の処理リソースを選択して割り当てることが、ランタイム中に自動的に遂行される。アプリケーションは、データ処理タスクに対する能力要求の希望リストを含むヒントを、ＡＰＩを経てデータ処理システムのランタイムプラットホームへ送信する。受け取ったヒントに基づいて、ランタイムプラットホームは、受け取ったヒントに一致する能力をもつ複数の現在利用可能なＣＰＵ及び／又はＧＰＵを決定して、アプリケーションに対するデータ処理タスクをデリゲートする。一実施形態において、能力要求のリストは、基礎となるデータ処理タスクに基づく。能力要求リストは、例えば、異なるベンダーからの異なるバージョンのＧＰＵ及びマルチコアＣＰＵを含めてプロセッサ又は計算ユニットの異なるグループにわたって適用することができる。従って、アプリケーションは、ＣＰＵ又はＧＰＵのような特定形式の計算ユニットをターゲットとするプログラムを提供することから隔離される。
【００１６】
更に、別の実施形態では、選択された計算ユニット間でパラレルに実行するために複数のスレッドを割り当て及びグループ化することは、データパラレルタスクに対する基礎的な問題空間に基づいて遂行される。選択された計算ユニットにおいて実行されるソースコードのための表現を分析することで、どのように処理タスクを最適に区画化しそしてその選択された計算ユニット間に分配しなければならないか決定することができる。ＡＰＩインターフェイスは、アプリケーションが、その選択された計算ユニット間でスレッドのグループにおいて実行可能体を実行することによりどのようにデータパラレルタスクを遂行すべきか特定できるようにする。更に、アプリケーションは、ＡＰＩを使用して、その選択された計算ユニット間でタスクを遂行するためのリソース要求に基づきデータパラレルタスクの最適な区画化に関する示唆を検索する。
【００１７】
図１は、アプリケーションについてのデータパラレル計算を遂行するようにＣＰＵ及び／又はＧＰＵを含むコンピューティング装置を構成するためのシステム１００の一実施形態を示すブロック図である。システム１００は、パラレル計算アーキテクチャーを実施する。一実施形態において、システム１００は、データバス１１３を通して１つ以上の中央プロセッサ１１７及び１つ以上の他のプロセッサ、例えば、メディアプロセッサ１１５に結合された１つ以上のホストプロセッサを含むグラフィックシステムである。ホストシステム１０１では複数のホストプロセッサが一緒にネットワーク化されている。複数の中央プロセッサ１１７は、異なるベンダーからのマルチコアＣＰＵを含む。ＣＰＵ又はＧＰＵのような計算プロセッサ又は計算ユニットには、能力のグループが関連付けられる。例えば、メディアプロセッサは、専用テクスチャレンダリングハードウェアをもつＧＰＵでよい。別のメディアプロセッサは、専用テクスチャレンダリングハードウェア及び倍精度のフローティングポイント演算の両方をサポートするＧＰＵでよい。又、複数のＧＰＵが、スケーラブルリンクインターフェイス（ＳＬＩ）又はクロスファイア構成で一緒に接続されてもよい。
【００１８】
一実施形態において、ホストシステム１０１は、ソフトウェアスタックをサポートする。ソフトウェアスタックは、アプリケーション１０３、計算プラットホームレイヤ１１１、例えば、オープンＣＬ（オープンコンピューティング言語）プラットホーム、計算ランタイムレイヤ１０９、計算コンパイラー１０７、及び計算アプリケーションライブラリー１０５のようなソフトウェアスタックコンポーネントを含むことができる。アプリケーション１０３は、ＡＰＩコールを通して他のスタックコンポーネントとインターフェイスすることができる。ホストシステム１０１内のアプリケーション１０３に対して１つ以上のスレッドを同時に実行することができる。計算プラットホームレイヤ１１１は、各々のアタッチされる物理的コンピューティング装置の処理能力を記憶するデータ構造又はコンピューティング装置データ構造を維持することができる。一実施形態において、アプリケーションは、計算プラットホームレイヤ１１１を通してホストシステム１０１の利用可能な処理リソースに関する情報を検索することができる。アプリケーションは、計算プラットホームレイヤ１１１を通して処理タスクを遂行するための能力要求を選択し及び特定することができる。従って、計算プラットホームレイヤ１１１は、処理タスクに対してアタッチされたＣＰＵ１１７及び／又はＧＰＵ１１５から処理リソースを割り当てそして初期化するための物理的コンピューティング装置の構成を決定する。一実施形態において、計算プラットホームレイヤ１１１は、構成される１つ以上の実際の物理的コンピューティング装置に対応するアプリケーションに対して１つ以上の論理的コンピューティング装置を生成する。
【００１９】
計算ランタイムレイヤ１０９は、アプリケーション１０３に対する構成された処理リソースによる処理タスクの実行を、例えば、１つ以上の論理的コンピューティング装置に基づいて、管理する。一実施形態において、処理タスクを実行することは、処理タスクを表す計算プログラムオブジェクトを生成し、そして例えば、実行可能体、入力／出力データ、等を保持するためのメモリリソースを割り当てることを含む。計算プログラムオブジェクトとしてロードされる実行可能体は、計算プログラム実行可能体(a compute program executable)である。この計算プログラム実行可能体は、ＣＰＵ又はＧＰＵのような計算プロセッサ又は計算ユニットにおいて実行される計算プログラムオブジェクトに含まれる。計算ランタイムレイヤ１０９は、割り当てられた物理的装置と対話して、処理タスクの実際の実行を行うことができる。一実施形態において、計算ランタイムレイヤ１０９は、異なるアプリケーションからの複数の処理タスクの実行を、処理タスクに対して構成されたＣＰＵ又はＧＰＵのような各プロセッサのランタイム状態に基づいて整合する。計算ランタイムレイヤ１０９は、このランタイム状態に基づき、処理タスクを遂行するように構成された物理的コンピューティング装置から１つ以上のプロセッサを選択する。処理タスクを遂行することは、複数の物理的コンピューティング装置において１つ以上の実行可能体の複数スレッドを同時に実行することを含む。一実施形態において、計算ランタイムレイヤ１０９は、各プロセッサのランタイム実行状態を監視することにより、各実行される処理タスクの状態を追跡する。
【００２０】
ランタイムレイヤは、アプリケーション１０３からの処理タスクに対応する計算プログラム実行可能体として１つ以上の実行可能体をロードする。一実施形態において、計算ランタイムレイヤ１０９は、計算アプリケーションライブラリー１０５からの処理タスクを遂行するのに必要な付加的な実行可能体を自動的にロードする。計算ランタイムレイヤ１０９は、アプリケーション１０３又は計算アプリケーションライブラリー１０５からの計算プログラムオブジェクトに対する実行可能体及びそれに対応するソースプログラムの両方をロードする。計算プログラムオブジェクトに対するソースプログラムは、計算プログラムソースである。単一の計算プログラムソースに基づく複数の実行可能体が、複数の形式及び／又は異なるバージョンの物理的コンピューティング装置を含むように構成された論理的コンピューティング装置に基づいてロードされる。一実施形態において、計算ランタイムレイヤ１０９は、計算コンパイラー１０７をアクチベートし、ロードされたソースプログラムを、例えば、実行可能体を実行するよう構成されたＣＰＵ又はＧＰＵのようなターゲットプロセッサに対して最適化された実行可能体へとオンラインコンパイルすることができる。
【００２１】
オンラインコンパイルされた実行可能体は、それに対応するソースプログラムに基づき既存の実行可能体に加えて将来呼び出すために記憶される。更に、実行可能体は、オフラインでコンパイルされて、ＡＰＩコールを使用して計算ランタイム１０９へロードされてもよい。計算アプリケーションライブラリー１０５及び／又はアプリケーション１０３は、アプリケーションからのライブラリーＡＰＩ要求に応答して関連実行可能体をロードすることができる。新たにコンパイルされた実行可能体は、計算アプリケーションライブラリー１０５又はアプリケーション１０３に対して動的に更新される。一実施形態において、計算ランタイム１０９は、アプリケーションにおける既存の計算プログラム実行可能体を、コンピューティング装置の新たにアップグレードされたバージョンに対して計算コンパイラー１０７を通してオンラインコンパイルされた新たな実行可能体に置き換える。計算ランタイム１０９は、オンラインコンパイルされた新たな実行可能体を挿入して、計算アプリケーションライブラリー１０５を更新することができる。一実施形態において、計算ランタイム１０９は、処理タスクに対して実行可能体をロードするときに計算コンパイラー１０７を呼び出す。別の実施形態では、計算コンパイラー１０７は、計算アプリケーションライブラリー１０５に対して実行可能体を構築するためにオフラインで呼び出される。計算コンパイラー１０７は、計算プログラム実行可能体を生成するように計算カーネルプログラムをコンパイルしリンクする。一実施形態において、計算アプリケーションライブラリー１０５は、例えば、開発ツールキット及び／又は映像処理をサポートするための複数の機能を含む。各ライブラリー機能は、複数の物理的コンピューティング装置に対して計算アプリケーションライブラリー１０５に記憶された１つの計算プログラムソース及び１つ以上の計算プログラム実行可能体に対応する。
【００２２】
図２は、複数スレッドを同時に実行するためにパラレルに動作する複数の計算プロセッサ（例えば、計算ユニット）を伴うコンピューティング装置を例示するブロック図である。各計算プロセッサは、複数のスレッドをパラレルに（又は同時に）実行する。計算プロセッサ又は計算ユニットにおいてパラレルに実行できるスレッドは、スレッドグループと称される。コンピューティング装置は、パラレルに実行できる複数のスレッドグループをもつことができる。例えば、コンピューティング装置２０５においてスレッドグループとして実行するためにＭ個のスレッドが示されている。複数のスレッドグループ、例えば、計算ｐｒｏｃｅｓｓｏｒ＿１  ２０５のスレッド１、及び計算ｐｒｏｃｅｓｓｏｒ＿Ｌ  ２０３のスレッドＮは、１つのコンピューティング装置における個別の計算プロセッサにわたり、又は複数のコンピューティング装置にわたりパラレルに実行することができる。複数の計算プロセッサにわたる複数のスレッドグループは、計算プログラム実行可能体をパラレルに実行する。２つ以上の計算プロセッサは、ＡＳＩＣ（特定用途向け集積回路）装置のような単一チップをベースとする。一実施形態において、アプリケーションからの複数スレッドは、複数のチップにわたり２つ以上の計算プロセッサにおいて同時に実行される。
【００２３】
コンピューティング装置は、Ｐｒｏｃｅｓｓｏｒ＿１  ２０５及びＰｒｏｃｅｓｓｏｒ＿Ｌ  ２０３のような１つ以上の計算プロセッサ又は計算ユニットを含む。計算プロセッサには、ローカルメモリが結合される。計算プロセッサで実行される単一スレッドグループのスレッド間に共有されるローカルメモリは、計算プロセッサに結合されたローカルメモリによってサポートされる。異なるスレッドグループからの複数スレッド、例えば、スレッド１  ２１３及びスレッドＮ  ２０９は、コンピューティング装置２０１に結合されたコンピューティング装置メモリ２１７に記憶されたストリームのような計算メモリオブジェクトを共有する。コンピューティング装置メモリ２１７は、グローバルメモリ及びコンスタントメモリを含む。グローバルメモリは、ストリームのような計算メモリオブジェクトを割り当てるのに使用される。計算メモリオブジェクトは、計算プログラム実行可能体により操作できるデータエレメントの集合を含む。計算メモリオブジェクトは、映像、テクスチャ、フレームバッファ、スカラーデータ形式のアレイ、ユーザ定義構造のアレイ、変数、等を表す。コンスタントメモリは、計算プログラム実行可能体により頻繁に使用されるコンスタント変数を記憶するリードオンリメモリである。
【００２４】
一実施形態において、計算プロセッサ又は計算ユニットのローカルメモリは、スレッドグループ内の全てのスレッドにより共有される変数を割り当てるのに使用される。ローカルメモリは、専用のローカル記憶装置、例えば、Ｐｒｏｃｅｓｓｏｒ＿１のためのローカル共有メモリ２１９及びＰｒｏｃｅｓｓｏｒ＿Ｌのためのローカル共有メモリ２１１として実施される。別の実施形態では、計算プロセッサのためのローカルメモリは、コンピューティング装置の１つ以上の計算プロセッサのためのコンピューティング装置メモリの読み取り／書き込みキャッシュ、例えば、コンピューティング装置２０１における計算プロセッサ２０５、２０３のためのデータキャッシュ２１５として実施される。専用のローカル記憶装置は、異なるスレッドグループにわたってスレッドにより共有されるのではない。Ｐｒｏｃｅｓｓｏｒ＿１  ２０５のような計算プロセッサのローカルメモリが、例えば、データキャッシュ２１５のような読み取り／書き込みキャッシュとして実施される場合には、ローカルメモリにあると宣言された変数は、コンピューティング装置メモリ２１７から割り当てられ、そしてローカルメモリを実施する例えばデータキャッシュ２１５のような読み取り／書き込みキャッシュにキャッシュ記憶される。スレッドグループ内のスレッドは、例えば、対応するコンピューティング装置に対して読み取り／書き込みキャッシュも専用のローカル記憶装置も利用できないときに、コンピューティング装置メモリ２１７に割り当てられたローカル変数を共有する。一実施形態において、各スレッドは、スレッドにおいてコールされるファンクションにより使用されるスレッドプライベート変数を記憶するためにプライベートメモリに関連付けられる。例えば、プライベートメモリ１  ２１１は、スレッド１  ２１３以外のスレッドからは見えない。
【００２５】
図３は、コンピューティング装置識別子を使用する論理的コンピューティング装置として構成された複数の物理的コンピューティング装置の一実施形態を示すブロック図である。一実施形態において、アプリケーション３０３及びプラットホームレイヤ３０５は、ホストＣＰＵ３０１において実行される。アプリケーション３０３は、図１のアプリケーション１０３の１つである。ホストシステム１０１は、ホストＣＰＵ３０１を含む。物理的コンピューティング装置Ｐｈｙｓｉｃａｌ＿Ｃｏｍｐｕｔｅ＿Ｄｅｖｉｃｅ−１  ３０５ないしＰｈｙｓｉｃａｌ＿Ｃｏｍｐｕｔｅ＿Ｄｅｖｉｃｅ−Ｎ  ３１１の各々は、図１のＣＰＵ１１７又はＧＰＵ１１５の１つである。一実施形態において、計算プラットホームレイヤ１１１は、ＡＰＩ要求に含まれた能力要求のリストに基づきデータパラレル処理リソースを構成するためにアプリケーション３０３からのＡＰＩ要求に応答してコンピューティング装置識別子３０７を発生する。このコンピューティング装置識別子３０７は、計算プラットホームレイヤ１１１による構成に基づき実際の物理的コンピューティング装置Ｐｈｙｓｉｃａｌ＿Ｃｏｍｐｕｔｅ＿Ｄｅｖｉｃｅ−１  ３０５ないしＰｈｙｓｉｃａｌ＿Ｃｏｍｐｕｔｅ＿Ｄｅｖｉｃｅ−Ｎ  ３１１の選択を指す。一実施形態において、論理的コンピューティング装置３０９は、ホストＣＰＵ３０１とは個別の選択された実際の物理的コンピューティング装置のグループを表す。
【００２６】
図４は、アプリケーションから受け取られる能力要求とマッチングさせることによりコンピューティング装置識別子をもつ複数の物理的コンピューティング装置を構成するためのプロセス４００の一実施形態を示すフローチャートである。規範的プロセス４００は、ハードウェア（回路、専用ロジック、等）、ソフトウェア（専用マシンで実行されるような）、又はその両方の組み合わせで構成される処理ロジックにより遂行される。例えば、プロセス４００は、図１のシステム１００に基づき、ホストシステム１０１によりホストされるデータ処理システムにおいて遂行される。データ処理システムは、図１の計算プラットホームレイヤ１１１のようなプラットホームレイヤをホストするホストプロセッサと、図１のＣＰＵ１１７及びＧＰＵ１１５のようなホストプロセッサにアタッチされる複数の物理的コンピューティング装置とを備えている。
【００２７】
ブロック４０１において、一実施形態では、プロセス４００の処理ロジックは、１つ以上の対応する能力に関連した複数の物理的コンピューティング装置を表すデータ構造（又はコンピューティング装置データ構造）を構築する。各物理的コンピューティング装置は、プロセス４００の処理ロジックを遂行する処理システムにアタッチされる。ＣＰＵ又はＧＰＵのような物理的コンピューティング装置の能力又は計算能力は、物理的コンピューティング装置が処理特徴をサポートするか、メモリアクセスメカニズムをサポートするか、命名拡張をサポートするか、又は関連制限をサポートするかを含む。処理特徴は、専用テクスチャハードウェアサポート、倍精度フローティングポイント演算又は同期サポート（例えば、ミューテックス）に関連している。
【００２８】
コンピューティング装置の能力は、コンピューティング装置に関連した処理特性或いは制限を指示する形式を含む。アプリケーションは、要求されるコンピューティング装置の形式を指定するか、又はＡＰＩを使用して特定のコンピューティング装置の形式を問合せる。コンピューティング装置の異なる形式の例が次のテーブルに示されている。
【表１】
2011523141.tif 000003
【００２９】
更に、コンピューティング装置の能力は、例えば、次のテーブルに示す構成値を含む。
【表２】
2011523141.tif 000004
2011523141.tif 000005
2011523141.tif 000006
【００３０】
物理的な処理装置のためのメモリアクセスメカニズムは、変数キャッシュの形式（例えば、サポートなし、リードオンリ、又はリード／ライト）、計算メモリオブジェクトキャッシュの形式、キャッシュサポートのサイズ、専用ローカルメモリサポート又はその関連制限に関連したものである。メモリアクセス制限は、計算プログラム実行可能体により同時に読み取り又は書き込みできる計算メモリオブジェクトの最大数、割り当てることのできる計算メモリオブジェクトの最大数、又は多次元の計算メモリオブジェクトのある次元に沿った最大サイズ、例えば、２Ｄ（二次元）映像に対する計算メモリオブジェクトの最大巾を含む。データ処理システムのシステムアプリケーションは、新たな物理的コンピューティング装置をデータ処理システムにアタッチするのに応答してデータ構造を更新することができる。一実施形態では、物理的コンピューティング装置の能力を予め決定することができる。別の実施形態では、データ処理システムのシステムアプリケーションが、ランタイム中に、新たにアタッチされた物理的処理装置を発見する。システムアプリケーションは、その新たに発見された物理的コンピューティング装置の能力を検索して、そのアタッチされた物理的コンピューティング装置及びそれに対応する能力を表すデータ構造を更新することができる。
【００３１】
一実施形態によれば、プロセス４００の処理ロジックは、ブロック４０３において、アプリケーションから計算能力要求を受け取る。アプリケーションは、ＡＰＩをコールすることによりシステムアプリケーションへその計算能力要求を送信する。システムアプリケーションは、そのアプリケーションに対するホストシステムのソフトウェアスタックのプラットホームレイヤに対応する。一実施形態では、計算能力要求は、アプリケーションに対するタスクを遂行するための処理リソースを要求するために要求された能力のリストを識別する。一実施形態では、アプリケーションは、要求された処理リソースが複数のスレッドにおけるタスクを同時に遂行することを要求する。それに応答して、プロセス４００の処理ロジックは、ブロック４０５において、アタッチされた物理的コンピューティング装置から物理的コンピューティング装置のグループを選択する。この選択は、計算能力要求と、能力データ構造に記憶された計算能力との間の一致に基づいて決定される。一実施形態では、プロセス４００の処理ロジックは、能力要求により与えられるヒントに基づいてマッチングをとる。
【００３２】
プロセス４００の処理ロジックは、物理的コンピューティング装置と計算能力要求との間で一致した計算能力の数に基づいてマッチングスコアを決定する。一実施形態では、プロセス４００の処理ロジックは、マッチングスコアが最も高い複数の物理的コンピューティング装置を選択する。別の実施形態では、プロセス４００の処理ロジックは、能力要求における各能力が一致した場合に、物理的コンピューティング装置を選択する。プロセス４００の処理ロジックは、ブロック４０５において、一致する物理的コンピューティング装置の複数グループを決定する。一実施形態では、一致する物理的コンピューティング装置の各グループは、各装置の負荷バランス能力に基づいて選択される。ブロック４０７において、一実施形態では、プロセス４００の処理ロジックは、ブロック４０５で選択された物理的コンピューティング装置のグループごとにコンピューティング装置識別子を発生する。プロセス４００の処理ロジックは、ＡＰＩをコールすることにより、発生されたコンピューティング装置識別子の１つ以上をアプリケーションへ返送する。アプリケーションは、コンピューティング装置識別子に基づいてタスクを遂行するためにどの処理リソースを使用すべきか選択する。一実施形態において、プロセス４００の処理ロジックは、受け取った能力要求ごとに、ブロック４０７において、せいぜい１つのコンピューティング装置識別子を発生する。
【００３３】
ブロック４０９において、一実施形態では、プロセス４００の処理ロジックは、対応するコンピューティング装置識別子に基づきブロック４０５で選択された物理的コンピューティング装置のグループに対して論理的コンピューティング装置を初期化するためにリソースを割り当てる。論理的コンピューティング装置は、１つ以上の物理的コンピューティング装置を含むコンピューティング装置である。プロセス４００の処理ロジックは、ブロック４０５での選択に基づき１つ以上のコンピューティング装置識別子を受け取ったアプリケーションからのＡＰＩ要求に応答して論理的コンピューティング装置の初期化を遂行する。プロセス４００の処理ロジックは、アプリケーションに対して論理的コンピューティング装置にコンテクストオブジェクトを生成する。コンテクストオブジェクトに対して計算メモリオブジェクト、計算プログラムオブジェクト、及び／又は計算プログラム実行可能体を操作するコマンドは、そのコンテクストオブジェクトを生成するときＡＰＩ要求で指定されたパラメータに基づいて順序正しく（例えば、同期状態で）又は順序ずれして（例えば、非同期状態で）実行される。計算メモリオブジェクト、計算プログラム、又は計算カーネルを操作するプロファイリングコマンドは、ＡＰＩ要求を使用してコンテクストオブジェクトに対してイネーブルされる。一実施形態において、コンテクストオブジェクトは、アプリケーションを実行するホストシステム内の１つのアプリケーションスレッドに関連付けられる。１つの論理的コンピューティング装置内で又は異なる論理的コンピューティング装置にわたって処理タスクを同時に遂行する複数スレッドは、個別のコンテクストオブジェクトに基づく。
【００３４】
一実施形態において、プロセス４００の処理ロジックは、ｃｌＣｒｅａｔｅＣｏｎｔｅｘｔ、ｃｌＲｅｔａｉｎＣｏｎｔｅｘｔ、及びｃｌＲｅｌｅａｓｅＣｏｎｔｅｘｔを含む複数のＡＰＩに基づく。ＡＰＩ  ｃｌＣｒｅａｔｅＣｏｎｔｅｘｔは、計算コンテクストを生成する。この計算コンテクストは、計算コンテクストオブジェクトに対応する。ＡＰＩ  ｃｌＲｅｔａｉｎＣｏｎｔｅｘｔは、コンテクストにより識別された特定の計算コンテクストをｃｌＲｅｌｅａｓｅＣｏｎｔｅｘｔへの入力引数として使用してインスタンスの数をインクリメントする。ＡＰＩ  ｃｌＣｒｅａｔｅＣｏｎｔｅｘｔは、暗示保有(an implicit retain)である。これは、典型的に、アプリケーションによってコンテクストが通される第三者ライブラリーにとって非常に有益である。しかしながら、アプリケーションは、ライブラリーに通知せずにコンテクストを削除することがあると考えられる。複数のインスタンスをコンテクストにアタッチしたりコンテクストから解除したりできることで、ライブラリーにより使用されている計算コンテクストがもはや有効でなくなる問題を解消する。ｃｌＲｅｔａｉｎＣｏｎｔｅｘｔへの入力引数が有効な計算コンテクストオブジェクトに対応しない場合には、ｃｌＲｅｔａｉｎＣｏｎｔｅｘｔが、ＣＵ＿ＩＮＶＡＬＩＤ＿ＣＯＮＴＥＸＴを返送する。ＡＰＩ  ｃｌＲｅｌｅａｓｅＣｏｎｔｅｘｔは、有効な計算コンテクストからインスタンスを解除する。ｃｌＲｅｌｅａｓｅＣｏｎｔｅｘｔへの入力引数が有効な計算コンテクストオブジェクトに対応しない場合には、ｃｌＲｅｌｅａｓｅＣｏｎｔｅｘｔが、ＣＵ＿ＩＮＶＡＬＩＤ＿ＣＯＮＴＥＸＴを返送する。
【００３５】
図５は、論理的コンピューティング装置において計算実行可能体を実行するための規範的プロセス５００の一実施形態を示すフローチャートである。一実施形態において、プロセス５００は、図１の計算ランタイムレイヤ１０９のようなデータ処理システムのランタイムレイヤにより遂行される。ブロック５０１において、プロセス５００の処理ロジックは、計算実行可能体を実行するために論理的コンピューティング装置に１つ以上の計算メモリオブジェクト（例えば、ストリーム）を割り当てる。この計算メモリオブジェクトは、例えば、映像メモリオブジェクト又はアレイメモリオブジェクトを表すために１つ以上のデータエレメントを含む。アレイメモリオブジェクトは、データエレメントの一次元集合である。映像メモリオブジェクトは、テクスチャ、フレームバッファ又は映像のような二次元、三次元又は他の多次元データを記憶するための集合である。処理タスクは、入力計算メモリオブジェクトから読み取りそして出力計算メモリオブジェクトへ書き込むことを含む計算メモリＡＰＩを使用して計算メモリオブジェクト又はストリームで動作する計算プログラム実行可能体により遂行される。一実施形態において、計算メモリオブジェクトは、計算メモリＡＰＩを使用してデータオブジェクトを更新するために、バッファオブジェクト、テクスチャオブジェクト、又はレンダーバッファオブジェクトのようなデータオブジェクトにアタッチされる。データオブジェクトは、そのデータオブジェクトにおいてテキストレンダリングのようなグラフィックデータ処理オペレーションをアクチベートするＡＰＩに関連付けられる。
【００３６】
計算メモリオブジェクトを割り当てるとき、プロセス５００の処理ロジックは、ＡＰＩの仕様に基づいてどこに割り当てを存在させるべきか決定する。例えば、計算メモリオブジェクトは、図１のホストシステム１０１のホストメモリのようなホストメモリ、及び／又は図２のグローバルメモリ又はコンスタントメモリ２１７のようなコンピューティング装置メモリから割り当てられる。ホストメモリに割り当てられる計算メモリオブジェクトは、コンピューティング装置メモリにキャッシュ記憶される必要がある。プロセス５００の処理ロジックは、例えば、データが計算メモリオブジェクトへロードされたかどうかを指示する同期データを含む発生されたイベントオブジェクトに基づいて、非ブロッキングＡＰＩインターフェイスを使用して、割り当てられた計算メモリオブジェクトへデータを非同期でロードする。一実施形態において、プロセス５００の処理ロジックは、割り当てられた計算メモリオブジェクトから読み取るか又はそこへ書き込むときにメモリアクセスオペレーションをスケジューリングする。プロセス５００の処理ロジックは、割り当てられたストリームメモリをマップして、アプリケーションの論理的アドレスを形成する。一実施形態において、プロセス５００の処理ロジックは、ブロック５０１において、図１のアプリケーション１０３のような、ホストプロセッサで実行中のアプリケーションからのＡＰＩ要求に基づき、オペレーションを遂行する。
【００３７】
ブロック５０３において、一実施形態によれば、プロセス５００の処理ロジックは、論理的コンピューティング装置（例えば、コンピューティング装置グループ）に対して計算プログラムオブジェクトを生成する。計算プログラムオブジェクトは、データパラレルプログラムのエクスポートされたファンクション又はエントリーポイントを表す計算カーネルのグループを含む。計算カーネルは、データパラレルタスク（例えば、ファンクション）を遂行するために計算ユニットにおいて実行できる計算プログラム実行可能体に対するポインタを含む。各計算カーネルは、ブロック５０１において割り当てられるストリームのような、ファンクション入力又は出力に対して割り当てられる計算メモリオブジェクト又はストリームを含むファンクション引数のグループに関連付けられる。
【００３８】
プロセス５００の処理ロジックは、ブロック５０９において、計算プログラムバイナリー及び／又は計算プログラムソースを計算プログラムオブジェクトへロードする。計算プログラムバイナリーは、コンピューティング装置で実行される計算プログラム実行可能体を示すビットを含む。計算プログラムバイナリーは、計算プログラム実行可能体、及び／又は計算プログラム実行可能体へと変換されるべき計算プログラムソースの中間表示である。一実施形態において、計算プログラム実行可能体は、例えば、ターゲット物理的コンピューティング装置の形式（例えば、ＧＰＵ又はＣＰＵ）、バージョン、及び／又はコンパイルオプション又はフラグ、例えば、スレッドグループサイズ及び／又はスレッドグループ次元に関連した記述データを含む。計算プログラムソースは、計算プログラム実行可能体がコンパイルされるソースコードである。プロセス５００の処理ロジックは、ブロック５０９において、計算プログラムソースに対応する複数の計算プログラム実行可能体をロードする。一実施形態において、プロセス５００の処理ロジックは、計算プログラム実行可能体を、アプリケーションから、又は図１の計算アプリケーションライブラリーのような計算ライブラリーを経てロードする。計算プログラム実行可能体は、それに対応する計算プログラムソースと共にロードされる。プロセス５００の処理ロジックは、ブロック５０５において、計算プログラムオブジェクトに対するファンクション引数を設定する。一実施形態では、プロセス５００の処理ロジックは、アプリケーションからのＡＰＩ要求に基づいて、ブロック５０３、５０５及び５０９においてオペレーションを遂行する。
【００３９】
ブロック５１１において、プロセス５００の処理ロジックは、論理的コンピューティング装置で計算カーネルオブジェクトを実行するために実行キューを更新する。プロセス５００の処理ロジックは、図１のアプリケーション１０３又は計算アプリケーションライブラリー１０５のようなアプリケーション又は計算アプリケーションライブラリーから、例えば、図１の計算ランタイム１０９のような計算ランタイムへの適当な引数を伴うＡＰＩコールに応答して計算カーネルを実行する。計算カーネルを実行することは、計算カーネルに関連した計算プログラム実行可能体を実行することを含む。一実施形態において、プロセス５００の処理ロジックは、計算カーネルを実行するために計算カーネル実行インスタンスを発生する。計算カーネルを実行するための図１の計算ランタイム１０９のような計算ランタームへのＡＰＩコールは、その性質が非同期である。実行インスタンスは、図１の計算ランタイム１０９のような計算ランタイムにより返送される計算イベントオブジェクトにより識別される。計算カーネル実行インスタンスは、計算カーネルインスタンスを実行するために実行キューへ追加される。
【００４０】
一実施形態において、計算カーネルを実行するための計算ランタイムへのＡＰＩコールは、計算プロセッサ上でスレッドグループとしてパラレルに同時に実行するスレッドの数を含む。ＡＰＩコールは、使用すべき計算プロセッサの数を含む。計算カーネル実行インスタンスは、対応する計算プログラム実行可能体を実行するための希望のプライオリティを指示するプライオリティ値を含む。又、計算カーネル実行インスタンスは、以前の実行インスタンスを識別するイベントオブジェクト、及び／又はスレッドの予想合計数、及び実行すべきスレッドグループの数も含む。スレッドグループの数及びスレッドの合計数は、ＡＰＩコールに指定される。一実施形態において、イベントオブジェクトは、そのイベントオブジェクトを含む実行インスタンスと、そのイベントオブジェクトにより識別される別の実行インスタンスとの間の実行順序関係を指示する。イベントオブジェクトを含む実行インスタンスは、イベントオブジェクトにより識別された別の実行インスタンスが実行を終了した後に実行されることが要求される。イベントオブジェクトは、ｑｕｅｕｅ＿ａｆｔｅｒ＿ｅｖｅｎｔ＿ｏｂｊｅｃｔと称される。一実施形態において、実行キューは、対応する計算プログラム実行可能体を実行するために複数の計算カーネル実行インスタンスを含む。計算プログラム実行可能体のための１つ以上の計算カーネル実行インスタンスは、実行キューにおいて実行されるようにスケジュールされる。一実施形態において、プロセス５００の処理ロジックは、アプリケーションからのＡＰＩ要求に応答して実行キューを更新する。実行キューは、アプリケーションが実行されるホストデータシステムによりホストされる。
【００４１】
ブロック５１３において、プロセス５００の処理ロジックは、実行のための実行キューから計算カーネル実行インスタンスを選択する。一実施形態において、プロセス５００の処理ロジックは、対応する論理的コンピューティング装置により同時に実行されるべき２つ以上の計算カーネル実行インスタンスを選択する。プロセス５００の処理ロジックは、計算カーネル実行インスタンスが実行キューから選択されるかどうかを、それに関連したプライオリティ、及び実行キュー内の他の実行インスタンスとの依存関係に基づいて決定する。計算カーネル実行インスタンスは、それに対応する計算カーネルオブジェクトを、その計算カーネルオブジェクトへロードされる実行可能体に基づいて実行することにより、実行される。
【００４２】
ブロック５１７において、一実施形態では、プロセス５００の処理ロジックは、計算カーネルオブジェクトに対し論理的コンピューティング装置に関連した物理的コンピューティング装置において実行するためにその選択された計算カーネルインスタンスに対応する計算カーネルオブジェクトにロードされる複数の実行可能体の１つを選択する。プロセス５００の処理ロジックは、１つの計算カーネル実行インスタンスに対し２つ以上の物理的コンピューティング装置においてパラレルに実行されるべき２つ以上の実行可能体を選択する。この選択は、選択された計算カーネル実行インスタンスに関連した論理的コンピューティング装置に対応する物理的コンピューティング装置の現在実行状態に基づいて行われる。物理的コンピューティング装置の実行状態は、実行中のスレッドの数、ローカルメモリ使用レベル、及びプロセッサ使用レベル（例えば、単位時間当たりのピークオペレーション数）、等を含む。一実施形態において、この選択は、所定の使用レベルに基づいて行われる。別の実施形態では、この選択は、計算カーネル実行インスタンスに関連したスレッドの数及びスレッドグループの数に基づいて行われる。プロセス５００の処理ロジックは、物理的コンピューティング装置から実行状態を検索する。一実施形態において、プロセス５００の処理ロジックは、ホストシステムで実行中のアプリケーションに対してブロック５１３、５１７を非同期で実行するように実行キューから計算カーネル実行インスタンスを選択するためのオペレーションを遂行する。
【００４３】
ブロック５１９において、プロセス５００の処理ロジックは、実行キューにおいて実行するようにスケジュールされた計算カーネル実行インスタンスの実行状態をチェックする。各実行インスタンスは、独特の計算イベントオブジェクトにより識別される。イベントオブジェクトは、図１のランタイム１０９のような計算ランタイムに基づいて、対応する計算カーネル実行インスタンスがキューイングされたとき、実行インスタンスを実行するためにＡＰＩをコールする図５のアプリケーション１０３又は計算アプリケーションライブラリー１０５のようなアプリケーション又は計算アプリケーションライブラリーへ返送される。一実施形態において、プロセス５００の処理ロジックは、アプリケーションからのＡＰＩ要求に応答して実行状態チェックを遂行する。プロセス５００の処理ロジックは、計算カーネル実行インスタンスを識別する計算イベントオブジェクトの状態を問合せることにより計算カーネル実行インスタンスの実行の完了を決定する。プロセス５００の処理ロジックは、アプリケーションからのＡＰＩコールへ戻るために計算カーネル実行インスタンスの実行が完了するまで待機する。プロセス５００の処理ロジックは、計算イベントオブジェクトに基づき種々のストリームからの実行インスタンスの読み取り及び／又はそこへの書き込みの処理を制御する。
【００４４】
ブロック５２１において、一実施形態により、プロセス５００の処理ロジックは、計算カーネル実行インスタンスの実行結果を検索する。その後、プロセス５００の処理ロジックは、計算カーネル実行インスタンスを実行するために割り当てられた処理リソースをクリーンアップする。一実施形態において、プロセス５００の処理ロジックは、計算カーネル実行可能体の実行結果を保持するストリームメモリをローカルメモリへコピーする。プロセス５００の処理ロジックは、ブロック５０１において割り当てられた変数ストリーム又は映像ストリームを削除する。プロセス５００の処理ロジックは、計算カーネル実行が完了するときを検出するためにカーネル事象オブジェクトを削除する。特定の計算カーネルオブジェクトに関連した各計算カーネル実行インスタンスが完全に実行された場合には、プロセス５００の処理ロジックは、特定の計算カーネルオブジェクトを削除する。一実施形態において、プロセス５００の処理ロジックは、アプリケーションにより開始されたＡＰＩ要求に基づいてブロック５２１においてオペレーションを遂行する。
【００４５】
図６は、実行可能体を実行すると決定された１つ以上の物理的コンピューティング装置のソースをコンパイルすることを含めて実行可能体をロードするためのランタイムプロセス６００の一実施形態を示すフローチャートである。このプロセス６００は、図５のブロック５０７におけるプロセス５００の一部分として遂行される。一実施形態において、プロセス６００は、ブロック６０１において、論理的コンピューティング装置に関連した物理的コンピューティング装置ごとに、その物理的コンピューティング装置に適合する１つ以上の既存の計算カーネル実行可能体を選択する。計算カーネル実行可能体は、適合する物理的コンピューティング装置において実行される。既存の計算カーネル実行可能体は、アプリケーションから得られるか、又は図１の計算アプリケーションライブラリー１０５のような計算ライブラリーを通して得られる。選択された計算カーネル実行可能体の各々は、少なくとも１つの物理的コンピューティング装置により実行される。一実施形態において、その選択は、既存の計算カーネル実行可能体に関連した記述データに基づいて行われる。
【００４６】
既存の計算カーネルオブジェクトが選択された場合には、プロセス６００は、ブロック６０３において、選択された計算カーネル実行可能体のいずれかが物理的コンピューティング装置に対して最適であるかどうか決定する。この決定は、例えば、物理的コンピューティング装置のバージョンに基づいて行われる。一実施形態において、プロセス６００は、記述データにおけるターゲット物理的コンピューティング装置のバージョンが物理的コンピューティング装置のバージョンに一致する場合に既存の計算カーネル実行可能体が物理的コンピューティング装置に対して最適であると決定する。
【００４７】
ブロック６０５において、一実施形態では、プロセス６００は、図１の計算コンパイラー１０７のようなオンラインコンパイラーを使用して、対応する計算カーネルソースから物理的コンピューティング装置に最適な新たな計算カーネル実行可能体を構築する。プロセス６００は、ブロック６０３において、選択された計算カーネル実行可能体のどれもが物理的コンピューティング装置に最適でないと分かった場合には、オンライン構築を遂行する。一実施形態において、プロセス６００は、ブロック６０１において、既存の計算カーネル実行可能体のいずれもが物理的コンピューティング装置に適合しないと分かった場合には、オンライン構築を遂行する。計算カーネルソースは、アプリケーションから得られるか、又は図１の計算アプリケーションライブラリー１０５のような計算ライブラリーを通して得られる。
【００４８】
ブロック６０５における構築が成功である場合には、一実施形態では、プロセス６００は、ブロック６０７において、新たに構築された計算カーネル実行可能体をそれに対応する計算カーネルオブジェクトへロードする。さもなければ、プロセス６００は、ブロック６０９において、選択された計算カーネル実行可能体をカーネルオブジェクトへロードする。一実施形態において、プロセス６００は、計算カーネル実行可能体がまだロードされない場合には、計算カーネル実行可能体を計算カーネルオブジェクトへロードしてもよい。別の実施形態では、プロセス６００は、計算カーネルオブジェクトに対する既存の計算カーネル実行可能体のいずれもが物理的コンピューティング装置に適合せず且つそれに対応する計算カーネルソースが得られない場合には、エラーメッセージを発生してもよい。
【００４９】
図７は、実行インスタンスに関連した論理的コンピューティング装置に対応する１つ以上の物理的コンピューティング装置において実行するために実行キューから計算カーネル実行インスタンスを選択するためのプロセス７００の一実施形態を示すフローチャートである。このプロセス７００は、図５のブロック５１３においてプロセス５００の一部分として遂行される。一実施形態では、プロセス７００は、ブロック７０１において、実行キュー内で現在スケジュールされている計算カーネル実行インスタンス間で依存条件を識別する。計算カーネル実行インスタンスの依存条件は、その条件が顕著なものである場合に計算カーネル実行インスタンスの実行を防止する。一実施形態では、依存条件は、出力ストリームにより供給される入力ストリーム間の関係に基づく。一実施形態では、プロセス７００は、実行インスタンスのための対応するファンクションの入力ストリーム及び出力ストリームに基づき実行インスタンス間の依存条件を検出する。別の実施形態では、プライオリティレベルの低い実行インスタンスは、プライオリティレベルの高い別の実行とで依存関係を有する。
【００５０】
ブロック７０３において、一実施形態では、プロセス７００は、顕著な依存条件のない複数のスケジュールされた計算カーネル実行インスタンスから実行のための計算カーネル実行インスタンスを選択する。この選択は、実行インスタンスに指定されたプライオリティレベルに基づく。一実施形態では、その選択された計算カーネル実行インスタンスは、顕著な依存条件のない複数の計算カーネル実行インスタンス間で最も高いプライオリティレベルが関連付けられる。ブロック７０５において、プロセス７００は、選択された計算カーネル実行インスタンスに対応する１つ以上の物理的コンピューティング装置の現在実行状態を検索する。一実施形態では、物理的コンピューティング装置の実行状態は、所定のメモリ位置から検索される。別の実施形態では、プロセス７００は、実行状態レポートを受け取るために物理的コンピューティング装置へ状態要求を送信する。プロセス７００は、ブロック７０７において、検索された実行状態に基づいて、選択された計算カーネル実行インスタンスを実行するために、１つ以上簿物理的コンピューティング装置を指定する。一実施形態では、物理的コンピューティング装置は、他の物理的コンピューティング装置との負荷バランス考慮に基づき、実行のために指定される。選択された物理的コンピューティング装置は、所定のプロセッサ使用レベル及び／又はメモリ使用レベルより低いといった１つ以上の特定の（例えば、所定の）基準を満足する実行状態が関連付けられる。一実施形態では、所定の基準は、選択された計算カーネル実行インスタンスに関連したスレッドの数及びスレッドグループの数に依存する。プロセス７００は、複数のスレッドをパラレルに実行するため、同じ実行インスタンス又は複数のインスタンスに対する個別の計算カーネル実行可能体を１つ以上の指定の物理的コンピューティング装置にロードする。
【００５１】
図８は、複数の計算ユニット間で計算カーネルオブジェクトを同時に実行するための最適なスレッドグループサイズを決定するプロセス８００の一実施形態を示すフローチャートである。この規範的プロセス８００は、ハードウェア（回路、専用ロジック、等）、ソフトウェア（専用マシンで実行されるような）、又はその両方の組み合わせで構成される処理ロジックにより遂行される。例えば、プロセス８００は、図１のシステム１００の幾つかのコンポーネントにより遂行されるか、又は図５のブロック５２３においてプロセス５００の一部分として遂行される。一実施形態では、ブロック８０１において、プロセス８００の処理ロジックは、異なる計算ユニットをターゲットとする単一ソースからコンパイルされた実行可能なコードからリソース要求を決定する。実行可能なコードのリソース要求は、実行可能なコードに対するターゲット計算ユニットのレジスタ、メモリ及び／又は他のハードウェアコンポーネントに関する使用データを含む。単一ソースは、その単一ソースにより指定されるデータパラレルタスク（又はファンクション）を遂行するために異なる形式の計算ユニットへロードされる異なる実行可能なコードへとコンパイルされる。幾つかの実施形態では、プロセス８００の処理ロジックは、ソースコードと、そのソースコードからコンパイルされるインストラクションを実行するためのターゲット計算ユニットとに基づいて、リソース要求を決定する。
【００５２】
プロセス８００の処理ロジックは、ターゲット計算ユニットにおいて実行可能なコードを実行するための必要なリソースを決定するために計算ユニットをターゲットとするソースコードからコンパイルされた実行可能なコードの中間表示を分析（及び／又はトラバース）する。この分析中に、プロセス８００の処理ロジックは、マッチング最適化条件に基づいてソースコードの一部分を識別し、そのソースコードの識別された部分を再コンパイルして、ターゲット計算ユニットで実行するのに必要なリソースを減少する。例えば、プロセス８００の処理ロジックは、ソースコードの変数を定数値に置き換える。プロセス８００の処理ロジックは、対応する実行可能なコードの分析に基づいてデータパラレルタスクの次元を識別する。識別された次元が、例えば、ＡＰＩを使用して指定された次元とは異なるときには、プロセス８００の処理ロジックは、例えば、システム設定に基づいて、識別された次元及び指定の次元の一方を選択する。
【００５３】
ブロック８０３において、幾つかの実施形態では、プロセス８００の処理ロジックは、決定されたリソース要求に基づき、複数の計算ユニット間で実行可能なコードをパラレルに実行するための最適なスレッドグループサイズを決定する。スレッドのグループは、ターゲット計算ユニットにおいてコンパイルされた実行可能なコードを同時に実行する。最適なスレッドグループサイズは、計算ユニット内のリソース使用を最大にするように計算ユニットにおいて実行可能なコードを実行するためのスレッドグループ内のスレッドの数である。計算ユニットのリソース使用は、データパラレルタスクを遂行するための時間長さに関して測定される。幾つかの実施形態では、プロセス８００の処理ロジックは、実行可能なコードに対する最適なスレッドグループサイズを決定するために計算ユニットから現在リソース使用状態を検索する。最適なスレッドグループサイズは、遂行すべき実行可能なコードのためのデータパラレルタスクに関連した次元に基づく。次元は、データパラレルタスクに対する２つ以上の尺度に沿った繰り返し計算を指定する数である。例えば、映像処理タスクには、映像の巾及び映像の高さに沿った２の次元が関連付けられる。
【００５４】
ブロック８０５において、一実施形態によれば、プロセス８００の処理ロジックは、データパラレルタスク（又はファンクション）を遂行するために単一ソースからコンパイルされた１つ以上の実行可能なコード（又は計算カーネル）を複数の計算ユニット間でパラレルに実行するための合計スレッド数を決定する。プロセス８００の処理ロジックは、ホストプロセッサ（又はホスト処理ユニット）で実行中のアプリケーション、例えば、図１のホストシステム１０１のアプリケーション１０３からＡＰＩ要求を受け取る。このＡＰＩ要求は、多次元値をＮ個の整数のアレイ（Ｇ1、Ｇ2・・・ＧN）として有するグローバルスレッド数を含む。整数Ｎは、データパラレルタスクに関連した次元である。プロセス８００の処理ロジックは、次元を決定するために多次元値からアレイ内の整数の数をカウントする。ＡＰＩ要求に応答して、プロセス８００の処理ロジックは、Ｇ1＊Ｇ2・・・＊ＧNのようなＮ個の整数の積に基づき複数の計算ユニット間で実行可能なコードを実行するスレッドの合計数を決定する。
【００５５】
一実施形態では、プロセス８００の処理ロジックは、ブロック８０７において、ローカルスレッドグループ数が指定されたかどうか検証する。ローカルスレッドグループ数は、Ｎ個の整数のアレイ（Ｌ1、Ｌ2・・・ＬN）として指定された多次元値を有する。一実施形態では、ローカルスレッドグループ数の次元は、データパラレルタスクを遂行するための合計スレッド数の次元に等しい。プロセス８００の処理ロジックは、ソースコード及び／又はターゲット計算ユニットに対してそのソースコードからコンパイルされた実行可能なコードに関連したプログラムカーネルオブジェクトからローカルスレッドグループ数を検索する。一実施形態では、ローカルスレッドグループ数は、ソースコードをコンパイルするためにＡＰＩを使用して指定される。ローカルスレッドグループ数を検索できる場合には、プロセス８００の処理ロジックは、ローカルスレッドグループ数が既に指定されていることを検証する。幾つかの実施形態では、ローカルスレッドグループ数は、ホストプロセッサで実行中のアプリケーションからＡＰＩ要求を使用して指定される。ＡＰＩ要求は、多次元のグローバルスレッド数と、多次元のローカルスレッドグループ数の両方を含む。
【００５６】
ブロック８０９において、ローカルスレッドグループ数が指定された場合には、プロセス８００の処理ロジックは、その指定されたローカルスレッドグループ数に基づき、計算ユニットのためのスレッドグループサイズを指定する。一実施形態では、多次元値（Ｌ1、Ｌ2、・・・ＬN）を有するローカルスレッドグループ数に対応するスレッドグループサイズは、Ｎ個の整数の積Ｌ1＊Ｌ2＊・・・＊ＬNに等しい。異なる計算ユニットに対してコンパイルされた実行可能なコードは、異なるローカルスレッドグループ数が関連付けられる。ローカルスレッドグループ数が実行可能なコードに対して指定された場合には、プロセス８００の処理ロジックは、複数の計算ユニットに対する決定された最適なスレッドグループサイズに基づいて、例えば、ブロック８０３における最適なスレッドグループサイズの決定に基づいて、スレッドグループサイズを指定する。
【００５７】
プロセス８００の処理ロジックは、指定されたスレッドグループサイズを、ターゲット計算ユニットに対するランタイム中に許容スレッドグループサイズに対してチェックする。例えば、計算ユニットは、利用可能なリソースに基づき最大ランタイムスレッドグループサイズにより制限される。プロセス８００の処理ロジックは、ターゲットとするコンピューティング装置のランタイムリソース制約を満足するように、指定のスレッドグループサイズを調整する。幾つかの実施形態では、プロセス８００の処理ロジックは、多次元ローカルスレッドグループ数が指定されなかったときに、ブロック８１１において、最適なスレッドグループサイズを識別するための決定を遂行する。
【００５８】
ブロック８１３において、プロセス８００の処理ロジックは、データパラレルタスクに対し複数の計算ユニットにおいて同時に実行するようにスレッドグループサイズに基づいて合計スレッド数を区画する。実行可能なコードは、対応するスレッドグループサイズに等しいサイズをもつスレッドのグループとして計算ユニットにおいてパラレルに実行することができる。スレッドのグループのサイズは、グループにおけるスレッドの数である。プロセス８００の処理ロジックは、データパラレルタスクを、１つ以上の計算ユニットにわたって同時に実行できる適当な多次元ブロック又はスレッドグループへと分解する。
【００５９】
一実施形態では、実行可能なコードを実行するスレッドは、２つの個別のスレッド変数、即ちグローバルスレッドＩＤ（識別子）及びローカルスレッドＩＤにより識別される。グローバルスレッドＩＤは、（０、０、・・・０）でスタートしてグローバルスレッド数（Ｇ1、Ｇ2、・・・ＧN）に基づき（Ｇ1−1、Ｇ2−１、・・・ＧN−１）へと進む多次元値で指定される。同様に、ローカルスレッドＩＤは、（０、０、・・・０）でスタートしてローカルスレッドグループ数（Ｌ1、Ｌ2、・・・ＬN）に基づき（Ｌ1−1、Ｌ2−１、・・・ＬN−１）へと進む多次元値で指定される。スレッドに対するグローバルスレッドＩＤ及びローカルスレッドＩＤは、同じ次元の多次元値である。
【００６０】
図９Ａは、ソースを記憶するＡＰＩライブラリー、及びそのライブラリー内の１つ以上のＡＰＩに対する複数の実行可能体を複数の物理的コンピューティング装置により構築するプロセス９００Ａの一実施形態を示すフローチャートである。このプロセス９００Ａは、ブロック９０１において、ＡＰＩファンクションのソースコードをデータ処理システムへロードするためにオフラインで遂行される。ソースコードは、１つ以上の物理的コンピューティング装置において実行されるべき計算カーネルソースである。一実施形態では、プロセス９００Ａは、ブロック９０３において、ＡＰＩファンクションに対して複数のターゲット物理的コンピューティング装置を指定する。ターゲット物理的コンピューティング装置は、ＣＰＵ又はＧＰＵのような形式、バージョン又はベンダーに基づいて指定される。プロセス９００Ａは、ブロック９０５において、指定のターゲット物理的コンピューティング装置ごとに、ソースコードを計算カーネル実行可能体のような実行可能体へとコンパイルする。一実施形態では、プロセス９００Ａは、図１の計算コンパイラー１０７のようなオンラインコンパイラーに基づいて、オフラインでコンパイルを遂行する。
【００６１】
ブロック９０７において、プロセス９００Ａは、ＡＰＩファンクションのソースコードを、指定のターゲット物理的コンピューティング装置に対してコンパイルされた対応する実行可能体と共にＡＰＩライブラリーへ記憶する。ホストプロセッサで実行される図１のアプリケーション１０３のようなホストアプリケーションのソースコードを収容するために、単一の実行可能体に対する１つ以上のＡＰＩファンクションがＡＰＩライブラリーからエクスポートされる。例えば、アプリケーションは、ＯｐｅｎＣＬ  ＡＰＩを通常の“Ｃ”ファンクションコールとして使用して実行可能なコード（又は計算カーネル）を実行する。一実施形態では、各実行可能体は、例えば、ターゲット物理的コンピューティング装置の形式、バージョン及びベンダー、及び／又はコンパイルオプションを含む記述データと共に記憶される。この記述データは、ランタイム中に、図５のプロセス５００のようなプロセスにより検索される。
【００６２】
図９Ｂは、ＡＰＩ要求に基づいてＡＰＩライブラリーから検索された対応ソースと共に複数の実行可能体の１つを実行するためのアプリケーションに対するプロセス９００Ｂの一実施形態を示すフローチャートである。一実施形態では、このプロセス９００Ｂは、図１の計算アプリケーションライブラリー１０５のようなＡＰＩライブラリーを含む図１のホストシステム１０１のようなデータ処理システムにおいて図１のアプリケーション１０３のようなアプリケーションプログラムを実行する。ブロック９１１において、プロセス９００Ｂは、計算カーネルソースのようなソース及び計算カーネル実行可能体のような１つ以上の対応する実行可能体を、図５のプロセス５００のブロック５０７のように、ＡＰＩ要求に基づいてＡＰＩライブラリーから検索する。各実行可能体は、１つ以上のターゲット物理的コンピューティング装置が関連付けられる。一実施形態では、計算カーネル実行可能体は、物理的コンピューティング装置の複数のバージョンと後方互換性がある。ブロック９１３において、プロセス９００Ｂは、図５のプロセス５００のブロック５１７のように、関連ＡＰＩファンクションを遂行するために、複数の物理的コンピューティング装置におけるＡＰＩ要求に基づいて検索された実行可能体の１つを実行する。プロセス９００Ｂは、ブロック９０９においてアプリケーションを非同期で実行し、ブロック９１３においてＡＰＩファンクションを遂行する。
【００６３】
図１０は、複数の物理的コンピューティング装置において実行されるべき計算プログラム実行可能体のための計算プログラムソースコードの一実施例を示すサンプルソースコードである。この実施例１０００は、変数１００１及びストリーム（又は計算メモリオブジェクト）１００３を含む引数を伴うＡＰＩファンクションを表す。この実施例１０００は、図１のシステム１０１のようなパラレル計算環境のためのプログラミング言語に基づく。一実施形態では、パラレルプログラミング言語は、ここに述べる実施形態の１つ以上を具現化するように設計された付加的な拡張及び制約を伴うＡＮＳＩ（アメリカンナショナルスタンダードインスティテュート）Ｃ規格に基づいて指定される。拡張は、コンピューティング装置において実行されるべき計算カーネルファンクションを指定するためのクオリファイア１００５のようなファンクションクオリファイアを含む。計算カーネルファンクションは、他の計算カーネルファンクションによってコールされない。一実施形態では、計算カーネルファンクションは、パラレルプログラム言語においてホストファンクションによりコールされる。ホストファンクションは、通常のＡＮＳＩファンクションである。ホストファンクションは、計算カーネルファンクションを実行するコンピューティング装置とは別のホストプロセッサにおいて実行される。一実施形態では、拡張は、スレッドグループの全てのスレッドにより共有されるコンピューティング装置に関連したローカルメモリに割り当てる必要のある変数を記述するためのローカルクオリファイアを含む。このローカルクオリファイアは、計算カーネルファンクションの内部で宣言される。パラレルプログラミング言語の制約は、コンパイラー時間中又はランタイム中に、制約に違反するときに、エラーメッセージを出力するか又は実行から退出するといったエラー条件を発生するように実施される。
【００６４】
図１１Ａ−１１Ｃは、ＡＰＩをコールすることにより複数の物理的コンピューティング装置において複数の実行可能体の１つを実行するための論理的コンピューティング装置を構成する実施例を示すサンプルソースコードである。実施例１１００Ａ−１１００Ｃは、図１のホストシステム１０１のような複数の物理的コンピューティング装置がアタッチされたホストシステムにおいて実行されるアプリケーションによって実行される。実施例１１００Ａ−１１００Ｃは、パラレルプログラム言語のホストファンクションを指定する。実施例１１００Ａ−１１００Ｃは、における処理オペレーションは、図４のプロセス４００及び／又は図５のプロセス５００のようなプロセスによりＡＰＩコールとして遂行される。コンピューティング装置、コンピューティング装置グループ又は論理的コンピューティング装置１１０１からコンテクストオブジェクトを生成する処理オペレーションは、図４のブロック４１１においてプロセス４００の処理ロジックにより遂行される。入力／出力映像メモリオブジェクト（例えば、計算メモリオブジェクト）を割り当てるための処理オペレーションは、図５のブロック５０１においてプロセス５００の処理ロジックにより遂行される。
【００６５】
図１１Ｂを参照するに、アレイメモリオブジェクト１１０３ｂを割り当て及びロードするための処理オペレーションは、図５のブロック５０１においてプロセス５００の処理ロジックにより遂行される。計算プログラムオブジェクト１１０５を生成するための処理オペレーションは、図５のブロック５０３においてプロセス５００の処理ロジックにより遂行される。処理オペレーション１１０７は、図９の実施例９００のような計算プログラムソースを、生成される計算プログラムオブジェクトへロードする。処理オペレーション１１０９は、ロードされた計算プログラムソースから計算プログラム実行可能体を明確に構築する。一実施形態では、処理オペレーション１１０９は、既に構築された計算プログラム実行可能体を、生成された計算プログラムオブジェクトへロードする。従って、処理オペレーション１１１１は、コンピューティング装置での実行をスケジュールするために構築された計算プログラム実行可能体を指す計算カーネルオブジェクトを生成する。
【００６６】
図１１Ｃを参照するに、一実施形態では、処理オペレーション１１１３は、変数及び計算メモリオブジェクトを、生成された計算カーネルオブジェクトのファンクション引数としてアタッチする。処理オペレーション１１１３は、図５のブロック５０５においてプロセス５００の処理ロジックにより遂行される。処理オペレーション１１１５は、生成された計算カーネルオブジェクトを実行する。一実施形態では、処理オペレーション１１１５は、図５のブロック５１１においてプロセス５００の処理ロジックにより遂行される。処理オペレーション１１１５は、生成された計算カーネルオブジェクトに対応する計算カーネル実行インスタンスで実行キューを更新させる。処理オペレーション１１１７は、生成された計算カーネルオブジェクトの実行完了を同期的に待機する。一実施形態では、処理オペレーション１１１９は、計算カーネルオブジェクトの実行結果を検索する。従って、処理オペレーション１１２１は、イベントオブジェクト、生成された計算カーネルオブジェクト及び割り当てられたメモリのような計算カーネルオブジェクトを実行するために割り当てられたリソースをクリーンアップする。一実施形態では、処理オペレーション１１１７は、カーネルイベントオブジェクトがセットされたかどうかに基づいて非同期で遂行される。処理オペレーション１１１７は、図５のブロック５１９においてプロセス５００により遂行される。
【００６７】
図１２は、本発明の一実施形態に使用できるコンピュータシステム１２００の一実施例を示す。例えば、このシステム１２００は、図１に示すシステムの一部分として実施される。図１２は、コンピュータシステムの種々のコンポーネントを示すが、そのような細部は本発明に関係ないのでコンポーネントを相互接続する特定のアーキテクチャー又は仕方を表すものでないことに注意されたい。又、本発明の１つ以上の実施形態を具現化するために、より少数のコンポーネント又はおそらくより多くのコンポーネントを有するネットワークコンピュータ及び他のデータ処理システム（例えば、ハンドヘルドコンピュータ、パーソナルデジタルアシスタント（ＰＤＡ）、セルラー電話、娯楽システム、消費者向け電子装置、等）も使用できることが明らかである。
【００６８】
図１２に示すように、データ処理システムの一形式であるコンピュータシステム１２００は、ＣＰＵ及び／又はＧＰＵのようなマイクロプロセッサ１２０５、ＲＯＭ（リードオンリメモリ）１２０７、揮発性ＲＡＭ１２０９、及び不揮発性メモリ１２１１に結合されたバス１２０３を備えている。マイクロプロセッサ１２０５は、メモリ１２０、１２０９、１２１１からインストラクションを検索し、そしてキャッシュ１２２１を使用してインストラクションを実行して、上述したオペレーションを遂行する。バス１２０３は、これらの種々のコンポーネントを一緒に相互接続すると共に、これらのコンポーネント１２０５、１２０７、１２０９及び１２１１を、ディスプレイコントローラ及びディスプレイ装置１２１３へ、並びにマウス、キーボード、モデム、ネットワークインターフェイス、プリンタである入力／出力（Ｉ／Ｏ）装置、及びこの技術で良く知られた他の装置のような周辺装置へも相互接続する。典型的に、入力／出力装置９１５は、入力／出力コントローラ１２１７を経てシステムに結合される。揮発製ＲＡＭ（ランダムアクセスメモリ）１２０９は、典型的に、メモリ内のデータをリフレッシュ又は維持するために電力を常時要求するダイナミックＲＡＭ（ＤＲＡＭ）として具現化される。ディスプレイ装置１２１３に結合されるディスプレイコントローラは、表示データを処理するために１つ以上のＧＰＵを任意に含む。任意であるが、ＧＰＵメモリ１２１９は、ディスプレイ装置１２１３に含まれたＧＰＵをサポートするために設けられる。
【００６９】
大量記憶装置１２１１は、典型的に、システムから電力が取り去られた後も、データ（例えば、大量のデータ）を維持する磁気ハードドライブ又は磁気光学ドライブ又は光学ドライブ又はＤＶＤ  ＲＡＭ又はフラッシュメモリ又は他の形式のメモリシステムである。又、典型的に、大量記憶装置１２１１は、ランダムアクセスメモリであるが、これは必要でない。図１２は、大量記憶装置１２１１がデータ処理システムのコンポーネントの残り部分に直結されたローカル装置であることを示しているが、本発明は、システムから離れた不揮発性メモリ、例えば、モデム又はイーサネットインターフェイス又はワイヤレスネットワークインターフェイスのようなネットワークインターフェイスを通してデータ処理システムに結合されたネットワーク記憶装置を利用できることが明らかであろう。バス１２０３は、この技術で良く知られた種々のブリッジ、コントローラ、及び／又はアダプタを通して互いに接続された１つ以上のバスを含む。
【００７０】
上述した説明の各部分は、専用ロジック回路のようなロジック回路で具現化するか、或いはプログラムコードインストラクションを実行するマイクロコントローラ又は他の形態の処理コアで具現化することができる。従って、前記説明で教示されたプロセスは、インストラクション実行マシンに幾つかのファンクションを遂行させるマシン実行可能なインストラクションのようなプログラムコードで遂行することができる。この状況において、「マシン」とは、中間形態（又は「抽象的」）インストラクションを、プロセッサ特有のインストラクション（例えば、「バーチャルマシン」（例えば、Ｊａｖａバーチャルマシン）、インタープリター、共通言語ランタイム、高レベル言語バーチャルマシン等の抽象的実行環境）へ、及び／又は汎用プロセッサ及び／又は特殊目的プロセッサのようなインストラクションを実行するように設計された半導体チップ（例えば、トランジスタで実施された「ロジック回路」）に配置された電子回路へ変換するマシンである。又、前記説明で教示されたプロセスは、（マシンとは別に又はマシンとの組み合わせで）プログラムコードを実行せずにプロセス（又はその一部分）を遂行するように設計された電子回路により遂行されてもよい。
【００７１】
例えば、複数のトークンを含むプログラムコードを記憶するための製品が使用される。プログラムコードを記憶する製品は、１つ以上のメモリ（例えば、１つ以上のフラッシュメモリ、ランダムアクセスメモリ（スタティック、ダイナミック、等））、光学ディスク、ＣＤ−ＲＯＭ、ＤＶＤ  ＲＯＭ、ＥＰＲＯＭ、ＥＥＰＲＯＭ、磁気又は光学カード、或いは電子的インストラクションを記憶するのに適した他の形式のマシン読み取り可能な媒体として実施されるが、これに限定されない。又、プログラムコードは、伝播媒体で実施されるデータ信号により（例えば、通信リンク（例えば、ネットワーク接続）を使用して）リモートコンピュータ（例えば、サーバー）から要求側コンピュータ（例えば、クライアント）へダウンロードすることもできる。
【００７２】
上述した詳細な説明は、コンピュータメモリ内のデータビットに対するオペレーションのアルゴリズム及び記号表現に関して表現される。これらのアルゴリズムの説明及び表現は、データ処理技術の当業者が、その仕事の実体を他の当業者へ最も効率的に伝達するために使用されるツールである。アルゴリズムは、ここでは、そして一般的には、希望の結果を導くオペレーションの自己矛盾のないシーケンスであると考えられる。これらオペレーションは、物理的量の物理的な操作を必要とする。通常、必ずしもそうでないが、これらの量は、記憶、転送、合成、比較、及びその他、操作することのできる電気的又は磁気的信号の形態をとる。主として普通に使用されるという理由で、これらの信号をビット、値、エレメント、記号、キャラクタ、項、数字、等として参照するのが時々は便利であると分かっている。
【００７３】
しかしながら、これら及び同様の語は、全て、適当な物理量に関連付けられるべきであり、且つそれらの量に適用される便利な表示に過ぎないことを銘記されたい。特に指示のない限り、前記説明から明らかなように、説明全体にわたって、「処理」又は「コンピューティング」又は「計算」又は「決定」又は「表示」等の用語を使用する説明は、コンピュータシステムのレジスタ及びメモリ内の物理的（電子的）量として表されたデータを、コンピュータシステムのメモリ又はレジスタ或いは他のそのような情報記憶、伝達又は表示装置内の物理的量として同様に表された他のデータへと操作及び変換するコンピュータシステム又は同様の電子的コンピューティング装置のアクション及びプロセスを指すことが明らかである。
【００７４】
又、本発明は、ここに述べるオペレーションを遂行するための装置にも係る。この装置は、要求された目的に対して特別に構成されてもよいし、又はコンピュータに記憶されたコンピュータプログラムにより選択的にアクチベート又は再構成される汎用コンピュータを備えてもよい。そのようなコンピュータプログラムは、コンピュータ読み取り可能な記憶媒体、例えば、これに限定されないが、フロッピーディスク、光学的ディスク、ＣＤ−ＲＯＭ、及び磁気／光学ディスクを含む任意の形式のディスク、リードオンリメモリ（ＲＯＭ）、ＲＡＭ、ＥＰＲＯＭ、ＥＥＰＲＯＭ、磁気又は光学カード、或いは電子的インストラクションを記憶するのに適したもので、コンピュータシステムバスに各々結合される任意の形式の媒体、に記憶することができる。
【００７５】
ここに述べたプロセス及び表示は、特定のコンピュータ又は他の装置に固有に関連したものではない。種々の汎用システムを、ここでの教示に基づくプログラムと共に使用することもできるし、又はここに述べるオペレーションを遂行するための特殊な装置を構成するのも便利であることが分かっている。種々のこれらシステムに要求される構造は、以下の説明から明らかとなろう。更に、本発明は、特定のプログラミング言語を参照して説明されるものではない。ここに述べる本発明の教示を具現化するのに種々のプログラム言語を使用できることが明らかであろう。
【００７６】
以上の説明は、本発明の幾つかの規範的な実施形態を説明するに過ぎない。当業者であれば、このような説明、添付図面及び特許請求の範囲から、本発明の精神及び範囲から逸脱せずに種々の変更がなされ得ることがように認識されよう。
【符号の説明】
【００７７】
１００：システム
１０１：ホストシステム
１０３：アプリケーション
１０５：計算アプリケーションライブラリー
１０７：計算コンパイラー
１０９：計算ランタイムレイヤ
１１１：計算プラットホームレイヤ
１１３：データバス
１１５：メディアプロセッサ（ＧＰＵ）
１１７：中央プロセッサ（ＣＰＵ）
２０１：コンピューティング装置
２０３、２０５：計算プロセッサ
２０９：スレッドＮ
２１１：プライベートメモリ１
２１３：スレッド１
２１５：データキャッシュ
２１７：コンピューティング装置メモリ
２１９、２２１：ローカル共有メモリ
３０１：ホストＣＰＵ
３０３：アプリケーション
３０５：プラットホームレイヤ
３０７：コンピューティング装置識別子
３０９：論理的コンピューティング装置
１２００：コンピュータシステム
１２０３：バス
１２０５：マイクロプロセッサ
１２０７：ＲＯＭ
１２０９：揮発性ＲＡＭ
１２１１：不揮発性メモリ
１２１３：ディスプレイ装置
１２１７：入力／出力コントローラ
【図１】
2011523141.tif 000007
【図２】
2011523141.tif 000008
【図３】
2011523141.tif 000009
【図４】
2011523141.tif 000010
【図５】
2011523141.tif 000011
【図６】
2011523141.tif 000012
【図７】
2011523141.tif 000013
【図８】
2011523141.tif 000014
【図９Ａ】
2011523141.tif 000015
【図９Ｂ】
2011523141.tif 000016
【図１０】
2011523141.tif 000017
【図１１Ａ】
2011523141.tif 000018
【図１１Ｂ】
2011523141.tif 000019
【図１１Ｃ】
2011523141.tif 000020
【図１２】
2011523141.tif 000021
【国際調査報告】
2011523141.tif 000022
2011523141.tif 000023