(57)【要約】  複数プロセッサー間でのワークロードの分配に関する技術を開示している。一実施形態において、コンピュータ・システムは、第１、第２プロセッサーを含む。第１プロセッサーは、第１組のタスクを指定する第１組のバイト・コードを受信して、この第１組のタスクを第２プロセッサーへとオフロードするかどうかを判定するプログラム命令を実行する。第１組のタスクを第２プロセッサーへとオフロードすることが判定されたことに呼応して、このプログラム命令は、更に、第１組のタスクを実行するための一組の命令を生成させるよう実行可能である。一組の命令は、第１組のバイト・コードのものとは異なるフォーマットであり、このフォーマットは、第１プロセッサーによってサポートされる。更に、このプログラム命令は、一組の命令を第２プロセッサーへと供給させることで、この一組の命令を第２プロセッサーが実行するよう実行可能である。【選択図】図１
2013533533.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ・システムの第１プロセッサー上で実行可能なプログラム命令を記憶したコンピュータ可読記憶媒体であって、前記プログラム命令は、
第１組のバイト・コードを受信するステップであって、前記第１組のバイト・コードは、第１組のタスクを指定するステップと、
前記第１組のタスクを前記コンピュータ・システムの第２プロセッサーへオフロードするという判定に呼応して、前記第１組のタスクを実行するための一組の命令を生成させるステップと
を実行し、
前記一組の命令は、前記第１組のバイト・コードのフォーマットとは異なるフォーマットであり、前記フォーマットは、前記第２プロセッサーによってサポートされており、
更に、前記プログラム命令は、前記一組の命令を、その実行のために、前記第２プロセッサーへと供給させるステップも実行する、コンピュータ可読記憶媒体。
【請求項２】
前記プログラム命令は、前記第１プロセッサーの命令セット・アーキテクチャー（ＩＳＡ）内で命令を生成するため、前記第１プロセッサー上の制御プログラムによって解釈可能であることを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項３】
前記プログラム命令は、
第２組のバイト・コードを受信するステップであって、前記第２組のバイト・コードは、第２組のタスクを指定するステップと、
更に、前記第２組のタスクを前記第２プロセッサーにオフロードしないということが判定されたことに呼応して、前記第２組のバイト・コードを解釈して、前記第１プロセッサーの前記ＩＳＡ内で命令を生成することを前記制御プログラムに実行させるステップ
を実行するよう、前記制御プログラムにより更に解釈可能であり、
前記第１プロセッサーは、前記第２組のバイト・コードの解釈により生成される前記命令を実行することで、前記第２組のタスクを実行するよう構成されていることを特徴とする請求項２に記載のコンピュータ可読記憶媒体。
【請求項４】
前記プログラム命令は、
前記第２組のタスクを前記第２プロセッサーへオフロードしないということが判定されたことに呼応して、前記第２組のタスク内の複数タスクのそれぞれについてスレッドを１つ含むスレッド・プールを作成するために、前記制御プログラムによって解釈可能な対応する組のバイト・コードを生成するステップと、
更に、前記対応する組のバイト・コードを解釈して、前記第１プロセッサーの前記ＩＳＡ内で命令を生成することを、前記制御プログラムに対して実行させるステップと
を実行するよう、前記制御プログラムにより更に解釈可能であり、
前記第１プロセッサーは、前記対応する組のバイト・コードから生成される前記命令を実行することで、前記第２組のタスクを実行するよう構成されていることを特徴とする請求項３に記載のコンピュータ可読記憶媒体。
【請求項５】
前記制御プログラムは、仮想マシンを実現するよう実行可能であることを特徴とする請求項２に記載のコンピュータ可読記憶媒体。
【請求項６】
前記一組の命令を前記異なるフォーマットで前記自動生成させるステップは、
あるドメイン特化言語を有する一組のドメイン特化命令を生成するステップと、
前記一組のドメイン特化命令を前記一組の命令を前記異なるフォーマットで生成するよう実行可能な前記第２プロセッサーのドライバーへと供給するステップとを含むことを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項７】
前記ドメイン特化言語フォーマットを有する前記一組の命令を生成するステップは、
前記第１組のバイト・コードを実体化して、前記第１組のバイト・コードの中間表記を生成するステップと、
更に、前記第１組のバイト・コードの前記中間表記を変換して、前記一組のドメイン特化命令を生成するステップとを含む請求項６に記載のコンピュータ可読記憶媒体。
【請求項８】
前記プログラム命令は、
前記一組のドメイン特化命令を記憶するステップと、
前記第１組のバイト・コードを再受信するステップと、
前記一組のドメイン特化命令が記憶されたという判定に呼応して、前記記憶された一組のドメイン特化命令を前記第２プロセッサーの前記ドライバーへ供給し、前記第１組のタスクを実行するために、前記一組の命令を生成させるステップとを実行するよう実行可能であることを特徴とする請求項６に記載のコンピュータ可読記憶媒体。
【請求項９】
前記判定ステップは、前記第１プロセッサー、及び、前記第２プロセッサーによる前記第１組のタスクの過去の実行の解析に基くことを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項１０】
前記第１プロセッサーは、スレッド・プールを用いて、前記第１組のタスクの過去の実行の１つを実行することを特徴とする請求項９に記載のコンピュータ可読記憶媒体。
【請求項１１】
前記プログラム命令は、更に、
前記第２プロセッサーが前記一組の命令を実行する前に、前記第１組のタスクに関する一組の結果を記憶するための一組のメモリー位置を確保するステップと、
前記第２プロセッサーが前記一組の結果を生成する間、ガーベッジ・コレクターによる前記一組のメモリー位置の再割り当てを禁止するステップと、更に、
前記一組の結果を前記一組のメモリー位置に記憶するステップとを実行可能であることを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項１２】
前記第１組のバイト・コードは、アプリケーション・プログラミング・インターフェースへの１つ以上の呼び出を含むことで、前記第１組のタスクを指定することを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項１３】
前記第２プロセッサーは、グラフィックス・プロセッサーであることを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項１４】
コンパイル済ソース・コードとしてコンパイル済コードに含めるため、コンパイラーによってコンパイル可能なソース・プログラム命令を含むコンピュータ可読記憶媒体であって、
前記ソース・プログラム命令は、ライブラリー・ルーチンへのアプリケーション・プログラミング・インターフェース（ＡＰＩ）呼び出を含み、前記ＡＰＩ呼び出は、一組のタスクを指定し、前記ライブラリー・ルーチンは、コンパイル済ライブラリー・ルーチンとして前記コンパイル済コードに含めるため、コンパイラーによってコンパイル可能であり、
前記コンパイル済ソース・コードは、前記一組のタスクを前記コンパイル済ライブラリー・ルーチンへ送るため、コンピュータ・システムの第１プロセッサーの仮想マシンによって解釈可能であり、更に、
前記コンパイル済ライブラリー・ルーチンは、
前記一組のタスクを前記コンピュータ・システムの第２プロセッサーへとオフロードするという判定に呼応して、一組のドメイン特化命令を前記第２プロセッサーのドメイン特化言語フォーマットで生成させるステップと、
前記一組のドメイン特化命令を前記第２プロセッサーに供給させるステップとを実行するよう、前記仮想マシンにより解釈可能であることを特徴とするコンピュータ可読記憶媒体。
【請求項１５】
前記第２プロセッサーは、グラフィック・プロセッサーであり、更に、前記一組のドメイン特化命令の生成ステップは、前記コンパイル済ソース・コードを実体化するステップを含むことを特徴とする請求項１４に記載のコンピュータ可読記憶媒体。
【請求項１６】
前記ＡＰＩ呼び出は、前記ライブラリー・ルーチンに関連する基底クラスの拡張クラスを指定することを特徴とする請求項１４に記載のコンピュータ可読記憶媒体。
【請求項１７】
コンピュータ可読記憶媒体において、
コンパイル済ライブラリー・ルーチンとしてコンパイル済コードに含めるため、コンパイラーによってコンパイル可能なライブラリー・ルーチンのソース・プログラム命令を含み、
前記コンパイル済ライブラリー・ルーチンは、
第１組のバイト・コードを受信するステップであって、前記第１組のバイト・コードは、一組のタスクを指定するステップと、
前記一組のタスクを前記コンピュータ・システムの第２プロセッサーへオフロードするという判定に呼応して、前記一組のタスクを実行するための一組のドメイン特化命令を生成するステップと、更に、
前記ドメイン特化命令を、その実行のために、前記第２プロセッサーへと供給させるステップとを、コンピュータ・システムの第１プロセッサー上で実行可能とすることを特徴とするコンピュータ可読記憶媒体。
【請求項１８】
前記コンパイル済ライブラリー・ルーチンは、前記第１プロセッサー用の仮想マシンによって解釈可能であり、更に、前記仮想マシンは、コンパイル済命令を解釈して、前記第１プロセッサーの命令セット・アーキテクチャー（ＩＳＡ）内で命令を生成するよう実行可能であることを特徴とする請求項１７に記載のコンピュータ可読記憶媒体。
【請求項１９】
第１組の命令を受信するステップであって、前記第１組の命令は、一組のタスクを指定し、命令の受信は、コンピュータ・システムの第１プロセッサー上で実行されるライブラリー・ルーチンにより実行されるステップと、
前記ライブラリー・ルーチンが、前記一組のタスクを前記コンピュータ・システムの第２プロセッサーへとオフロードするかどうかを判定するステップと、
前記一組のタスクを前記第２プロセッサーへオフロードするということが判定されたことに呼応して、前記第１組のタスクを実行するための第２組の命令を生成させるステップと、
前記第２組の命令を、その実行のため、前記第２プロセッサーへと供給させるステップとを含み、
前記第２組の命令は、第１組の命令のフォーマットとは異なるフォーマットであり、前記フォーマットは、前記第２プロセッサーによりサポートされていることを特徴とする方法。
【請求項２０】
前記ルーチンは、前記第１プロセッサーの命令セット・アーキテクチャー（ＩＳＡ）内で命令を生成するよう実行可能な仮想マシンにより解釈可能であり、更に、前記第２プロセッサーは、グラフィックス・プロセッサーであることを特徴とする請求項１９に記載の方法。
【請求項２１】
コンピュータ・システムが、一組のタスクを指定する第１組のバイト・コードを受信するステップと、
前記一組のタスクを前記コンピュータ・システムの第１プロセッサーから前記コンピュータ・システムの第２プロセッサーへとオフロードするという判定に呼応して、前記コンピュータ・システムは、前記一組のタスクを実行するための一組のドメイン特化命令を生成するステップと、更に、
前記コンピュータ・システムは、前記ドメイン特化命令を、その実行のために、前記第２プロセッサーへと供給させるステップとを含む方法。
【請求項２２】
前記生成ステップは、第１プロセッサー用の仮想マシンによって解釈可能なコンパイル済ライブラリー・ルーチンによって実行され、更に、前記仮想マシンは、コンパイル済命令を解釈して、前記第１プロセッサーの命令セット・アーキテクチャー（ＩＳＡ）内で命令を生成するよう実行可能であることを特徴とする請求項２１に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ・プロセッサーに関し、具体的には、複数プロセッサー間のワークロードの分配技術に関する。
【背景技術】
【０００２】
コンピュータの性能を上げるため、最新型プロセッサーでは、様々な方法を実装して、複数タスクを同時に実行する。例えば、プロセッサーをパイプライン化、及び／または、マルチスレッド化する場合が多い。更に、プロセッサーの多くは、性能をより高めるために複数のコアを備える。また、複数のプロセッサーを、１つのコンピュータ・システムの中に含めることもできる。これらのプロセッサーの一部は、例えば、グラフィックス・プロセッサー、デジタル信号プロセッサー（ＤＳＰ）等の様に、種々のタスクに特化している場合もある。
【０００３】
これら計算資源全ての間でのワークロードの分配は、とりわけ、計算資源が種々のインターフェースを備える場合において、問題となることがある（例えば、第１プロセッサーで使用される第１フォーマット形式のコードが、第１フォーマットとは異なる第２フォーマット形式のコードを必要とする第２プロセッサーとインターフェース接続するのに使用できない）。これにより、この様な異種コンピューティング・プラットフォームにおける複数の資源を使おうとする開発者は、各計算資源専用のサポートを含むソフトウェアを記述しなければならないことが多い。このため、プログラマーが、異種コンピューティング・プラットフォーム全体でタスクを効率良く分配可能とするソフトウェアを記述することを可能とする「ドメイン特化」言語が、複数開発されている。この様な言語としては、ＯＰＥＮＣＬ、ＣＵＤＡ、ＤＩＲＥＣＴ  ＣＯＭＰＵＴＥ等がある。だが、これらの言語の使用は、面倒な場合がある。
【発明の概要】
【０００４】
複数のプロセッサー間でワークロードを自動分配するための種々の実施形態が、開示されている。一実施形態におけるコンピュータ可読記憶媒体は、コンピュータ・システムの第１プロセッサー上で、第１組のバイト・コードの受信を実行するよう実行可能なプログラム命令を記憶している。なお、第１組のバイト・コードは、第１組のタスクを指定している。このプログラム命令は、第１組のタスクをコンピュータ・システムの第２プロセッサーへとオフロードするということが判定されたことに呼応して、第１組のタスクを実行するための一組の命令を生成させることも実行可能である。この一組の命令は、第１組のバイト・コードのものとは異なるフォーマットであり、このフォーマットは、第２プロセッサーによりサポートされている。更に、このプログラム命令は、この一組の命令を、その実行のために、第２プロセッサーに供給させるよう実行可能である。
【０００５】
ある実施形態におけるコンピュータ可読記憶媒体は、コンパイル済ソース・コードとしてコンパイル済コードに含めるために、コンパイラーによってコンパイル可能なソース・プログラム命令を含む。ソース・プログラム命令は、ライブラリー・ルーチンへのアプリケーション・プログラミング・インターフェース（ＡＰＩ）呼び出を含む。このＡＰＩ呼び出では、一組のタスクを指定する。ライブラリー・ルーチンは、コンパイル済のライブラリー・ルーチンとしてコンパイル済コードの中に含めるため、コンパイラーによりコンパイル可能である。コンパイル済ソース・コードは、一組のタスクをコンパイル済ライブラリー・ルーチンへと送るため、コンピュータ・システムの第１プロセッサーの仮想マシンによって解釈可能である。コンパイル済ライブラリー・ルーチンは、一組のタスクをコンピュータ・システムの第２プロセッサーにオフロードするということが判定されたことに呼応して、第２プロセッサーのドメイン特化言語フォーマットでの一組のドメイン特化命令を生成させ、更に、この一組のドメイン特化命令を第２プロセッサーへと供給させるよう、仮想マシンにより解釈可能である。
【０００６】
ある実施形態におけるコンピュータ可読記憶媒体は、コンパイル済ライブラリー・ルーチンとしてコンパイル済コードへ含めるため、コンパイラーによってコンパイル可能なライブリー・ルーチンのソース・プログラム命令を含む。コンパイル済ライブラリー・ルーチンは、コンピュータ・システムの第１プロセッサー上で、第１組のバイト・コードの受信を実行するよう実行可能である。この第１組のバイト・コードは、一組のタスクを指定している。更に、コンパイル済ライブラリー・ルーチンは、一組のタスクをコンピュータ・システムの第２プロセッサーへとオフロードするということが判定されたことに呼応して、一組のタスクを実行するための一組のドメイン特化命令を生成し、このドメイン特化命令を、その実行のために、第２プロセッサーへと供給するよう実行可能である。
【０００７】
一実施形態における方法は、第１組の命令を受信するステップを含む。第１組の命令では、一組のタスクを指定し、命令の受信は、コンピュータ・システムの第１プロセッサー上で実行するライブラリー・ルーチンにより実行される。この方法は、一組のタスクをコンピュータ・システムの第２プロセッサーへとオフロードするかどうかを、ライブラリー・ルーチンにより判定するステップも含む。また、この方法は、一組のタスクをコンピュータ・システムの第２プロセッサーへオフロードするということが判定されたことに呼応して、第１組のタスクを実行するための第２組の命令を生成させるステップも含む。第２組の命令は、第１組の命令のものと異なるフォーマットであり、このフォーマットは、第２プロセッサーによりサポートされる。更に、この方法は、第２組の命令を、その実行のために、第２プロセッサーへと供給させるステップも含む。
【０００８】
一実施形態における方法は、コンピュータ・システムが、一組のタスクを指定する第１組のバイト・コードを受信するステップを含む。この方法は、一組のタスクをコンピュータ・システムの第１プロセッサーからコンピュータ・システムの第２プロセッサーへとオフロードするということが判定されたことに呼応して、一組のタスクを実行するための一組のドメイン特化命令を、コンピュータ・システムが作成するステップも含む。更に、この方法は、コンピュータ・システムによって、ドメイン特化命令を、その実行のために、第２プロセッサーへと供給させるステップも含む。
【図面の簡単な説明】
【０００９】
【図１】バイト・コードをドメイン特化言語に変換するよう構成された異種コンピューティング・プラットフォームの一実施形態を説明するブロック図である。
【図２】並列化に対応した専用タスクの実行モジュールの一実施形態を説明するブロック図である。
【図３】ドメイン特化言語サポートを提供するドライバーの一実施形態を説明するブロック図である。
【図４】指定タスクを並列実行するモジュールにおける判定ユニットの一実施形態を説明するブロック図である。
【図５】指定タスクを並列実行するモジュールにおける最適化ユニットの一実施形態を説明するブロック図である。
【図６】指定タスクを並列実行するモジュールにおける変換ユニットの一実施形態を説明するブロック図である。
【図７】コンピューティング・プラットフォームにおいてワークロードを自動展開する方法の一実施形態を説明する流れ図である。
【図８】コンピューティング・プラットフォームにおいてワークロードを自動展開する方法の別の実施形態を説明する流れ図である。
【図９】プログラム命令の例示的なコンパイルの一実施形態を説明するブロック図である。
【図１０】例示的なコンピュータ・システムの一実施形態を説明するブロック図である。
【図１１】例示的なコンピュータ可読記憶媒体の実施形態を説明するブロック図である。
【発明を実施するための形態】
【００１０】
本明細書には、「一実施形態」、または、「ある実施形態」への言及が含まれる。語句「一実施形態」、または、「ある実施形態」の外観は、必ずしも同じ実施形態を言及するわけではない。特定の機能、構造、または、特徴は、本開示と整合可能な全ての適切な様式で組み合わせることができる。
【００１１】
専門用語：  以下の段落では、本開示（添付の請求項も含む）で見られる用語に関する定義、及び／または、文脈を提供している。
【００１２】
「含む」：  この用語には、制約が含まれない。添付の請求項で使用されるように、この用語は、追加の構造、または、ステップを含めることを排除しない。「１つ以上のプロセッサー・ユニット‥を含む装置」を挙げる請求項の場合では、この請求項は、この装置が、追加の構成要素（例えば、ネットワーク・インターフェース・ユニット、グラフィックス回路等）を含めることを排除しない。
【００１３】
「するよう構成された」：  種々のユニット、回路、または、他の構成要素を、１つ以上のタスクを実行「するよう構成された」ものとして説明、または、特許請求することができる。この様な状況において、「するよう構成された」は、ユニット／回路／構成要素の中に、動作中にこれら１つ以上のタスクを実行する構造（例えば、回路）が含まれていることを示すことで、構造を含蓄するのに使用される。従って、このユニット／回路／構成要素は、特定のユニット／回路／構成要素が、現在動作状態に無い（例えば、作動していない）場合であっても、タスクを実行するよう構成されていると言うことができる。「するよう構成された」という言葉で使用されるユニット／回路／構成要素には、ハードウェア、例えば、回路、動作の実現に実行可能なプログラム命令を記憶するメモリーが含まれる。ユニット／回路／構成要素が、１つ以上のタスクを実行「するよう構成される」という提唱は、このユニット／回路／構成要素について、合衆国法典第３５巻１１２条第６項を行使することを明示的に意図していない。更に、「するよう構成された」には、対象タスク（複数可）を実行可能とする様式で動作するよう、ソフトウェア、及び／または、ファームウェア（例えば、ＦＰＧＡ、または、ソフトウェアを実行する汎用プロセッサー）により処理される汎用構造（例えば、汎用回路）を含めることができる。
【００１４】
「実行可能な」：  本明細書で使用されるように、この用語は、特定のプロセッサーに関連するフォーマット（例えば、このプロセッサーの命令セットアーキテクチャー（ＩＳＡ）について実行可能であるか、または、あるファイルから変換される（この変換は、ファイルを別のプラットフォームへと書き込まずにあるプラットフォームから別のプラットフォームへと実行される）メモリー・シーケンス内で実行可能なファイルフォーマット）における命令のみならず、プロセッサーのＩＳＡ用命令を生成するため、制御プログラム（例えば、ＪＡＶＡ（登録商標）仮想マシン）によって解釈可能な中間（即ち、非ソース・コード）フォーマットでの命令についても言及している。このため、用語「実行可能」は、本明細書で使用される用語「解釈可能」を包含している。だが、プロセッサーが、プログラム、または、命令を「実行」、或いは、「起動」していると言及されている場合、この用語は、該当するあらゆる結果を生成するため、プロセッサーのＩＳＡ内の一組の命令の動作を実際に実現させること（例えば、一組の命令の発行、復号化、実行、及び、完了（この用語は、例えば、プロセッサーのパイプラインの「実行」段には、限定されていない））を意味するのに使用される。
【００１５】
「異種コンピューティング・プラットフォーム」：  この用語は、従来技術において一般に受け入れられている意味を持ち、種々の種類のコンピュータ・ユニット、例えば、汎用プロセッサー（ＧＰＰ）、専用プロセッサー（即ち、デジタル信号プロセッサー（ＤＳＰ）、或いは、グラフィック処理ユニット（ＧＰＵ））、コプロセッサー、若しくは、カスタム高速ロジック（特定用途向け集積回路（ＡＳＩＣ）、フィールド・プログラマブル・ゲート・アレー（ＦＰＧＡ）等を有するシステムを含む。
【００１６】
「バイト・コード」：  本明細書で使用される様に、この用語は、コンパイル済のソース・コードの機械可読表記を幅広く言及している。ある場合では、バイト・コードは、変更せずにプロセッサーによって実行可能である。別の場合では、プロセッサー用の実行命令を生成するため、制御プログラム、例えば、インタープリター（ＪＡＶＡ（登録商標）仮想マシン、ＰＹＴＨＯＮインタープリター等）によって、バイト・コードを処理できる。本明細書で使用される様に、「インタープリター」とは、何らかのコードを基本プラットフォームへと実際には変換しないが、それぞれが、１つのバイト・コード命令と一致する事前に記述された複数の関数の処理を調整するプログラムのことも言及している。
【００１７】
「仮想マシン」：  この用語は、従来技術において一般に受け入れられている意味を持ち、物理的なコンピュータ・システムのソフトウェアによる実装形態を含み、仮想マシンは、物理的なコンピュータ・システム用の命令を受信して、これを実行するよう実行可能である。
【００１８】
「ドメイン特化言語」：  この用語は、従来技術において一般に受け入れられている意味を持ち、特定用途向けに設計された専用プログラム言語を含む。一方、「汎用プログラミング言語」は、種々の用途で使用するよう設計されたプログラム言語である。ドメイン特化言語の例として、ＳＱＬ、ＶＥＲＩＬＯＧ、ＯＰＥＮＣＬ等がある。汎用プログラミング言語は、例えば、Ｃ言語、ＪＡＶＡ（登録商標）、ＢＡＳＩＣ、ＰＹＴＨＯＮ等である。
【００１９】
「アプリケーション・プログラミング・インターフェース（ＡＰＩ）」：  この用語は、従来技術において一般に受け入れられている意味を持ち、あるソフトウェアが、別のソフトウェアと相互作用することを可能とするインターフェースを含む。プログラマーは、アプリケーション、ライブラリー・ルーチン、オペレーティング・システム等の機能を使用するためのＡＰＩ呼び出を作成できる。
【００２０】
本開示では、異種計算資源からなるコンピュータ・プラットフォームにおいて、ドメイン特化言語を使用する上での欠陥が幾つかあるということを認識している。この様な構成では、ソフトウェア開発者が、複数のプログラミング言語に熟練しているということが必要とされる。例えば、現行のＪＡＶＡ（登録商標）技術と相互運用できるよう、開発者は、ＯＰＥＮＣＬ「カーネル」（または、メソッド）をＯＰＥＮＣＬで記述し、このカーネルとＪＶＭの実行を調整するためのＣ／Ｃ＋＋言語のコードを記述し、更に、Ｊａｖａ（登録商標）のＪＮＩ（Ｊａｖａ（登録商標）  ネイティブ・インターフェース）ＡＰＩを用いて、記述したＣ／Ｃ＋＋言語のコードと通信できるよう、Ｊａｖａ（登録商標）コードを記述する必要が出てくるであろう。（なお、Ｃ／Ｃ＋＋言語のコードのステップを回避可能とするオープンソースの純粋なＪａｖａ（登録商標）バインディングがあるが、これは、Ｊａｖａ（登録商標）言語、または、ＳＤＫ／ＪＤＫの一部ではない）。このことにより、これら言語とインターフェースに熟達していない開発者は、この類のソフトウェアの作成を面倒に感じることがある。種々のバージョンのソフトウェアを、ドメイン特化言語をサポートするシステム、及び、この様な言語をサポートしないシステム専用に開発する必要がある。このため、ＯＰＥＮＣＬに対応しないコンピュータ・システムは、一部をＯＰＥＮＣＬで記述したプログラムを起動できなくなるという恐れがある。更に、ソース・コードが、異なる言語から構成されるような場合、コードのデバッグがより困難となる（一般に、デバッグ用ソフトウェアは、特定のプログラム言語に合わせて設計されている）。利用者は、ソース・コードの一部をデバッグできるのに、デバッグ・ソフトウェアは、ドメイン特化コードの箇所全体を飛ばしてしまうこともある。
【００２１】
このため、本開示では、異種コンピューティング・プラットフォームの計算資源の使用に通常求められるドメイン特化言語を、開発者が使わなくても良いように、この様な計算資源の利点を開発者が活用可能とする機構を提供している。以下の説明では、バイト・コード（管理下にあるランタイム環境、例えば、ＪＡＶＡ（登録商標）、ＦＬＡＳＨ、ＣＬＲ等から）をドメイン特化言語（ＯＰＥＮＣＬ、ＣＵＤＡ等）へと変換し、この様なワークロードを異種コンピューティング・プラットフォームへと自動展開する機構に関する実施形態を開示している。本明細書で使用される様に、用語「自動的に」は、利用者からの入力を必要とせずに、タスクが実行されることを意味する。例えば、以下で説明するように、ある実施形態において、一組の命令を、ライブラリー・ルーチンへと送り、この場合、ライブラリー・ルーチンは、一組の命令を他のプロセッサーへとオフロードできるかどうかを自動で判定するよう実行可能である。ここで、用語「自動的に」とは、判定を実行すべきということを示す入力を利用者が供給せずに、ライブラリー・ルーチンが要求時に判定を実行するのではなく、ライブラリー・ルーチンは、そこへ符号化される１つ以上の基準に従って、判定を実行することを意味する。
【００２２】
図１を参照すると、バイト・コードをドメイン特化言語へ変換するよう構成された異種コンピューティング・プラットフォーム１０に関する一実施形態が、図示されている。図の通り、プラットフォーム１０は、メモリー１００、プロセッサー１１０、及び、プロセッサー１２０を含む。この実施形態では、メモリー１００には、バイト・コード１０２、タスク・ランナー１１２、制御プログラム１１３、命令１１４、ドライバー１１６、オペレーティング・システム（ＯＳ）１１７、及び、命令１２２が含まれる。一部の実施形態では、プロセッサー１１０は、構成要素１１２〜１１７（点線で図示）を実行するよう構成され、一方、プロセッサー１２０は、命令１２２を実行するよう構成される。別の実施形態では、プラットフォーム１０の構成を、変えても良い。
【００２３】
メモリー１００は、ある実施形態では、プラットフォーム１０が利用できる情報を記憶するよう構成される。メモリー１００は、１つの実体として示しているが、一部の実施形態では、図１で示されるような種々の要素を記憶するよう構成されたプラットフォーム１０内の複数の構造に対応できる。一実施形態では、メモリー１００は、一次記憶装置、例えば、フラッシュ・メモリー、ランダム・アクセス・メモリー（ＲＡＭ−ＳＲＡＭ、ＥＤＯ  ＲＡＭ、ＳＤＲＡＭ、ＤＤＲ  ＳＤＲＡＭ、ＲＡＭＢＵＳ  ＲＡＭ等）、読み取り専用メモリー（ＰＲＯＭ、ＥＥＰＲＯＭ等）を含むことができる。ある実施形態では、メモリー１００は、ハードディスク・ストレージ、フロッピー（登録商標）ディスク・ストレージ、リムーバブル・ディスク・ストレージ等の二次記憶装置を含めても良い。一実施形態において、メモリー１００は、プロセッサー１１０、及び／または、１２０のキャッシュ・メモリーを含められる。実施形態によっては、メモリー１００に、一次、二次、キャッシュ・メモリーの組み合わせを含むことも可能である。種々の実施形態では、メモリー１００は、図１で示したものよりも多い（または、少ない）構成要素を含められる。
【００２４】
プロセッサー１１０は、一実施形態では、汎用プロセッサーである。一実施形態において、プロセッサー１１０は、プラットフォーム１０用の中央処理装置（ＣＰＵ）である。プロセッサー１１０は、ある実施形態において、マルチスレッド・スーパースカラー・プロセッサーである。一実施形態では、プロセッサー１００は、互いに独立して動作するよう構成された複数のマルチスレッド実行コアを含む。実施形態によっては、プラットフォーム１０は、プロセッサー１１０と類似の追加プロセッサーを含むことが可能である。端的には、プロセッサー１１０は、任意の適切なプロセッサーに相当する。
【００２５】
プロセッサー１２０は、一実施形態において、プロセッサー１１０からオフロードされてきたワークロード（即ち、命令、または、タスクの群）を実行するよう構成されたコプロセッサーである。ある実施形態では、プロセッサー１２０は、専用プロセッサー、例えば、ＤＳＰ、ＧＰＵ等である。一実施形態において、プロセッサー１２０は、ＡＳＩＣ、ＦＰＧＡ等の高速ロジックである。プロセッサー１２０が、マルチスレッド・スーパースカラー・プロセッサーである実施形態もある。実施形態によっては、プロセッサー１２０は、複数のマルチスレッド実行コアを含む。
【００２６】
バイト・コード１０２は、ある実施形態において、コンパイルされたソース・コードである。一実施形態では、バイト・コード１０２は、ＢＡＳＩＣ、Ｃ  ／  Ｃ＋＋、ＦＯＲＴＲＡＮ、ＪＡＶＡ（登録商標）、ＰＥＲＬ等の汎用プログラム言語のコンパイラーによって作成できる。ある実施形態では、バイト・コード１０２は、プロセッサー１１０によって直接実行可能である。つまり、バイト・コード１０２は、プロセッサー１１０用の命令セット・アーキテクチャー（ＩＳＡ）内で定義された複数の命令を含むことができる。別の実施形態では、バイト・コード１０２は、プロセッサー１１０によって実行可能な命令を生成（または、命令の処理を調整）するため、（例えば、仮想マシンによって）解釈できる。一実施形態において、バイト・コード１０２は、全実行可能なプログラムに対応可能である。他の実施形態では、バイト・コード１０２は、実行可能プログラムの一部に対応できる。種々の実施形態において、バイト・コード１０２は、所与のプログラム用のＪＡＶＡ（登録商標）コンパイラーのｊａｖａ（登録商標）ｃ命令によって作成された拡張子「．ｃｌａｓｓ」形式の複数のＪＡＶＡ（登録商標）ファイルの１つに対応できる。
【００２７】
ある実施形態では、バイト・コード１０２は、並列化用に複数のタスク１０４Ａ、１０４Ｂ（即ち、ワークロード）を指定する。以下で説明するように、種々の実施形態において、タスク１０４は、プロセッサー１１０、及び／または、プロセッサー１２０上で同時に実行可能である。一実施形態では、バイト・コード１０２は、タスク・ランナー１１２に関連するアプリケーション・プログラミング・インターフェース（ＡＰＩ）への呼び出を作成することで、タスク１０４を指定する。このＡＰＩによって、残りのソース・コードの記述で使用されるのと同じフォーマット（例えば、言語）としてデータ並列問題（即ち、同時に複数タスク１０４を実行することで起こりうる問題）をプログラマーが表記することが可能となる。例えば、ある特定の実施形態において、開発者は、データ並列問題を符号化するために基底クラスを拡張することで、複数タスク１０４を指定するＪＡＶＡ（登録商標）ソース・コードを記述する。この基底クラスは、ＡＰＩ内で定義され、バイト・コード１０２は、拡張クラスを表している。そして、拡張クラスのインスタンスは、タスク１０４を実行するため、タスク・ランナー１１２へと供給される。実施形態によっては、バイト・コード１０２は、並列化される（または、並列化が考慮される）種々の組のタスク１０４を指定できる。
【００２８】
タスク・ランナー１１２は、ある実施形態では、バイト・コード１０２で指定されるタスク１０４をプロセッサー１２０へとオフロードするかどうかを判定するよう実行可能なモジュールである。一実施形態において、バイト・コード１０２は、命令群（タスクを指定する）をタスク・ランナー１１２へと送る場合があり、それから、指定した命令群をプロセッサー１２０へと送るかどうかを判定できる。タスク・ランナー１１２は、種々の基準での判定に基くことが可能である。例えば、一実施形態において、ドライバー１１６が特定のドメイン特化言語をサポートしているかに少なくとも一部基き、タスクをオフロードするかどうかを、タスク・ランナー１１２によって判定できる。ある実施形態では、タスク・ランナー１１２がタスク１０４をプロセッサー１２０へオフロードするということを判定した場合、タスク１０４を表すドメイン特化言語として一組の命令を作成することにより、タスク・ランナー１１２は、プロセッサー１２０に対してタスク１０４を実行させる。（本明細書で使用される様に、「ドメイン特化命令」は、ドメイン特化言語で記述された命令のことである）。ある実施形態において、タスク・ランナー１１２は、バイト・コード１０２に対応する拡張子「．ｃｌａｓｓ」形式のファイルに含まれるメタデータを用いて、バイト・コード１０２をドメイン特化命令へと変換することで、一組の命令を作成する。別の実施形態では、元のソース・コードが、利用可能なままであれば（例えば、ＢＡＳＩＣ／ＪＡＶＡ（登録商標）／ＰＥＲＬ等で見られる様に）、タスク・ランナー１１２は、元のソース・コードのドメイン特化命令へのテキスト変換を実行できる。図示の実施形態では、タスク・ランナー１１２は、これらの生成した命令をドライバー１１６へと供給してから、プロセッサー１２０による実行のための命令１２２を作成する。一実施形態において、タスク・ランナー１１２は、対応する組のタスク１０４の結果を、ドライバー１１６から受信可能であり、この結果は、ドメイン特化言語により使用されるフォーマットとして表記される。実施形態によっては、プロセッサー１２０は、一組のタスク１０４に関する結果を計算した後で、タスク・ランナー１１２は、ドメイン特化言語フォーマットからの結果を命令１１４によって利用可能なフォーマットへと変換するよう実行可能である。例えば、一実施形態において、タスク・ランナー１１２は、ＯＰＥＮＣＬデータ種別からの一組の結果を、ＪＡＶＡ（登録商標）データ種別へと変換できる。タスク・ランナー１１２は、種々のドメイン特化言語、例えば、ＯＰＥＮＣＬ、ＣＵＤＡ、ＤＩＲＥＣＴ  ＣＯＭＰＵＴＥ等の任意のものに対応できる。一実施形態において、タスク・ランナー１１２が、タスク１０４をオフロードしないということを判定した場合、プロセッサー１１０は、タスク１０４を実行する。種々の実施形態において、タスク・ランナー１１２は、タスク１０４を実行するよう実行可能なプロセッサー１１０用の命令１１４を生成（または、生成を指示）することで、タスク１０４の実行を命令できる。一部の実施形態では、タスク・ランナー１１２は、プロセッサー１１０上でのタスク１０４の並列実行のため、バ���ト・コード１０２を最適化するよう実行できる。更に、レガシー・コード上で、タスク・ランナー１１２を実行可能な実施形態もある。例えば、ある実施形態において、バイト・コード１０２がレガシー・コードである場合、タスク・ランナー１１２は、このレガシー・コードによって実行されるタスクを、プロセッサー１２０へオフロードさせるか、または、プロセッサー１１０上で実行するため、レガシー・コードを最適化することができる。
【００２９】
種々の実施形態において、タスク・ランナー１１２は、タスク１０４をオフロードするかどうかの判定、一組のドメイン特化命令の作成、及び／または、実行時、つまり、バイト・コード１０２を含むプログラムのプラットフォーム１０による実行中におけるバイト・コード１０２の最適化を行うよう実行可能である。他の実施形態では、タスク・ランナー１１２は、実行時間以前にタスク１０４をオフロードするかどうかを判定できる。例えば、一部の実施形態において、タスク・ランナー１１２は、バイト・コード１０２を含むプログラムの次の実行のため、バイト・コード１０２を前処理できる。
【００３０】
ある実施形態では、タスク・ランナー１１２は、プロセッサー１１０により直接実行可能なプログラムである。つまり、メモリー１００には、プロセッサー１１０用のＩＳＡ内で定義されたタスク・ランナー１１２用の命令が含まれても良い。別の実施形態では、メモリー１１０は、プロセッサー１１０によって実行可能な命令を生成するため、制御プログラム１１３により解釈可能なタスク・ランナー１１２のバイト・コードを含むことができる。タスク・ランナーについて、図２、及び、図４〜６と併せて以下で説明する。
【００３１】
制御プログラム１１３は、ある実施形態において、タスク・ランナー１１２、及び／または、バイト・コード１０２の実行を管理するよう実行可能である。一部の実施形態では、制御プログラム１１３は、プラットフォーム１０内の他の要素、例えば、ドライバー１１６、及び、ＯＳ１１７とのタスク・ランナー１１２の相互作用を管理できる。ある実施形態では、制御プログラム１１３は、バイト・コード（例えば、バイト・コード１０２、及び／または、タスク・ランナー１１２のバイト・コード）からプロセッサー１１０によって実行可能な命令（命令１１４等）を生成するよう構成されたインタープリターである。例えば、ある実施形態において、タスク・ランナー１１２が、プロセッサー１１０上で一組のタスクを実行すると判定した場合、タスク・ランナー１１２は、バイト・コード１０２の一部を制御プログラム１１３へと供給して、命令１１４を生成できる。制御プログラム１１３は、種々のインタープリター型言語、例えば、ＢＡＳＩＣ、ＪＡＶＡ（登録商標）、ＰＥＲＬ、ＲＵＢＹ等の任意のものをサポートできる。一実施形態において、制御プログラム１１３は、物理的装置の１つ以上の属性を実装して、バイト・コードを実行するよう構成された仮想マシンを実現するよう実行可能である。実施形態によっては、制御プログラム１１３には、二度と使用されることの無いメモリー位置を再要求するのに使用されるガーベッジ・コレクターを含む場合もある。制御プログラム１１３は、ＳＵＮ社製のＪＡＶＡ（登録商標）仮想マシン、ＡＤＯＢＥ社製のＡＶＭ２、ＭＩＣＲＯＳＯＦＴ社製のＣＬＲ等を含む種々の仮想マシンのうちの任意のものに対応できる。制御プログラム１１３を、プラットフォーム１０中に含まなくても良い実施形態もある。
【００３２】
命令１１４は、ある実施形態では、タスク１０４を実行するために、プロセッサー１１０により実行可能な命令に相当する。一実施形態において、命令１１４は、バイト・コード１０２を解釈する制御プログラム１１３から生成される。上述の様に、ある実施形態において、制御プログラム１１３と連動して動作するタスク・ランナー１１２により、命令を生成できる。別の実施形態では、命令１１４が、バイト・コード１０２の中に含まれる。種々の実施形態において、命令１１４は、実行用にプロセッサー１２０からオフロードされてきたタスク１０４から生成された結果に対して作用するよう実行可能な命令を含んでも良い。例えば、命令１１４には、タスク１０４における種々のタスクの結果に影響する命令を含められる。実施形態によっては、命令１１４は、特定タスク１０４に関連しないバイト・コード１０２から生成された追加の命令を含むことができる。命令１１４の中に、タスク・ランナー１１２のバイト・コードから生成された命令（または、タスク・ランナー１１２からの命令）を含められる実施形態もある。
【００３３】
ドライバー１１６は、ある実施形態において、プラットフォーム１０内のプロセッサー１２０、及び、他の構成要素間の相互作用を管理するよう実行可能である。ドライバー１１６は、種々の種類のドライバー、例えば、グラフィックス・カード・ドライバー、サウンド・カード・ドライバー、ＤＳＰカード・ドライバー、他の種類の周辺装置ドライバー等の任意のものに対応できる。一実施形態では、ドライバー１１６は、プロセッサー１２０のドメイン特化言語サポートを提供する。つまり、ドライバー１１６は、一組のドメイン特化命令を受信して、プロセッサー１２０が実行可能な対応する組の命令１２２を生成できる。例えば、ある実施形態では、ドライバー１１６は、所与の組のタスク１０４用のＯＰＥＮＣＬ命令を、プロセッサー１２０のＩＳＡ命令へと変換して、変換済のＩＳＡ命令をプロセッサーへと供給して、一組のタスク１０４を実行させることが可能である。当然のことながら、ドライバー１１６は、種々のドメイン特化言語のうちの任意のものをサポートできる。ドライバー１１６については、図３と併せて以下で説明する。
【００３４】
ＯＳ１１７は、ある実施形態では、プラットフォーム１０上のプログラムの実行を管理するよう実行可能である。ＯＳ１１７は、ＬＩＮＵＸ（登録商標）、ＷＩＮＤＯＷＳ（登録商標）、ＯＳＸ、ＳＯＬＡＲＩＳ等の種々の公知のオペレーティング・システムのうちの任意のものに対応できる。ある実施形態では、ＯＳ１１７は、分散オペレーティング・システムの一部でも良い。種々の実施形態において、ＯＳには、プラットフォーム１０の１つ以上のハードウェア構成要素とプラットフォーム１０上のソフトウェアとの相互作用を調整するための複数のドライバーを含められる。一実施形態では、ドライバー１１６は、ＯＳ１１７内で統合される。他の実施形態では、ドライバー１１６は、ＯＳ１１７の構成要素では無い。
【００３５】
命令１２２は、ある実施形態では、タスク１０４を実行するために、プロセッサー１２０によって実行可能な命令を表している。前述の様に、ある実施形態において、命令１２２は、ドライバー１１６によって生成される。他の実施形態では、命令１２２は、例えば、タスク・ランナー１１２、制御プログラム１１３等によって個々に作成できる。一実施形態において、命令１２２は、プロセッサー１２０用のＩＳＡ内で定義される。別の実施形態では、命令１２２は、プロセッサー１２０によって実行可能な対応する組の命令を生成するため、プロセッサー１２０が使用する命令で良い。
【００３６】
種々の実施形態において、プラットフォーム１０は、プラットフォーム１０の複数の資源、例えば、プロセッサー１１０、１２０を使用するソフトウェアを、プログラマーが開発可能とする機構を提供する。ある場合では、ＯＰＥＮＣＬの様な特定のドメイン特化言語を理解していなくても、プログラマーは、１つの汎用言語（例えば、ＪＡＶＡ（登録商標））を用いて、ソフトウェアを記述できる。ソフトウェアは、同じ言語で記述できるため、その言語をサポートするデバッガー（例えば、統合開発環境ＥＣＬＩＰＳＥを介して、ＪＡＶＡ（登録商標）をデバッグするＧＮＵデバッガー）は、タスク１０４を実行するためＡＰＩ呼び出を行う部分を含むソフトウェアの部分全体をデバッグすることができる。タスク・ランナー１１２は、種々の実施形態において、実行時にタスクをオフロードするかどうかを判定するために実行可能で、しかも、この様なサポートは、所与のプラットフォーム１０上に存在するかどうかを判定できることから、場合によっては、これらプラットフォームが特定のドメイン特化言語用のサポートを提供するかどうかに関係なく、１バージョンのソフトウェアを、複数のプラットフォーム用に記述できる。例えば、プラットフォーム１０がタスク１０４をオフロードできない場合、タスク・ランナー１１２は、開発者のソフトウェアをより効率良く実行できるよう、これを最適化できる状態にある。実際、タスク・ランナー１１２は、一部の場合において、開発者が独自にソフトウェア最適化しようと試みた場合よりも、並列化のためのソフトウェアの最適化に優れている。
【００３７】
図２を参照すると、タスク・ランナー・ソフトウェア・モジュール１１２に関する一実施形態の表記が図示されている。上述の様に、タスク・ランナー１１２は、一組の命令（例えば、プロセッサー１１０に割り当てられた命令）を受信して、これらの命令を別のプロセッサー（例えば、プロセッサー１２０）へとオフロード（即ち、再割り当て）するかどうかを判定するよう実行可能なコード（または、この様なコードを記憶するメモリー）である。図示の通り、タスク・ランナー１１２は、判定ユニット２１０、最適化ユニット２２０、及び、変換ユニット２３０を含む。一実施形態において、制御プログラム１１３（図２では図示せず）は、タスク・ランナー１１２が実行する仮想マシンである。例えば、ある実施形態では、制御プログラム１１３は、ＪＡＶＡ（登録商標）仮想マシンに対応している。このタスク・ランナー１１２は、解釈されたＪＡＶＡ（登録商標）バイト・コードである。別の実施形態では、プロセッサー１１０は、制御プログラム１１３を使用せずに、タスク・ランナー１１２を実行可能である。
【００３８】
判定ユニット２１０は、一実施形態において、タスク１０４をプロセッサー１２０へとオフロードするかどうかを判定するよう実行可能なプログラム命令を表している。図示された実施形態では、タスク・ランナー２１０は、バイト・コード１０２（または、バイト・コード１０２の少なくとも一部）の受信に呼応して、判定ユニット２１０の命令の実行を含む。一実施形態において、タスク・ランナー２１０は、バイト・コード１０２を含む拡張子「．ｃｌａｓｓ」形式のＪＡＶＡ（登録商標）ファイルの受信に呼応して、判定ユニット２１０の命令の実行を起動する。
【００３９】
一実施形態において、判定ユニット２１０は、プラットフォーム１０の特性に関連する１つ以上の初期基準からなる一組、及び／または、バイト・コード１０２の初期解析に基いて、タスクをオフロードするかどうかを判定するよう実行可能な命令を含むことができる。種々の実施形態では、この様な判定は、自動的である。一実施形態において、判定ユニット２１０は、プラットフォーム１０は、ドメイン特化言語（複数可）をサポートしているかどうかに少なくとも一部基き、一次判定を行うことを実行できる。サポートが存在していなければ、判定ユニット２１０は、種々の実施形態において、これ以上解析を実行しなくても良い。実施形態によっては、判定ユニット２１０は、バイト・コード１０２が、ドメイン特化言語として表記不可能なデータ種別を参照するか、または、ドメイン特化言語として表記不可能なメソッドを呼び出すかどうかに少なくとも基いて、タスク１０４をオフロードするかどうかを判定する。例えば、特定のドメイン特化言語は、ＩＥＥＥ倍精度データ種別をサポートしていない場合がある。それ故、判定ユニット２１０は、倍精度浮動小数点数を含むＪＡＶＡ（登録商標）ワークロードをオフロードしないということを判定できる。同様に、ＪＡＶＡ（登録商標）言語では、Ｓｔｒｉｎｇデータ種別表記（実際は、クラス形式）をサポートしており、このデータ種別は、殆どのクラスとは異なり、ＪＡＶＡ（登録商標）仮想マシンによって認識可能であるが、ＯＰＥＮＣＬでは、この様な表記が無い。この結果、判定ユニット２１０は、ある実施形態において、この様なＳｔｒｉｎｇデータ種別を参照するＪＡＶＡ（登録商標）ワークロードが、送られないということを判定できる。別の実施形態では、判定ユニット２１０は、更に、Ｓｔｒｉｎｇ文字列の使用が、他のＯＰＥＮＣＬの表記可能形式へと「マッピング」できるかどうか、例えば、Ｓｔｒｉｎｇ参照を除去して、他のコード表記で交換できるかどうかを判定する解析を実行できる。ある実施形態において、一組の初期基準が満足されれば、タスク・ランナー１１２は、バイト・コード１０２をドメイン特化命令に変換するための変換ユニット２３０内の命令実行を初期化可能である。
【００４０】
ある実施形態では、判定ユニット２１０は、変換ユニット２３０が実行する間、新たな組の基準に基き、タスク１０４をオフロードするかどうかの判定を継続して行う。例えば、一実施形態において、判定ユニット２１０は、バイト・コード１０２が無限ループを生じさせる実行パスを有すると判定されるかどうかに少なくとも一部基いて、タスク１０４をオフロードするかどうかを判定する。ある実施形態において、判定ユニット２１０は、バイト・コード１０２が、不正な動作、例えば、再帰処理の使用を実行しようとしているかどうかに少なくとも一部基き、タスク１０４をオフロードするかどうかを判定する。
【００４１】
更に、判定ユニット２１０は、一組のタスク１０４の１つ以上の過去の実行に少なくとも一部基いて、タスク１０４をオフロードするかどうかの判定を実行できる。例えば、一実施形態において、判定ユニット２１０は、一組のタスク１０４に関する過去の判定に関する情報、例えば、特定の組のタスク１０４をオフロードできたかどうかに関する証明データを記憶できる。実施形態によっては、判定ユニット２１０は、タスク・ランナー１１２が、一組のタスク１０４について、過去に生成されたドメイン特化命令からなる一組を記憶するかどうかに少なくとも一部基き、タスク１０４をオフロードするかどうかを判断する。種々の実施形態において、判定ユニット２１０は、バイト・コード１０２の単一部分の過去の反復処理に関する情報、例えば、バイト・コード１０２の一部が、同じ組のタスク１０４をループ処理として複数回指定しているかどうかを収集できる。或いは、判定ユニット２１０は、プログラムの種々の部分においてバイト・コード１０２を複数回含むプログラムの実行から生成される過去の実行に関する情報を収集できる。一実施形態において、判定ユニット２１０は、タスク１０４の過去の実行効率に関する情報を収集できる。例えば、一部の実施形態では、タスク・ランナー１１２が、タスク１０４をプロセッサー１１０、及び、プロセッサー１２０により実行させることが可能である。判定ユニット２１０は、プロセッサー１１０がプロセッサー１２０よりも一組のタスクをより効率良く（例えば、短時間で）実行したということを判定した場合、判定ユニット２１０は、タスク１０４の次の実行をオフロードしないよう決定できる。或いは、判定ユニット２１０は、プロセッサー１２０が一組のタスクをより効率良く実行できるということを判定した場合、ユニット２１０は、例えば、一組のタスクの次の実行をオフロードするための指示データをキャシュすることができる。
【００４２】
判定ユニット２１０については、図４と併せて、以下で詳細に述べる。
【００４３】
最適化ユニット２２０は、一実施形態では、プロセッサー１１０上でのタスク１０４を実行するため、バイト・コード１０２を最適化するよう実行可能なプログラム命令を表している。一実施形態では、タスク・ランナー１１２は、判定ユニット２１０により、タスク１０４をオフロードしないということが判定されたら、最適化ユニット２２０の実行を初期化できる。種々の実施形態において、最適化ユニット２２０は、バイト・コード１０２を解析して、並列処理を向上させるよう変更可能なバイト・コード１０２の一部を特定する。一実施形態では、この様な部分が特定されると、最適化ユニット２２０は、タスク１０４用にスレッド・プール・サポートを追加するよう、バイト・コード１２０を変更できる。他の実施形態では、最適化ユニット２２０は、他の技術を用いて、タスク１０４の性能を高められる。バイト・コード１０２の一部を変更したら、最適化ユニット２２０は、一部の実施形態において、変更済のバイト・コード１０２を、命令１１４への解釈のため、制御プログラム１１３に供給する。バイト・コード１０２の最適化について、図５と併せて以下で説明する。
【００４４】
変換ユニット２３０は、一実施形態では、プロセッサー１２０上でタスク１０４を実行するため、一組のドメイン特化命令を生成するよう実行可能なプログラム命令を表している。ある実施形態では、タスク・ランナー１１２の実行には、一組の初期基準がタスク１０４のオフロードを満足したということが判定ユニット２１０により判定された時の変換ユニット２３０の実行初期化が含まれる。図示の実施形態において、変換ユニット２３０は、プロセッサー１２０に対してタスク１０４を実行させるため、一組のドメイン特化命令をドライバー１１６へと供給する。一実施形態において、変換ユニット２３０は、ドライバー１１６から、タスク１０４に関する対応する組の結果を受信でき、この結果は、ドメイン特化言語フォーマットで表示される。ある実施形態では、変換ユニット２３０は、ドメイン特化言語フォーマットからの結果を、命令１１４によって利用可能なフォーマットへ変換する。例えば、ある実施形態において、タスク・ランナー１１２は、ドライバー１１６から一組の計算された結果を受信したら、タスク・ランナー１１２は、ＯＰＥＮＣＬデータ種別からの一組の結果を、ＪＡＶＡ（登録商標）データ種別へと変換できる。一実施形態において、タスク・ランナー１１２（例えば、変換ユニット２３０）は、タスク１０４の次の実行用に生成された一組のドメイン特化命令を記憶するよう実行可能である。実施形態によっては、変換ユニット２３０は、バイト・コード１０２を中間表記へと変換し、この中間表記から、一組のドメイン特化命令を生成することで、一組のドメイン特化命令を生成する。バイト・コード１０２のドメイン特化言語への変換は、図６と併せて、以下でより詳細に説明する。
【００４５】
注意すべき点として、ユニット２１０、２２０、及び、２３０は、例示的なものであり、タスク・ランナー１１２の種々の実施形態では、命令は、個別にグループ化できる。
【００４６】
図３を参照すると、ドライバー１１６の一実施形態が図示されている。図示の通り、ドライバー１１６は、ドメイン特化言語ユニット３１０を含む。例示的な実施形態において、ドライバー１１６は、ＯＳ１１７内に組み込まれる。別の実施形態では、ドライバー１１６は、ＯＳ１１７から独立して実装可能である。
【００４７】
ドメイン特化言語ユニット３１０は、一実施形態において、ドメイン特化言語（複数可）用のドライバー・サポートを供給するよう実行可能である。一実施形態において、ユニット３１０は、変換ユニット２３０から一組のドメイン特化命令を受信し、対応する組の命令１２２を生成する。種々の実施形態では、ユニット３１０は、前述の様な種々のドメイン特化言語のうちの任意のものをサポートできる。ある実施形態において、ユニット３１０は、プロセッサー１２０用のＩＳＡ内で定義された命令１２２を生成する。別の実施形態では、ユニット３１０は、プロセッサー１２０に対して、タスク１０４を実行させる非ＩＳＡ命令を生成する。例えば、プロセッサー１２０は、命令１２２を用いて、プロセッサー１２０によって実行可能な対応する組の命令を生成できる。
【００４８】
プロセッサー１２０が、一組のタスク１０４を実行すると、ドメイン特化言語ユニット３１０は、ある実施形態において、一組の結果を受信し、これらの結果をドメイン特化言語のデータ種別に変換する。例えば、ある実施形態において、ユニット３１０は、受信した結果をＯＰＥＮＣＬデータ種別へと変換できる。図示の実施形態において、ユニット３１０は、変換済の結果を変換ユニット２３０へと供給したら、ドメイン特化言語のデータ種別からの結果を、命令１１４によりサポートされるデータ種別、例えば、ＪＡＶＡ（登録商標）データ種別へと変換できる。
【００４９】
図４を参照すると、判定ユニット２１０の一実施形態が、図示されている。図示の実施形態では、判定ユニット２１０には、受信したバイト・コード１０２に対する種々の試験を実施するための複数のユニット４１０〜４６０が含まれる。別の実施形態では、判定ユニット２１０は、ここで示してあるものに追加したユニット、これよりも少ないユニット、或いは、別のユニットを含めても良い。実施形態によっては、判定ユニット２１０は、種々の示される試験を並列実行できる。一実施形態では、判定ユニット２１０は、バイト・コード１０２からのドメイン特化命令の生成中の種々の段階において、基準の種々の１つを試験できる。
【００５０】
サポート検知ユニット４１０は、一実施形態において、プラットフォーム１０が、ドメイン特化言語（複数可）をサポートしているかどうかを判定するよう実行可能なプログラム命令に相当する。一実施形態において、ユニット４１０は、ＯＳ１１７、例えば、システム・レジスターから受信した情報に基いて、サポートが存在していることを判定する。別の実施形態では、ユニット４１０は、ドライバー１１６から受信した情報に基き、サポートが存在するかどうかを判定する。別の実施形態では、ユニット４１０は、他のデータ源からの情報に基き、サポートが存在することを判定する。ある実施形態において、ユニット４１０は、サポートが存在しないということが判定された場合、タスク１０４がプロセッサー１２０へオフロードできないということが、判定ユニット２１０によって結論付けられる。
【００５１】
データ種別判定ユニット４２０は、ターゲット・ドメイン特化言語、即ち、ドライバー１１６によってサポートされるドメイン特化言語として表記できないデータ種別全てを、バイト・コード１０２が参照しているかどうかを判定するよう実行可能なプログラム命令に相当する。例えば、バイト・コード１０２は、ある実施形態では、ＪＡＶＡ（登録商標）バイト・コードであれば、データ種別、例えば、ｉｎｔ型、ｆｌｏａｔ型、ｄｏｕｂｌｅ型、ｂｙｔｅ型、または、この様な基本データ型からなる配列は、ＯＰＥＮＣＬに対応するデータ種別を持たせられる。ある実施形態において、ユニット４２０は、一組のタスク１０４について、ターゲット・ドメイン特化言語として表記できないデータ種別を、バイト・コード１０２が参照していると判定した場合、判定ユニット２１０は、この一組のタスク１０４をオフロードしないということを判定できる。
【００５２】
機能判定マッピング・ユニット４３０は、ある実施形態において、ターゲット・ドメイン特化言語によってサポートされていない全ての関数（例えば、ルーチン／メソッド）を、バイト・コード１０２が呼び出しているかどうかを判定するよう実行可能なプログラム命令に相当する。例えば、バイト・コード１０２が、ＪＡＶＡ（登録商標）バイト・コードである場合、ユニット４３０は、ＯＰＥＮＣＬのものに相当しないＪＡＶＡ（登録商標）専用の関数（例えば、「Ｓｙｓｔｅｍ．ｏｕｔ．ｐｒｉｎｔｌｎ」コマンド）を呼び出しているかどうかを判定できる。一実施形態において、ユニット４３０は、バイト・コード１０２が、一組のタスク１０４について未サポートの関数を呼び出していると判定したら、判定ユニット２１０は、この一組のタスク１０４をオフロードすることを中断するよう決定できる。一方、バイト・コード１０２が、ターゲット・ドメイン特化言語でサポートされるこれらの関数のみ（例えば、ＯＰＥＮＣＬの「ｓｑｒｔ（）」関数と互換性のあるＪＡＶＡ（登録商標）の「Ｍａｔｈ．ｓｑｒｔ（）」関数）を呼び出す場合、判定ユニット２１０は、継続してオフロードすることを許可できる。
【００５３】
コスト伝送判定ユニット４４０は、一実施形態において、一組のタスク１０４のグループ・サイズ（即ち、並列タスク数）が、所定の閾値を下回ること、つまり、オフロードのコストが、コスト効率的ではでないと示しているかどうかを判定するよう実行可能なプログラム命令を表している。一実施形態において、ユニット４４０は、グループ・サイズが、閾値を下回ると判定したら、判定ユニット２１０は、一組のタスク１０４のオフロードを中断するよう判定できる。ユニット４４０は、他の種々のチェックを実行して、オフロードの見込まれる利点、及び、見込みコストを比較する。
【００５４】
不正機能検知ユニット４５０は、ある実施形態において、バイト・コード１０２が、構文的には正しいが不正な機能を用いているかどうかを判定するよう実行可能なプログラム命令を表している。例えば、種々の実施形態において、ドライバー１１６は、メソッド／関数が再帰処理を使用することを禁止するあるバージョンのＯＰＥＮＣＬ（例えば、このバージョンには、再帰処理で要求されるスタック・フレームを表記する手法が備えられていない）をサポートできる。一実施形態において、ユニット４５０は、ＪＡＶＡ（登録商標）コードが再帰処理を実行できると判定した場合、判定ユニット２１０は、想定外のランタイム・エラーをもたらす恐れのあるこのＪＡＶＡ（登録商標）コードを展開しないよう決定できる。一実施形態では、ユニット４５０が、一組のタスク１０４におけるこの様な利用を検知した場合、判定ユニット２１０は、オフロードを中断するよう決定できる。
【００５５】
無限ループ検知ユニット４６０は、ある実施形態において、バイト・コード１０２が、無限ループを起こす可能性のある、つまり、不定／無限ループをもたらす実行の全パスを有するかどうかを判定するよう実行可能なプログラム命令に相当する。一実施形態では、ユニット４６０は、一組のタスク１０４に関連するこの様な任意の経路を検知した場合、判定ユニット２１０は、この一組のタスク１０４のオフロードを中断するよう決定できる。
【００５６】
前述の様に、判定ユニット２１０は、バイト・コード１０２の変換プロセス中の種々の工程において、種々の基準を検証できる。任意の時点において、一組のタスクに関する試験の１つが失敗した場合、判定ユニット２１０は、種々の実施形態において、オフロードを中断するようすぐに決定できる。この方法で基準を検証することにより、判定ユニット２１０は、ある状況において、バイト・コード１０２の変換時の膨大な計算資源を浪費する前に、オフロードの中断決定にすぐに到達できる。
【００５７】
図５を参照すると、最適化ユニット２２０の一実施形態が図示されている。タスク・ランナー１１２は、一実施形態では、判定ユニット２１０による一組のタスク１０４のオフロードの中断決定に呼応して、最適化ユニット２２０の実行を初期化できる。別の実施形態において、タスク・ランナー１１２は、変換ユニット２３０と連携して、例えば、判定ユニット２１０は、オフロードを中断するかどうかを決定する前に、最適化ユニット２２０の実行を初期化できる。図示の実施形態では、最適化ユニット２２０は、最適化判定ユニット５１０、及び、スレッド・プール変更ユニット５２０を含む。実施形態によっては、最適化ユニット２２０には、他の手法でバイト・コード１０２を最適化するための追加のユニットも含まれる。
【００５８】
最適化判定ユニット５１０は、ある実施形態では、プロセッサー１１０によるタスク１０４の実行を改善するよう変更可能なバイト・コード１０２の一部を特定するために実行可能なプログラム命令に相当する。一実施形態において、ユニット５１０は、タスク・ランナー１１２に関連するＡＰＩへの呼び出を含むバイト・コード１０２の一部を特定できる。ある実施形態では、ユニット５１０は、並列化用のバイト・コード１０２内の特定の構造要素（例えば、ループ）を特定できる。ユニット５１０は、ある実施形態において、変換ユニット２３０により生成されたバイト・コード１０２の中間表記を解析することで、部分を特定できる（図６と併せて以下で述べる）。一実施形態では、ユニット５１０は、一組のタスク１０４の性能が向上するよう、バイト・コード１０２の一部を変更可能であると判定された場合、最適化ユニット２１０は、スレッド・プール変更ユニット５２０の実行を初期化できる。ユニット５１０は、所定の機構により、バイト・コード１０２の一部を改善できないと判定したら、ユニット５１０は、一実施形態において、変更を施さずに、改善できないバイト・コードの一部を制御プログラム１１３へと供給することで、制御プログラム１１３に対して、対処用の命令１１４を生成させる。
【００５９】
スレッド・プール変更ユニット５２０は、ある実施形態において、タスク１０４を実行するため、プロセッサー１１０が使用するスレッド・プールを作成するサポートを追加するよう実行可能なプログラム命令に相当する。例えば、種々の実施形態において、ユニット５２０は、オフロードが不可能であるということを仮定して、元のターゲット・プラットフォーム（例えば、プロセッサー１１０）上のデータ並列ワークロードの実行の調製中に、バイト・コード１０２を変更できる。従って、タスク・ランナー１１２を使用し、且つ、プログラマーによって拡張可能な基底クラスを供給することで、コードを並列化しようとしていること（例えば、効率良いデータ並列化方式の実行）を、プログラマーは宣言できる。ＪＡＶＡ（登録商標）環境の場合、このことは、コードを変換せずに、その実行を調整することで、タスク・ランナー１１２の規定ＪＡＶＡ（登録商標）実装が、スレッド・プールを使用できるということを意味している。コードがオフロード可能であれば、コードがオフロードされるプラットフォームにより、並列実行が調整されるということが仮定される。本明細書で使用される様に、「スレッド・プール」は、実行用の複数スレッドを含むキューのことである。スレッドは、ある実施形態において、所与の組のタスクの各タスク１０４について作成可能である。スレッド・プールを使用する場合、プロセッサー（例えば、プロセッサー１１０）は、スレッド実行に計算資源を利用できるようになった時に、このプールからスレッドを移動させる。スレッドが実行を完了したら、スレッド実行の結果は、ある実施形態において、この結果を使用できるようになるまで、該当キューの中に入れられる。
【００６０】
バイト・コード１０２が、２０００個のタスク１０４からなる一組を指定する状況では、ある実施形態において、ユニット５２０は、２０００スレッドを（タスク１０４ごとに１つ）含むスレッド・プールを作成することが実行できるよう、バイト・コード１０２にサポートを追加できる。一実施形態において、プロセッサー１１０は、クアッドコア・プロセッサーであり、各コアは、タスク１０４のうちの５００個を実行できる。各コアが、１度に４スレッドを実行できれば、１６スレッドを同時に実行できる。従って、プロセッサー１１０は、タスク１０４を逐次に実行する場合よりも短時間で一組のタスク１０４を実行できる。
【００６１】
図６を参照すると、変換ユニット２３０の一実施形態が図示されている。前述の様に、一実施形態において、タスク・ランナー１１２は、一組のタスク１０４をオフロードするための一組の初期基準が満たされたということが、判定ユニット２１０により判定されたことに呼応して、変換ユニット２３０の実行を初期化できる。別の実施形態では、タスク・ランナー１１２は、最適化ユニット２２０と連動して、変換ユニット２３０の実行を初期化できる。図示の実施形態では、変換ユニット２３０は、実体化ユニット６１０、ドメイン特化言語生成ユニット６２０、及び、結果変換ユニット６３０を含む。別の実施形態では、変換ユニット２３０の構成は、異なっていても良い。
【００６２】
実体化ユニット６１０は、一実施形態において、バイト・コード１０２を実体化して、バイト・コード１０２の中間表記を生成するよう実行可能なプログラム命令に相当する。本明細書で使用されるように、実体化とは、内部に含まれる情報を抽象化するため、バイト・コード１０２を復号化するプロセスのことを言及する。一実施形態においては、ユニット６１０は、バイト・コード１０２を解析して、実行中に使用される定数を特定することを開始する。ある実施形態では、ユニット６１０は、整数、ユニコード、文字列等の定数について、拡張子「．ｃｌａｓｓ」形式のＪＡＶＡ（登録商標）ファイルのｃｏｎｓｔａｎｔ＿ｐｏｏｌ部を解析することで、バイト・コード１０２における定数を特定する。実施形態によっては、ユニット６１０は、更に、拡張子「．ｃｌａｓｓ」形式のファイルの属性部を解析して、バイト・コード１０２の中間表記を生成するのに利用可能な属性情報を再構成する。更に、一実施形態では、ユニット６１０は、バイト・コード１０２を解析して、バイト・コードが使用する全てのメソッドを特定する。実施形態によっては、ユニット６１０は、拡張子が「．ｃｌａｓｓ」形式のＪＡＶＡ（登録商標）ファイルのメソッド部を解析することで、メソッドを特定する。一実施形態において、ユニット６１０は、定数、属性、及び／または、メソッドに関する情報を判定したら、ユニット６１０は、バイト・コード１０２中の命令の復号化を開始できる。実施形態によっては、ユニット６１０は、復号化命令、及び、解析済の情報から式木を構築することで、中間表記を生成できる。一実施形態において、ユニット６１０が、情報の式木への追加を完了したら、ユニット６１０は、バイト・コード１０２中の高レベルの構造、例えば、ループ文、入れ子状の判定文等を特定する。ある実施形態では、ユニット６１０は、バイト・コード１０２によって読み取られることが分かっている特定の変数、或いは、アレーを特定できる。実体化に関する他の情報については、Ｃｒｉｓｔｉｎａ  Ｃｉｆｕｅｎｔｅｓによる「逆コンパイル用の構造化アルゴリズム（１９９３年）」で見ることができる。
【００６３】
ドメイン特化言語生成ユニット６２０は、ある実施形態では、実体化ユニット６１０によって生成された中間表記からドメイン特化命令を生成するよう実行可能なプログラム命令に相当する。一実施形態において、ユニット６２０は、実体化ユニット６１０によりバイト・コード１０２内で特定された対応する定数、属性、または、メソッドを含むドメイン特化命令を生成できる。実施形態によっては、ユニット６２０は、バイト・コード１０２内のものと対応する高レベル構造を有するドメイン特化命令を生成できる。種々の実施形態では、ユニット６２０は、実体化ユニット６１０により収集された他の情報に基き、ドメイン特化命令を生成できる。実施形態によっては、実体化ユニット６１０は、バイト・コード１０２に読み取られることが分かっている特定の変数、または、アレーを特定した場合、ユニット６２０は、コード最適化を可能とするため、アレー／値を「ＲＥＡＤ  ＯＮＬＹ（読み取り専用）」ストレージに入れるか、または、アレー／値をＲＥＡＤ  ＯＮＬＹ（読み取り専用）としてマーキングするよう、ドメイン特化命令を生成できる。同様に、ユニット６２０は、ＷＲＩＴＥ＿ＯＮＬＹ（書き込み専用）、または、ＲＥＡＤ＿ＷＲＩＴＥ（読み書き両対応）として値をタグ付けするドメイン特化命令を作成できる。
【００６４】
結果変換ユニット６３０は、一実施形態において、タスク１０４の結果をドメイン特化言語フォーマットからバイト・コード１０２によりサポートされるフォーマットへと変換するよう実行可能なプログラム命令に相当する。例えば、ある実施形態では、ユニット６３０は、結果（例えば、整数、ブーリアン、浮動小数点等）を、ＯＰＥＮＣＬデータフォーマットからＪＡＶＡ（登録商標）データフォーマットへと変換できる。実施形態によっては、ユニット６３０は、インタープリター（例えば、制御プログラム１１３）によって保持されるデータ構造表記へとデータを複製することで、結果を変換する。ユニット６３０が、ビッグエンディアン表記からリトルエンディアン表記へとデータを変換できる実施形態もある。一実施形態では、タスク・ランナー１１２は、一組のタスク１０４の実行から生成される一組の結果を記憶するための一組のメモリー位置を確保する。実施形態によっては、タスク・ランナー１１２は、一組のメモリー位置を確保してから、ドメイン特化言語生成ユニット６２０が、ドメイン特化命令をドライバー１１６へと供給する。ある実施形態では、ユニット６３０は、プロセッサー１２０が一組のタスク１０４に関する結果を生成する間、制御プログラム１１３のガーベッジ・コレクターがメモリー位置の再割り当てを抑止する。これによって、ユニット６３０は、ドライバー１１６からの受信時に、結果をメモリー位置に入れることができる。
【００６５】
前述のユニットの機能を使用する種々の方法を、以下に紹介する。
【００６６】
図７を参照すると、コンピューティング・プラットフォームにおいてワークロードを自動展開する方法７００の一実施形態が図示されている。一実施形態において、プラットフォーム１０は、プログラム（例えば、バイト・コード１０２）によって指定されるワークロード（例えば、タスク１０４）をコプロセッサー（例えば、プロセッサー１２０）へとオフロードする方法７００を実行する。実施形態の一部において、プラットフォーム１０は、バイト・コード（例えば、タスク・ランナー１１２の）を解釈する制御プログラム（制御プログラム１１３等）によって生成されるプログラム命令（例えば、プロセッサー１１０上）を実行することで、方法７００を実行する。図示の実施形態では、方法７００は、ステップ７１０〜７５０を含む。別の実施形態では、方法７００のステップは、追加（または、減少）できる。ステップ７１０〜７５０の種々のステップは、少なくとも一部が同時に実行できる。
【００６７】
ステップ７１０において、プラットフォーム１０は、汎用言語で開発され、データ並列問題を含むプログラム（例えば、バイト・コード１０２に対応するか、または、バイト・コード１０２を含む）を受信する。一部の実施形態では、ＡＰＩ内で定義された基底クラスを拡張することで、開発者がデータ並列問題を表記可能とするＡＰＩを用いて、プログラムをＪＡＶＡ（登録商標）で開発している。別の実施形態では、他の言語、例えば、前述の１つを用いて、プログラムを開発できる。他の実施形態では、データ並列問題を、他の方法で表記できる。一実施形態において、プログラムは、例えば、制御プログラム１１３により解釈可能なインタープリター式バイト・コードで良い。別の実施形態では、プログラムは、解釈可能でない実行可能バイト・コードも可能である。
【００６８】
ステップ７２０において、プラットフォーム１０は、（例えば、判定ユニット２１０を用いて）プログラムを解析して、１つ以上のワークロード（タスク１０４）を、例えば、プロセッサー１２０の様なコプロセッサー（用語「コプロセッサー」は、実行法８００のものとは異なるプロセッサーを示すために使用される）へとオフロードするかどうかを判定する。ある実施形態では、プラットフォーム１０は、プログラムの拡張子が「．ｃｌａｓｓ」形式のＪＡＶＡ（登録商標）ファイルを解析して、オフロードを実行するかどうかを判定できる。プラットフォーム１０による判定は、前述の基準の種々の組み合わせが可能である。一実施形態においては、プラットフォーム１０は、一組の初期基準に基いて、一次判定を実行する。ある実施形態では、各初期基準が満足された場合、方法７００は、ステップ７３０、７４０へと進むことができる。一実施形態において、プラットフォーム１０は、ステップ７３０、７４０の実行中、種々の追加基準に基き、ワークロードをオフロードするかどうかを継続して判定できる。種々の実施形態では、プラットフォーム１０による解析は、過去にオフロードされたワークロードに関するキャッシュ済み情報に基いて可能である。
【００６９】
ステップ７３０では、プラットフォーム１０は、（例えば、変換ユニット２３０を用いて）、プログラムを中間表記へと変換する。ある実施形態では、プラットフォーム１０は、プログラムの拡張子が「．ｃｌａｓｓ」形式のＪＡＶＡ（登録商標）ファイルを解析して、プログラムによって使用される定数、属性、及び／または、メソッドを特定することで、プログラムを変換する。実施形態によっては、プラットフォーム１０は、プログラム中の高レベル構造、例えば、ループ文、入れ子状の判定文等を特定するため、プログラムの命令を復号化する。一部の実施形態では、プラットフォーム１０は、プログラムの実体化により収集される情報を表現する式木を生成する。種々の実施形態において、プラットフォーム１０は、前述の種々の方法のうちの任意のものを使用できる。実施形態の一部では、この中間表記を解析して、ワークロードをオフロードするかどうかを更に判定できる。
【００７０】
ステップ７４０では、プラットフォーム１０は、（例えば、変換ユニット２３０を用いて）、中間表記をドメイン特化言語へと変換する。ある実施形態では、プラットフォーム１０は、ステップ７３０において収集された情報に基き、ドメイン特化命令（例えば、ＯＰＥＮＣＬ）を生成する。ステップ７３０で構築された式木からドメイン特化命令を、プラットフォーム１０によって生成する実施形態もある。ある実施形態では、プラットフォーム１０は、ドメイン特化命令を、コプロセッサー（プロセッサー１２０のドライバー１１６等）に供給し、コプロセッサーに対して、オフロードされたワークロードを実行させる。
【００７１】
ステップ７５０では、プラットフォーム１０は、（例えば、変換ユニット２３０を用いて）、オフロードされたワークロードの結果を、プログラムによってサポートされるデータ種別へと変換し戻す。一実施形態では、プラットフォーム１０は、ＯＰＥＮＣＬデータ種別からの結果を、ＪＡＶＡ（登録商標）データ種別へと変換し戻す。結果が変換されたら、変換済の結果を使用するプログラム命令を実行できる。一実施形態において、プラットフォーム１０は、結果を記憶するためのメモリー位置を割り当ててから、ドメイン特化命令をコプロセッサーのドライバーへと供給する。一部の実施形態では、コプロセッサーが結果を生成する間、プラットフォーム１０は、割り当てられたメモリー位置が、制御プログラムのガーベッジ・コレクターにより再利用されることを抑止できる。
【００７２】
注意すべき点として、方法７００は、受信された種々のプログラムについて、複数回実行できる。更に、方法７００は、同じプログラム（例えば、一組の命令）が、再度受信された時、反復できる。同じプログラムを、二度受信したら、ステップ７１０〜７５０の何れかを、省くことができる。前述の様に、ある実施形態では、プラットフォーム１０は、ステップ７２０〜７４０中に生成された情報の様な過去にオフロードされたワークロードに関する情報を、キャシュできる。プログラムを、再度受信したら、プラットフォーム１０は、一実施形態において、ステップ７２０における大まかな判定、例えば、ワークロードが過去に、オフロードに成功できているかどうかの判定を実行できる。一部の実施形態では、プラットフォーム１０は、ステップ７３０〜７４０を実行する代わりに、更に、過去にキャッシュされたドメイン特化の命令を使用できる。同じ組の命令を再受信するような実施形態では、ステップ７５０は、前述と類似の方法で実行可能である。
【００７３】
更に、一組のワークロードが種々の入力を用いて複数回実行されていることが、プログラムによって指定されている場合、方法７００の種々のステップを反復できる。この様な状況では、ステップ７３０〜７４０を省くことが可能であり、過去にキャシュされたドメイン特化命令を、使用できる。種々の実施形態において、ステップ７５０を依然として実行できる。
【００７４】
図８を参照すると、コンピューティング・プラットフォームにおいてワークロードを自動で展開する方法の別の実施形態が、図示されている。一実施形態において、プラットフォーム１０は、タスク・ランナー１１２を実行して、方法８００を行う。一部の実施形態において、ランタイム時にタスク・ランナー１１２のバイト・コードを解釈する際、プラットフォーム１０は、制御プログラム１１３により生成される命令を実行することで、プロセッサー１１０上でタスク・ランナー１１２を実行する。図示の実施形態において、方法８００は、ステップ８１０〜８４０を含む。他の実施形態では、方法８００のステップを、追加（または、少なく）できる。ステップ８１０〜８４０の任意のステップを、同時に実行できる。
【００７５】
ステップ８１０では、タスク・ランナー１１２は、一組のタスク（例えば、タスク１０４）を指定する一組のバイト・コード（バイト・コード１０２等）を受信する。前述の様に、ある実施形態では、バイト・コード１０２は、タスク１０４を指定するタスク・ランナー１１２に関連するＡＰＩの呼び出を含むことができる。例えば、ある特定の実施形態では、開発者は、ＡＰＩ内で定義された基底クラスを拡張することで、複数のタスク１０４を指定するＪＡＶＡ（登録商標）ソース・コードを記述する。拡張されたクラスは、バイト・コード１０２に相当する。そして、拡張されたクラスのインスタンスは、タスク・ランナー１１２へと供給されて、タスク１０４を実行する。一部の実施形態では、ステップ８１０は、前述のステップ７１０と類似の方法で実行可能である。
【００７６】
ステップ８２０では、タスク・ランナー１１２は、一組のタスクをコプロセッサー（例えば、プロセッサー１２０）へとオフロードするかどうかを判定する。一実施形態では、タスク・ランナー１１２は、（例えば、判定ユニット２１０を用いて）プログラムの拡張子が「．ｃｌａｓｓ」形式のＪＡＶＡ（登録商標）ファイルを解析して、タスク１０４をオフロードするかどうかを決定できる。ある実施形態において、タスク・ランナー１１２は、一組の初期基準に基き、一次判定を実行できる。一部の実施形態では、各初期基準が満たされた場合、方法８００は、ステップ８３０へと進むことができる。一実施形態において、ステップ８３０が実行される間、プラットフォーム１０は、ワークロードをオフロードするかどうかを、種々の追加の基準に基いて継続して判定することが可能である。種々の実施形態において、タスク・ランナー１１２による解析は、過去にオフロードされたタスク１０４に関するキャッシュ情報に少なくとも一部基いても良い。タスク・ランナー１１２による判定は、前述の種々の基準のうちの任意のものに基いても良い。ある実施形態では、ステップ８２０は、前述のステップ７２０と類似の方法で実行できる。
【００７７】
ステップ８３０では、タスク・ランナー１１２は、一組のタスクを実行するため、一組の命令を生成させる。ある実施形態では、ドメイン特化言語フォーマットを有する一組のドメイン特化命令を生成して、一組のドメイン特化命令をドライバー１１６へと供給することにより、種々のフォーマットの一組の命令が得られるよう、一組の命令を生成させる。例えば、ある実施形態において、タスク・ランナー１１２は、一組のＯＰＥＮＣＬ命令を生成して、これらの命令をドライバー１１６へと供給できる。一実施形態では、ドライバー１１６は、更に、コプロセッサー用の一組の命令（例えば、コプロセッサーのＩＳＡ内の命令）を生成できる。ある実施形態において、タスク・ランナー１１２は、一組のバイト・コードを実体化して、一組のバイト・コードの中間表記を生成し、更に、中間表記を変換して、一組のドメイン特化命令を生成することにより、一組のドメイン特化命令を生成できる。
【００７８】
ステップ８４０では、タスク・ランナー１１２は、一組の命令をコプロセッサーに供給させることで、一組の命令をコプロセッサーに実行させる。ある実施形態において、タスク・ランナー１１２は、生成された一組のドメイン特化命令をドライバー１１６に供給することで、一組の命令をコプロセッサーへ供給する。コプロセッサーが、ドライバー１１６から供給される一組の命令を実行すると、コプロセッサーは、ある実施形態において、一組の命令の実行結果をドライバー１１６へと供給可能である。一実施形態において、タスク・ランナー１１２は、結果をバイト・コード１０２によりサポートされるデータ種別へと変換し戻す。ある実施形態において、タスク・ランナー１１２は、ＯＰＥＮＣＬデータ種別からの結果を、ＪＡＶＡ（登録商標）データ種別へと変換し戻す。一部の実施形態では、タスク・ランナー１１２は、生成された結果の記憶に使用されるメモリー位置をガーベッジ・コレクターが再利用することを防止できる。結果が変換されたら、変換された結果を使用するプログラムの命令を実行できる。
【００７９】
方法７００と同様に、方法８００は、受信された種々のプログラムのバイト・コードについて、複数回実行できる。更に、同じプログラムが、再度受信されるか、または、同じバイト・コードの複数のインスタンスを含めば、方法８００を反復実行できる。同じバイト・コードが、二度受信されると、ステップ８１０〜８４０の何れかを省くことができる。前述の様に、ある実施形態では、タスク・ランナー１１２は、ステップ８２０〜８４０中に生成された情報の様な過去にオフロードされたタスク１０４に関する情報をキャッシュできる。バイト・コードを再度受信した場合、タスク・ランナー１１２は、ある実施形態において、ステップ８２０において、タスク１０４をオフロードするための概略的な判定を実行できる。そして、タスク・ランナー１１２は、ステップ８３０を実行する代わりに、過去にキャッシュされたドメイン特化命令を用いて、ステップ８４０を実行可能である。
【００８０】
注意すべき点として、他の実施形態では、方法８００を異なる様式で実行できる。ある実施形態では、タスク・ランナー１１２は、一組のタスク（ステップ８１０における）を指定する一組のバイト・コードを受信できる。そして、タスク・ランナー１１２は、一組のタスクをコプロセッサーへとオフロードする判定（この判定は、タスク・ランナー１１２以外のソフトウェアによって実行可能である）に呼応して、一組のタスク（ステップ８３０において）を実行するための一組の命令を生成させる。更に、タスク・ランナー１１２は、一組の命令を、実行のためにコプロセッサーへと供給させる（ステップ８４０）。このため、実施形態によっては、方法８００の中に、ステップ８２０が含まれないことがある。
【００８１】
図９を参照すると、プログラム命令の例示的なコンパイル９００に関する一実施形態が、図示されている。図示の実施形態では、コンパイラー９３０は、ソース・コード９１０、及び、ライブラリー９２０をコンパイルして、プログラム９４０を生成する。別の実施形態では、コンパイル９００には、ソース・コード、及び／または、ライブラリー・ソース・コードの追加の部分のコンパイルも含まれる。ある実施形態では、コンパイル９００は、使用するプログラム言語に応じて、個別に実施できる。
【００８２】
ソース・コード９１０は、ある実施形態では、データ並列問題を実行するため、開発者によって記述されたソース・コードである。図示の実施形態では、ソース・コード９１０には、並列化用の１つ以上の組のタスクを指定するためのライブラリー９２０への１つ以上のＡＰＩ呼び出９１２が含まれる。ある実施形態において、ＡＰＩ呼び出９１２は、データ並列問題を表すため、ライブラリー９２０内で定義されたＡＰＩ基底クラス９２２の拡張クラス９１４を指定する。ソース・コード９１０は、上記で述べた様な種々の言語の中の任意のもので記述可能である。
【００８３】
ライブラリー９２０は、一実施形態において、ＡＰＩ基底クラス９２２、及び、タスク・ランナー・ソースコード９２４を含むタスク・ランナー１１２用のＡＰＩライブラリーである。（注意：タスク・ランナー・ソースコード９２４は、本明細書において「ライブラリー・ルーチン」と呼ばれる）。ある実施形態では、ＡＰＩ基底クラス９２２には、ソース・コード９１０と共にコンパイルして、バイト・コード９４２を生成するライブラリー・ソース・コードが含まれる。種々の実施形態において、ＡＰＩ基底クラス９２２は、ソース・コード９１０によって利用可能な１つ以上の変数、及び／または、関数を定義できる。前述の様に、ＡＰＩ基底クラス９２２は、一部の実施形態では、データ並列問題を表現する１つ以上の拡張クラス９１４を生成するため、開発者によって拡張可能なクラスである。ある実施形態では、タスク・ランナー・ソースコード９２４は、タスク・ランナー・バイト・コード９４４を生成するためにコンパイル可能なソース・コードである。タスク・ランナー・バイト・コード９４４は、一部の実施形態では、所与の組のバイト・コード９４２について一意であって良い。別の実施形態では、タスク・ランナー・バイト・コード９４４は、タスク・ランナー・バイト・コード９４４から独立してコンパイルされた種々の組のバイト・コード９４２により使用可能であっても良い。
【００８４】
前述の様に、コンパイラー９３０は、一実施形態において、ソース・コード９１０、及び、ライブラリー９２０をコンパイルして、プログラム９４０を生成するよう実行可能である。ある実施形態において、コンパイラー９３０は、プロセッサー（例えば、プロセッサー１１０）によって実行されるプログラム命令を生成する。別の実施形態では、コンパイラーは、実行時に実行可能命令を生成するよう解釈されるプログラム命令を生成する。一実施形態では、ソース・コード９１０は、ソース・コード９１０でコンパイルされるライブラリー（例えば、ライブラリー９２０）を指定する。そして、コンパイラー９３０は、これらのライブラリーからライブラリー・ソース・コードを検索して、これをソース・コード９１０と共にコンパイルできる。コンパイラー９３０は、上記で述べた種々の言語の任意のものをサポートできる。
【００８５】
プログラム９４０は、ある実施形態では、プログラム１０によって実行可能な（または、プラットフォーム１０上で実行する制御プログラム１１２によって解釈可能な）コンパイル済プログラムである。図示の実施形態において、プログラム９４０は、バイト・コード９４２、及び、タスク・ランナー・バイト・コード９４４を含む。例えば、一実施形態では、プログラム９４０は、バイト・コード９４２、及び、バイト・コード９４４についてそれぞれ．拡張子が「．ｃｌａｓｓ」形式のファイルを含む拡張子が「．ｊａｒ」形式のＪＡＶＡ（登録商標）のファイルに対応可能である。別の実施形態では、バイト・コード９４２、及び、バイト・コード９４４は、異なるプログラム９４０に対応可能である。種々の実施形態において、バイト・コード９４２は、上記のバイト・コード１０２に対応する（注意：バイト・コード９４４は、本明細書において「コンパイル済ライブラリー・ルーチン」と呼ばれる。）
【００８６】
図１１を参照して説明するように、コンピュータ可読記憶媒体上には、構成要素９１０〜９４０のうちの任意のもの、または、構成要素９１０〜９４０の１つの一部が含められる。
【００８７】
プログラム９４０を生成するため、ライブラリー９２０を用いてコンパイラー９３０によりコンパイル可能な想定されるソース・コードの一例を、以下に示す。この例では、浮動少数点型の配列（ｖａｌｕｅｓ［］）が、規定の乱数値で初期化される。次に、この配列は、その中の所与の要素について、この配列の中の所定窓で一致する他の要素数を判定するよう処理される（例えば、＋／−  ２．０）。そして、これらの判定結果は、対応する整数配列（ｃｏｕｎｔｓ［］）内のそれぞれの位置に記憶される。
【００８８】
配列（ｖａｌｕｅｓ［］）の要素ｖａｌｕｅｓの値を初期化するために、以下のコードを実行できる。
int size = 1024*16;
final float width = 1.2f;
final float[] values = new float[size];
final float[] counts = new float[size];
// create random data
for (int i = 0; i < size; i++) {
values[i] = (float) Math.random() * 10f;
}
【００８９】
従来、上記問題は、以下のコード・シーケンスで解くことができる。
for (int myId = 0; myId < size; myId++) {
int count = 0;
for (int i = 0; i < size; i++) {
if (values[i] > values[myId] - width && values[i] < values[myId] + width) {
count++;
}
}
counts[myId] = (float) count;
}
【００９０】
本開示に従って、上記問題は、一実施形態における以下のコードで解くことができる。
Task task = new Task(){
public void run() {
int myId = getGlobalId(0);
int count = 0;
for (int i = 0; i < size; i++) {
if (values[i] > values[myId] - width && values[i] <
values[myId] + width) {
count++;
}
}
counts[myId] = (float) count;
}
}
【００９１】
このコードは、ルーチンｒｕｎ（）をオーバライドする基底クラス「Ｔａｓｋ」を拡張している。つまり、この基底クラスには、メソッド／関数ｒｕｎ（）が含まれても良く、拡張後のクラスは、一組のタスク１０４について、ルーチンｒｕｎ（）の推奨される実装を指定できる。タスク・ランナー１１２は、種々の実施形態において、自動変換と展開用に、拡張後のクラスのバイト・コードが（例えば、バイト・コード１０２として）供給される。種々の実施形態において、メソッドＴａｓｋ．ｒｕｎ（）は変換、及び、展開されると（即ち、オフロードされると）、メソッドＴａｓｋ．ｒｕｎ（）を実行できないが、変換済／展開済のバージョンのＴａｓｋ．ｒｕｎ（）が、例えば、プロセッサー１２０によって実行される。また、メソッドＴａｓｋ．ｒｕｎ（）が変換、及び、展開されなければ、メソッドＴａｓｋ．ｒｕｎ（）は、プロセッサー１１０等によって実行可能である。
【００９２】
ある実施形態では、以下のコードは、上記で指定するタスクを実行するタスク・ランナー１１２のインスタンスを作成するために実行される。注意：用語「ＴａｓｋＲｕｎｎｅｒ」は、タスク・ランナー１１２に対応する。
TaskRunner taskRunner = new TaskRunner(task);
taskRunner.execute(size, 16);
【００９３】
第１行では、タスク・ランナー１１２のインスタンスを作成して、拡張した基底クラス「ｔａｓｋ」のインスタンスを入力として、タスク・ランナー１１２に供給している。
【００９４】
一実施形態では、タスク・ランナー１１２が実行された時、タスク・ランナー１１２は、以下のＯＰＥＮＣＬ命令を生成できる。
__kernel void run(
__global float *values,
__global int *counts
){
int myId=get_global_id(0);
int count=0;
for(int i=0; i<16384; i++){
if(values[i]>values[myId]-1.2f){
if(values[i]<values[myId]+1.2f){
count++;
}
}
}
counts[myId]  = counts[myId]+1;
return;
}
【００９５】
前述の様に、一部の実施形態では、このコードは、ドライバー１１６に供給されて、プロセッサー１２０用の一組の命令を生成できる。
【００９６】
例示的なコンピュータ・システム
図１０を参照すると、プラットフォーム１０を実現可能とする例示的なコンピュータ・システム１０００の一実施形態が、図示されている。コンピュータ・システム１０００は、相互接続１０６０（例えば、システム・バス）を介して、システム・メモリー１０２０、及び、Ｉ／Ｏインターフェース（複数可）１０４０へと接続するプロセッサー・サブシステム１０８０を含む。Ｉ／Ｏインターフェース（複数可）１０４０が、１つ以上のＩ／Ｏ装置１０５０へと接続する。コンピュータ・システム１０００は、限定されないが、サーバ・システム、パーソナル・コンピュータ・システム、デスクトップコンピュータ、ラップトップ、または、ノート型コンピュータ、メインフレーム・コンピュータ・システム、携帯型コンピュータ、ワークステーション、ネットワーク・コンピュータ、コンシューマ装置、例えば、携帯電話、ページャ、或いは、パーソナル・デジタル・アシスタント（ＰＤＡ）を含む種々の種類のうちの任意のもので良い。更に、コンピュータ・システム１０００は、ストレージ装置、交換器、モデム、ルータといった任意の種類のネットワーク対応周辺機器も可能である。簡略化のため、１台のコンピュータ・システム１０００を図１０に示しているが、更に、システム１０００は、複数のコンピュータ・システムが協調して動作するものとしても実装可能である。
【００９７】
プロセッサー・サブシステム１０８０は、１つ以上のプロセッサー、または、処理ユニットを含むことができる。例えば、プロセッサー・サブシステム１０８０には、１つ以上の計算資源制御処理構成要素１０２０に接続された１つ以上の処理構成要素が含まれても良い。コンピュータ・システム１０００の種々の実施形態において、プロセッサー・サブシステム１０８０の複数の実体を、相互接続１０６０に接続できる。種々の実施形態において、プロセッサー・サブシステム１０８０（または、プロセッサー・サブシステム１０８０内の各プロセッサー・ユニット）には、キャッシュ、または、これ以外の形態の機器搭載メモリーを含められる。一実施形態では、プロセッサー・サブシステム１０８０は、前述のプロセッサー１１０、及び、プロセッサー１２０を含んでも良い。
【００９８】
システム・メモリー１０２０は、プロセッサー・サブシステム１０８０によって利用可能である。システム・メモリー１０２０は、種々の物理的なメモリー・メディア、例えば、ハードディスク・ストレージ、フロッピー（登録商標）ディスク・ストレージ、リムーバブル・ディスク・ストレージ、フラッシュ・メモリー、ランダム・アクセス・メモリー（ＲＡＭ−ＳＲＡＭ、ＥＤＯ  ＲＡＭ、ＳＤＲＡＭ、ＤＤＲ  ＳＤＲＡＭ、ＲＡＭＢＵＳ  ＲＡＭ等）、読み取り専用メモリー（ＰＲＯＭ、ＥＥＰＲＯＭ等）等を用いて実装可能である。コンピュータ・システム１０００のメモリーは、メモリー１０２０の様な一次メモリーに限定されない。更に、コンピュータ・システム１０００は、プロセッサー・サブシステム１０８０のキャッシュ・メモリー、及び、Ｉ／Ｏ装置１０５０上の二次ストレージ（例えば、ハードドライブ、ストレージ・アレー等）の様な他の形態のストレージを含むことができる。実施形態によっては、これらの他の形態のストレージもまた、プロセッサー・サブシステム１０８０で実行可能なプログラム命令を記憶できる。前述のメモリー１００が、システム・メモリー１０２０を含む（または、システム・メモリー１０２０内に含まれる）ことが可能な実施形態もある。
【００９９】
Ｉ／Ｏインターフェース１０４０は、種々の実施形態に従って、他の装置と接続して、通信するよう構成された様々な形態のインターフェースの中の任意のもので良い。一実施形態において、Ｉ／Ｏインターフェース１０４０は、フロントサイドから１つ以上のバックサイド・バスまでのブリッジ・チップ（例えば、サウスブリッジ）である。Ｉ／Ｏインターフェース１０４０は、１つ以上の対応バス、または、他のインターフェースを介して、１つ以上のＩ／Ｏ装置１０５０に接続できる。Ｉ／Ｏ装置の例として、ストレージ装置（ハードドライブ、光学ドライブ、リムーバブル・フラッシュ・ドライブ、ストレージ・アレー、ＳＡＮ、または、関連コントローラ）、ネットワーク・インターフェース装置（例えば、ローカル、または、広域ネットワーク向け）、または、他の装置（例えば、グラフィックス、ユーザ・インターフェース装置等）がある。一実施形態において、コンピュータ・システム１０００は、ネットワーク・インターフェース装置を介して、ネットワークに接続する。
【０１００】
例示的なコンピュータ可読記憶媒体
図１１を参照すると、例示的なコンピュータ可読記憶媒体１１１０〜１１４０の実施形態が図示されている。コンピュータ可読記憶媒体１１１０〜１１４０は、プラットフォーム１０によって実行可能な（または、プラットフォーム１０上で実行する制御プログラム１１３によって解釈可能な）命令を記憶する製品の実施形態である。図示の通り、コンピュータ可読記憶媒体１１１０は、タスク・ランナー・バイト・コード９４４を含む。コンピュータ可読記憶媒体１１２０は、プログラム９４０を有する。コンピュータ可読記憶媒体１１３０には、ソース・コード９１０が含まれる。コンピュータ可読記憶媒体１１４０は、ライブラリー９２０を含む。図１１は、プラットフォーム１０に従って使用可能な想定されるコンピュータ可読記憶媒体の範囲を限定することを意図しておらず、この様なメディアの例示的内容を説明することを目的としている。概して、コンピュータ可読記憶媒体は、本明細書で述べている操作を実行するための種々のプログラム命令、及び／または、データのうちの任意のものを記憶可能である。
【０１０１】
コンピュータ可読記憶媒体１１１０〜１１４０は、実行中に使用されるプログラム命令、及び／または、データを記憶する種々の有形の（即ち、非一時的な）メディアの任意のものを言及する。一実施形態において、コンピュータ可読記憶媒体１１１０〜１１４０の１つには、メモリー・サブシステム１７１０の種々の部分が含まれていても良い。別の実施形態では、コンピュータ可読記憶媒体１１１０〜１１４０の１つには、磁気（例えば、ディスク）、或いは、光学媒体（例えば、ＣＤ、ＤＶＤ、関連技術等）の様な周辺ストレージ装置１０２０のストレージ・メディア、または、メモリー・メディアを含められる。コンピュータ可読記憶媒体１１１０〜１１４０は、揮発性、または、不揮発性メモリーの何れかで良い。例えば、コンピュータ可読記憶媒体１１１０〜１１４０の１つは、（限定を避けて）例えば、ＦＢ−ＤＩＭＭ、ＤＤＲ／ＤＤＲ２／ＤＤＲ３／ＤＤＲ４  ＳＤＲＡＭ、ＲＤＲＡＭ（登録商標）、フラッシュ・メモリー、及び、種々の種類のＲＯＭ等が可能である。注意：本明細書で使用される様に、コンピュータ可読記憶媒体は、搬送波の様な一時的媒体のみを含蓄するのに使用されるのではなく、むしろ、上記で列挙した様な一部の非一時的媒体を言及する。
【０１０２】
これまでに、特定の実施形態について述べてきたが、これらの実施形態は、ある特定の機能について実施形態を１つのみ説明した場合であっても、本開示の範囲を限定することを意図してはいない。本開示で提供された機能の例は、特に指示の無い限り、限定的では無く、説明を目的としている。上記説明は、本開示の恩恵を受ける当分野の技術者にとって明らかとなるこの様な機能の代替機能、変更機能、及び、均等機能に及ぶことを意図している。
【０１０３】
本開示の範囲には、本明細書において（明示的、ないし、暗黙的の何れかにより）開示されている全ての機能、或いは、複数機能の組み合わせ、または、これらの任意の汎化が、本明細書で扱っている問題の一部、若しくは、全てを軽減するか否かに依らず含められている。そして、本出願の出願中（または、出願優先権主張）に、この様な機能の全ての組み合わせに対する新たな特許請求の範囲が策定される場合もある。とりわけ、添付の請求項を参照することで、従属請求項からの特徴は、独立請求項からのものと組み合わせることが可能であり、更に、各独立請求項からの特徴は、添付の請求項で列挙された特定の組み合わせのみならず、適切な全ての方法で組み合わせることができる。
【図１】
2013533533.tif 000003
【図２】
2013533533.tif 000004
【図３】
2013533533.tif 000005
【図４】
2013533533.tif 000006
【図５】
2013533533.tif 000007
【図６】
2013533533.tif 000008
【図７】
2013533533.tif 000009
【図８】
2013533533.tif 000010
【図９】
2013533533.tif 000011
【図１０】
2013533533.tif 000012
【図１１】
2013533533.tif 000013
【手続補正書】
【提出日】平成25年2月18日(2013.2.18)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
コンピュータ・システムの第１プロセッサー上で実行可能なプログラム命令を記憶したコンピュータ可読記憶媒体であって、前記プログラム命令は、
第１組のバイト・コードを受信するステップであって、前記第１組のバイト・コードは、第１組のタスクを指定するステップと、
前記第１組のタスクを前記コンピュータ・システムの第２プロセッサーへオフロードするという判定に呼応して、前記第１組のタスクを実行するための一組の命令を生成させるステップと
を実行し、
前記一組の命令は、前記第１組のバイト・コードのフォーマットとは異なるフォーマットであり、前記フォーマットは、前記第２プロセッサーによってサポートされており、
更に、前記プログラム命令は、前記一組の命令を、その実行のために、前記第２プロセッサーへと供給させるステップも実行する、コンピュータ可読記憶媒体。
【請求項２】
前記プログラム命令は、前記第１プロセッサーの命令セット・アーキテクチャー（ＩＳＡ）内で命令を生成するため、前記第１プロセッサー上の制御プログラムによって解釈可能であることを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項３】
前記プログラム命令は、
第２組のバイト・コードを受信するステップであって、前記第２組のバイト・コードは、第２組のタスクを指定するステップと、
更に、前記第２組のタスクを前記第２プロセッサーにオフロードしないということが判定されたことに呼応して、前記第２組のバイト・コードを解釈して、前記第１プロセッサーの前記ＩＳＡ内で命令を生成することを前記制御プログラムに実行させるステップ
を実行するよう、前記制御プログラムにより更に解釈可能であり、
前記第１プロセッサーは、前記第２組のバイト・コードの解釈により生成される前記命令を実行することで、前記第２組のタスクを実行するよう構成されていることを特徴とする請求項２に記載のコンピュータ可読記憶媒体。
【請求項４】
前記プログラム命令は、
前記第２組のタスクを前記第２プロセッサーへオフロードしないということが判定されたことに呼応して、前記第２組のタスク内の複数タスクのそれぞれについてスレッドを１つ含むスレッド・プールを作成するために、前記制御プログラムによって解釈可能な対応する組のバイト・コードを生成するステップと、
更に、前記対応する組のバイト・コードを解釈して、前記第１プロセッサーの前記ＩＳＡ内で命令を生成することを、前記制御プログラムに対して実行させるステップと
を実行するよう、前記制御プログラムにより更に解釈可能であり、
前記第１プロセッサーは、前記対応する組のバイト・コードから生成される前記命令を実行することで、前記第２組のタスクを実行するよう構成されていることを特徴とする請求項３に記載のコンピュータ可読記憶媒体。
【請求項５】
前記制御プログラムは、仮想マシンを実現するよう実行可能であることを特徴とする請求項２に記載のコンピュータ可読記憶媒体。
【請求項６】
前記一組の命令を前記異なるフォーマットで前記自動生成させるステップは、
あるドメイン特化言語を有する一組のドメイン特化命令を生成するステップと、
前記一組のドメイン特化命令を前記一組の命令を前記異なるフォーマットで生成するよう実行可能な前記第２プロセッサーのドライバーへと供給するステップとを含むことを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項７】
前記ドメイン特化言語フォーマットを有する前記一組の命令を生成するステップは、
前記第１組のバイト・コードを実体化して、前記第１組のバイト・コードの中間表記を生成するステップと、
更に、前記第１組のバイト・コードの前記中間表記を変換して、前記一組のドメイン特化命令を生成するステップとを含む請求項６に記載のコンピュータ可読記憶媒体。
【請求項８】
前記プログラム命令は、
前記一組のドメイン特化命令を記憶するステップと、
前記第１組のバイト・コードを再受信するステップと、
前記一組のドメイン特化命令が記憶されたという判定に呼応して、前記記憶された一組のドメイン特化命令を前記第２プロセッサーの前記ドライバーへ供給し、前記第１組のタスクを実行するために、前記一組の命令を生成させるステップとを実行するよう実行可能であることを特徴とする請求項６に記載のコンピュータ可読記憶媒体。
【請求項９】
前記判定ステップは、前記第１プロセッサー、及び、前記第２プロセッサーによる前記第１組のタスクの過去の実行の解析に基くことを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項１０】
前記第１プロセッサーは、スレッド・プールを用いて、前記第１組のタスクの過去の実行の１つを実行することを特徴とする請求項９に記載のコンピュータ可読記憶媒体。
【請求項１１】
前記プログラム命令は、更に、
前記第２プロセッサーが前記一組の命令を実行する前に、前記第１組のタスクに関する一組の結果を記憶するための一組のメモリー位置を確保するステップと、
前記第２プロセッサーが前記一組の結果を生成する間、ガーベッジ・コレクターによる前記一組のメモリー位置の再割り当てを禁止するステップと、更に、
前記一組の結果を前記一組のメモリー位置に記憶するステップとを実行可能であることを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項１２】
前記第１組のバイト・コードは、アプリケーション・プログラミング・インターフェースへの１つ以上の呼び出を含むことで、前記第１組のタスクを指定することを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項１３】
前記第２プロセッサーは、グラフィックス・プロセッサーであることを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項１４】
コンピュータ・システムが、一組のタスクを指定する第１組のバイト・コードを受信するステップと、
前記一組のタスクを前記コンピュータ・システムの第１プロセッサーから前記コンピュータ・システムの第２プロセッサーへとオフロードするという判定に呼応して、前記コンピュータ・システムは、前記一組のタスクを実行するための一組のドメイン特化命令を生成するステップと、更に、
前記コンピュータ・システムは、前記ドメイン特化命令を、その実行のために、前記第２プロセッサーへと供給させるステップとを含む方法。
【請求項１５】
前記生成ステップは、第１プロセッサー用の仮想マシンによって解釈可能なコンパイル済ライブラリー・ルーチンによって実行され、更に、前記仮想マシンは、コンパイル済命令を解釈して、前記第１プロセッサーの命令セット・アーキテクチャー（ＩＳＡ）内で命令を生成するよう実行可能であることを特徴とする請求項１４に記載の方法。
【国際調査報告】
2013533533.tif 000014
2013533533.tif 000015