(57)【特許請求の範囲】
【請求項１】
一つ以上のアプリケーションを実行する方法であって、
プログラム・コンパイラによって自動的に、プログラム・コードを２つ以上の論理ユニットに分割するステップと、
前記論理ユニットの各々を一つ以上の実行可能エンティティにコンパイルするステップであって、前記論理ユニットの少なくとも一部は２つ以上の実行可能エンティティにコンパイルされ、前記２つ以上の実行可能エンティティは同一の論理ユニットを相異なるマシン固有コンパイルに入力して生成される、前記コンパイルするステップと、
前記同一の論理ユニットからコンパイルされた全ての実行可能エンティティに同一の識別子を割り当てるステップであって、前記一つ以上の実行可能エンティティが少なくとも２つのキーとともに保管され、一つのキーは前記一つ以上の実行可能エンティティのコンパイル元の論理ユニットを識別し、及びもう一つのキーは前記一つ以上の実行可能エンティティが適合するプラットフォームを識別する、前記割り当てるステップと
を含む、前記方法。
【請求項２】
どの一つ以上のプラットフォームが、プログラム・コード実行のために利用可能かを判定するステップと、
前記プログラム・コードの各指定点において実行対象の論理ユニットを判定し、前記判定された論理ユニットに関連付けられ且つ利用可能と判定された前記一つ以上のプラットフォームに適合する一つ以上の実行可能エンティティを選択するステップと
をさらに含む、請求項１に記載の方法。
【請求項３】
前記選択された一つ以上の実行可能エンティティを、利用可能と判定された前記一つ以上のプラットフォームのそれぞれに配信するステップをさらに含む、請求項２に記載の方法。
【請求項４】
前記分割が、前記プログラム・コードのデータ・フローの境目で行われる、請求項１〜３のいずれか一項に記載の方法。
【請求項５】
少なくとも一つの特定のマシンに対し、前記プログラムの全ての部分に対して実行可能エンティティが生成される、請求項１〜４のいずれか一項に記載の方法。
【請求項６】
前記相異なるマシン固有コンパイル群が、汎用コンピューティング・プラットフォーム、特殊コンピューティング・プラットフォーム、または再構成可能コンピューティング・プラットフォームの２つ以上の組み合わせ上で実行が可能なコンパイルを含む、請求項１〜５のいずれか一項に記載の方法。
【請求項７】
一つ以上のアプリケーションを実行する方法であって、
どの一つ以上のプラットフォームが、プログラム・コード実行のために利用可能かを判定するステップと、
前記プログラム・コードの各指定点において実行対象の論理ユニットを判定し、前記判定された論理ユニットに関連付けられ且つ利用可能と判定された前記一つ以上のプラットフォームに適合する一つ以上の実行可能エンティティを選択するステップであって、前記論理ユニットの少なくとも一部は２つ以上の実行可能エンティティにコンパイルされ、前記２つ以上の実行可能エンティティは同一の論理ユニットを相異なるマシン固有コンパイルに入力して生成される、前記選択するステップと、
前記選択された一つ以上の実行可能エンティティを、利用可能と判定された前記一つ以上のプラットフォームのそれぞれに配信するステップであって、前記一つ以上の実行可能エンティティが少なくとも２つのキーを含み、一つのキーは前記一つ以上の実行可能エンティティのコンパイル元の論理ユニットを識別し、及びもう一つのキーは前記一つ以上の実行可能エンティティが適合するプラットフォームを識別する、前記配信するステップと
を含む、前記方法。
【請求項８】
前記論理ユニットが、汎用コンピューティング・プラットフォーム、特殊コンピューティング・プラットフォーム、または再構成可能コンピューティング・プラットフォームの２つ以上の組み合わせに対しコンパイルされる、請求項７に記載の方法。
【請求項９】
一つ以上のアプリケーションを実行する方法を遂行するマシン命令を有する回路であって、前記方法は請求項１〜８のいずれか一項に記載の方法の各ステップを含む、前記回路。
【請求項１０】
一つ以上のアプリケーションを実行するためのシステムであって、請求項１〜８のいずれか一項に記載の方法の各ステップをハードウェアによる手段として構成した、前記システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、一般にコンピュータおよびアプリケーションに関し、さらに具体的には異種構成コンピュータまたはプロセッサ上でプログラムをコンパイルし、実行するための技法に関する。
【背景技術】
【０００２】
コンピュータを構成している計算エレメントの混成は、益々異種構成になってきている。既に、現今のコンピュータは、（例えば、中央処理装置（ＣＰＵ：ｃｅｎｔｒａｌ  ｐｒｏｃｅｓｓｉｎｇ  ｕｎｉｔ）などの在来型のプロセッサにグラフィック・プロセッサ（ＧＰＵ：ｇｒａｐｈｉｃｓ  ｐｒｏｃｅｓｓｏｒ）を連結している。ＧＰＵには特定の問題に対する優れた計算能力があるため、グラフィック処理にとどまらない用途に関心が高まっている。このように、ＣＰＵとＧＰＵとを備えたコンピュータは、そのアーキテクチャに適した計算タスクに対し特殊化された計算エレメント（ＧＰＵ）と、（例えば、必要時におけるそのＧＰＵに適した計算タスクを含む）他の全てのタスクに対する全くの汎用計算エレメント（ＣＰＵ）とを提供するので、異機種構成である。ＧＰＵは、ハードウェア・アクセラレータの一例である。ＧＰＵに加え、ハードウェア・アクセラレータの他の形態が幅広く検討されており、既に、暗号作成、ＸＭＬ構文解析、正規表現マッチング、物理エンジンなどのための、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ：ｆｉｅｌｄ  ｐｒｏｇｒａｍｍａｂｌｅ  ｇａｔｅ  ａｒｒａｙ）および固定関数アクセラレータの形によるアクセラレータの例がある。
【０００３】
ＣＰＵ、ＧＰＵ、ＦＰＧＡ、およびさまざまなアクセラレータに対するプログラミング技術が各別個に存在する。例えば、ＧＰＵに対するプログラミング言語には、ＯｐｅｎＭＰ、ＣＵＤＡ、および  ＯｐｅｎＣＬが含まれ、これらの全ては、Ｃプログラミング言語の拡張と見なすことができる。ＧＰＵ固有のコンパイラは、これらの言語の一つで記述されたプログラムを入力し、そのプログラムを前処理して、ＧＰＵ固有コード（以降、デバイス・コードと言う）を残りのプログラム・コード（以降、ホスト・コードと言う）から分離する。デバイス・コードは、通常、明示のデバイス固有の言語拡張、またはコンパイラ指示文（例、プラグマ）、またはシンタックス（例、ＣＵＤＡにおける＜＜＜．．．＞＞＞を使ったカーネルの開始）の存在によって認識される。デバイス・コードは、デバイス固有マシン・コード（以降、アーチファクトと言う）に、さらに翻訳されコンパイルされる。ホスト・コードは、コンパイル・プロセスの一部として、プログラムが実行されたとき、デバイス・アーチファクトを呼び出すように修正される。デバイス・アーチファクトは、ホスト・マシン・コードに組み入れるか、もしくは、リポジトリに在置し、呼び出しプロセスの一部である一意的識別子を介して識別することができる。
【０００４】
ＦＰＧＡを含む異種構成コンピュータに対するプログラミング言語およびソリューションは、ＧＰＵプログラミング・ソリューションに相当するが、但し、ＦＰＧＡは、まだ、広く受け入れられているＣダイアレクトの恩恵に浴していない。さまざまなＦＰＧＡ技術供給者によって提供されているＣ言語にはいくつかのの拡張版があり、これら供給者の全ては、一般に、自社のＣダイアレクトで記述されたコードを、ＧＰＵに対するコンパイラがたどるのと非常に類似したやり方でコンパイルしている。すなわち、このコンパイラは、プログラムをデバイス（ＦＰＧＡ）コードとホスト・コードとに分割し、その各々が別々にコンパイルされ、ホスト・コードはデバイス・アーチファクトを呼び出すように修正される。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
コンピュータ中の処理エレメントの異種混成の如何に関係なく、今日までのプログラミング・プロセスは、一般に類似しており次のような特徴を共有している。第一には、相異なるアーキテクチャを全く異なる言語またはダイアレクトでプログラムしなければならないので、一人のプログラマまたは一つのプログラミング・チームがプロジェクトの全ての側面で、均等にうまく作業することが難しい。第二には、連成計算、すなわち一緒にシームレスに作業する複数の異なる計算エレメントを用いたプログラム実行を統合する上での問題に対し比較的わずかな注意しか払われてこなかった。上記のためには、プログラムを、計算エレメントにマップが可能なタスクに分割し、それらのタスクを計算エレメントにマッピングまたはスケジューリングし、エレメント自体の中でデータをシリアル化しそれを送信のため前処理をする必要のある計算エレメントの間の通信を処理し、プロセッサの間のデータ経路を指定し、データを受信して非シリアル化する必要がある。異種構成コンピュータ上でのプログラムの実行を統合することに関連する複雑さを考慮すれば、どこで何を実行するかを極めて早期に静的に判定しなければならず、判定のやり直しはプロジェクトが展開するにつれ困難且つコスト高となる。このことは、例えばＦＰＧＡなど、一部のアクセラレータをうまくプログラムするのが難しいという事実によって増悪され、プログラマに重い技術的負担を掛けている。
【課題を解決するための手段】
【０００６】
一つの態様において、一つ以上のアプリケーションを実行する方法には、プログラム・コンパイラによって自動的にプログラム・コードを２つ以上の論理ユニットに分割するステップと、論理ユニットの各々を一つ以上の実行可能エンティティにコンパイルするステップとを含めることができ、論理ユニットの少なくとも一部は２つ以上の実行可能エンティティにコンパイルされ、前記２つ以上の実行可能エンティティは同一の論理ユニットの相異なるマシン固有コンパイルである。
【０００７】
別の態様において、一つ以上のアプリケーションを実行する方法には、プログラムの実行のために、どの一つ以上のプラットフォームが利用可能かを判定するステップと、プログラム・コードの各指定点において実行対象の論理ユニットを判定し、判定された論理ユニットに関連付けられ且つ利用可能と判定された前記一つ以上のプラットフォームに適合する一つ以上の実行可能エンティティを選択するステップと、前記選択された一つ以上の実行可能エンティティを、利用可能と判定された前記一つ以上のプラットフォームのそれぞれに配信するステップと、を含めることができる。
【０００８】
一つの態様において、一つ以上のアプリケーションを実行するためのシステムには、プログラム・コードを２つ以上の論理ユニットに分割し、論理ユニットの各々を一つ以上の実行可能エンティティにコンパイルするよう作動可能なコンパイラ・モジュールを含めることができる。論理ユニットの少なくとも一部は２つ以上の実行可能エンティティにコンパイルすることが可能である。前記２つ以上の実行可能エンティティは、同一の論理ユニットの相異なるマシン固有コンパイルとすることができる。ランタイム・モジュールは、プログラムの実行のために、どの一つ以上のプラットフォームが利用可能かを判定するよう作動することができる。ランタイム・モジュールは、プログラム・コードの各指定点において実行対象の論理ユニットを判定するようさらに作動可能であってよい。ランタイム・モジュールは、判定された論理ユニットに関連付けられ且つ利用可能と判定された前記一つ以上のプラットフォームに適合する一つ以上の実行可能エンティティを選択するようさらに作動可能であってよい。
【０００９】
さらに、マシン上で実施される命令を組み込んだ回路であって、該命令が本明細書に記載の方法を包含する回路を提供することができる。
【００１０】
さまざまな実施形態のさらなる特徴、構造、および動作を、添付の図面を参照しながら、以下に詳細に説明する。図面中の同じ参照番号は、同じまたは機能的に類似のエレメントを示す。
【図面の簡単な説明】
【００１１】
【図１】一つの実施形態における、本開示のコンパイラおよびランタイム手法を示す図である。
【図２】本開示の一つの実施形態における、コンパイラ方法を示すフロー図である。
【図３】本開示の一つの実施形態における、ランタイム方法を示すフロー図である。
【図４】一つの実施形態における、本開示のコンパイルおよびランタイム・アーキテクチャの例示的な構造概要図である。
【図５】本開示の一つの実施形態における、コンパイラ・フレームワークもしくはランタイム・システムまたはその両方が作動可能な例示的なシステムである。
【発明を実施するための形態】
【００１２】
本開示は、例えば、相異なる実行アーキテクチャを備えた２つ以上のプロセッサを有する異種構成コンピュータ（ハイブリッド・コンピュータとも言われる）など、相異なるプロセッサ群上で実行するために、アプリケーションをコンパイルするプロセスを説明する。また、コンパイルされたコンポーネントを選択し、適切なプロセッサ上に配信し実行するランタイム・プロセスを提供することができる。一つの態様において、本開示の手法は、異種構成コンピュータ上での連成計算のための単一ソース言語のコンパイルを可能にすることができ、既存のソリューションで発生する早期分割および連成計算の問題に対処するコンパイルもしくはランタイム技法またはその両方を使用する。例えば、ホスト・コンパイラは、プログラム全体上で作動することができ、これは単一ソース言語で記述することが可能で、汎用ＣＰＵ上でプログラムを実行するためのマシン固有コードを生成することができる。さらに、任意の数のデバイス固有コンパイラを、同様にプログラム全体上で作動可能にすることができ、かかる各コンパイラは、他のデバイス・コンパイラが行う選択に関係なく、デバイス固有コードの生成を実施するよう選択することができる。このように、本開示の手法は、相異なるコンパイラが、同一ソース・コードの機能的に同等なマシン固有の実装をコンパイルおよび生成することを可能にするので、前処理を行ってプログラムを一旦（ホスト・コードとデバイス・コードとに）分割するという問題を克服することができる。これらコンパイラの少なくとも一つ（通常はホスト・コンパイラ）には、プログラムの全部分に対するコードを生成することが保証されている。一つ以上のコンパイラが、入力プログラムのサブセットに対するコードを生成することができる。例えば、デバイス・コンパイラは、一般にホスト・コンパイラよりも制限的なので、デバイス・コンパイラは、入力プログラムのサブセットに対する実行ファイル（実行可能エンティティまたはアーチファクトとも言われる）を生成することになろう。しかして、本開示の一つの実施形態において、複数のコンパイラが、入力プログラムに対する実行可能エンティティ（アーチファクト）を生成することが可能で、どの所与のコンパイラも、同じプログラムに対して、例えば、そのプログラムの相異なるパーティションまたはサブセットに対応する複数の実行可能エンティティ（アーチファクト）を生成することができる。
【００１３】
別の態様において、本開示は、相異なるコンパイラによってコンパイルされたプログラムの同一の部分を、一意的識別子構造を用いて相関付ける技法も説明し、該構造は、相異なるコンパイラによってコンパイルされたプログラムの同一部分が必ず同一の識別子を生成することを確実にする。例えば、本開示の手法の一つの実施形態において、各アーチファクトは、対応する識別子を用いて標識され、コンピュータ中のデバイスの望ましいセットによって編成されたアーチファクト・ストアに在置される。アーチファクト・ストアは、さまざまなコンパイラに生成された全アーチファクトのリポジトリとすることができる。一つの実施形態において、アーチファクトは、キーのペアを用いて保管場所から読み出される：一つのキーが望ましいデバイスを識別し、別のキーが一意的なアーチファクトを識別する。例えば、第一キーは望ましいデバイスを識別し、第二キーは一意的アーチファクト識別子である。キーの順序は重要ではない。当該アーチファクトが存在すればそれが読み出され、存在しなければ失敗の表示が返される。
【００１４】
本開示の一つの実施形態において、プログラムを動的に分割するために、本開示で後記するランタイム層によってアーチファクト・ストアが用いられる。プログラムが実行されると、実行中に所定のイベント点において（通常、プログラムのソース言語のセマンティックスによって指定されるが、それに限らない）、ランタイムは、アーチファクト・ストアを調べ、プログラム実行の次の部分を実装するアーチファクトのセットを見付けることができる。ランタイムは、ヒューリスティックスを用いて、デフォルトのアーチファクトの代わりに実行する新しいアーチファクトを選択することが可能である。しかして、ランタイムは、デフォルトのホスト・コードを実行するよりはむしろ、代わりに、別のデバイス・アーチファクトを動的にロードして実行することができる。このように、ランタイムは、異種構成コンピュータ上でプログラムを実行する際、プログラムの多くの相異なるパーティションを可能にする。
【００１５】
図１は、例示的なソフトウェア／ハードウェア構成を備えた一つの実施形態における、本開示のコンパイラおよびランタイム手法を示す。一つの実施形態における本開示のコンパイル技法は、例えば、異種構成コンピュータ１０４上での連成計算のために、単一ソース言語１０２をコンパイルする。図示の例示的なハイブリッド・コンピュータ１０４は、いくつかの相異なる種類のプロセッサ、ＣＰＵ１２６、ＧＰＵ１２８、ＦＰＧＡ１３０、ＸＭＬ１３２、および別の特定用途向け集積回路（ＡＳＩＣ：ａｐｐｌｉｃａｔｉｏｎ  ｓｐｅｃｉｆｉｃ  ｉｎｔｅｇｒａｔｅｄ  ｃｉｒｃｕｉｔ）１３４を含む。ホスト・コンパイラ１０６は、ＣＰＵ１２６上での実行に適合する実行可能コードまたはエンティティ１１６を生成することができる。さらに、ＧＰＵコンパイラ１０８は、同じソース・コード１０２上で作動し、ＧＰＵ１２８上での実行に適合する実行可能エンティティまたはコード１１８を生成することができ；ＦＰＧＡコンパイラ１１０は、同じソース・コード１０２上で作動し、ＦＰＧＡ１３０での実行に適合する実行可能エンティティまたはコード１２０を生成することができ；ＸＭＬコンパイラ１１２は、同じソース・コード１０２上で作動し、ＸＭＬプロセッサ１３２上での実行に適合する実行可能エンティティまたはコード１２２を生成することができ；別のコンパイラ１１４は、同じソース・コード１０２上で作動し、別の特殊プロセッサまたは特定用途向け集積回路（ＡＳＩＣ）での実行に適合する実行可能エンティティまたはコード１２４を生成することができる。
【００１６】
これらコンパイラの少なくとも一つ（通常は、例えば１０６などのホスト・コンパイラ）には、プログラム１０２の全部分に対するコードを生成することが保証されている。一つ以上のコンパイラが、入力プログラム１０２のサブセットに対するコードを生成することができる。しかして、本開示の一つの実施形態において、複数のコンパイラ１０６、１０８、１１０、１１２、１１４が、入力プログラム１０２に対する実行可能エンティティ（アーチファクト）１１６、１１８、１２０、１２２、１２４を生成することができ、どの所与のコンパイラも、同じプログラムに対して、例えば、そのプログラムの相異なるパーティションまたはサブセットに対応する複数の実行可能エンティティ（アーチファクト）を生成することが可能である。生成された実行可能エンティティ１１６、１１８、１２０、１２２、１２４は、メモリまたは永続性もしくは恒久性ストレージ・デバイス、あるいはその両方中のアーチファクト・ストア１３６に、例えばデータベースとしてまたは別のフォーマットで保管することが可能である。ランタイムの過程で（例えば、プログラムがコンピュータ１０４上で作動または実行されているときに）、ランタイム環境１３８は、コンピュータ１０４上で、プログラムを実行するために利用可能なプロセッサ１２６、１２８、１３０、１３２、１３４の種類を判定し、コンピュータ１０４上のプロセッサの利用可能性に基づいて、アーチファクト・ストア１３６からの一つ以上の実行可能エンティティを選択して実行する。しかして、コンピュータのプロセッサ構成に応じて、異なった実行可能エンティティを選択し、適切なプロセッサに配信して実行することができる。
【００１７】
図２は、本開示の一つの実施形態におけるコンパイラの方法を示すフロー図である。２０２で、コンパイラは、プログラム・コードを２つ以上の論理ユニットに分割する。２０４で、コンパイラは、論理ユニットの各々を一つ以上の実行可能エンティティに分割する。論理ユニットの少なくとも一部は２つ以上の実行可能エンティティにコンパイルすることができ、これらは、同一の論理ユニットの相異なるマシン固有コンパイルである。２０６で、実行可能エンティティに、対応する識別子が割り当てられる。各論理ユニットに対応する一つ以上の実行可能エンティティに、一つの一意的な識別子が割り当てられる。しかして、同一の論理ユニットに対応する２つ以上の実行可能エンティティには、同じ識別子が割り当てられる。一つの実施形態において、各実行可能エンティティは、例えば、ある論理ユニットに対応する一意的識別子と当該実行可能エンティティを実行することが可能な特定のプロセッサ（またはデバイス）を識別する識別子とによるタプル、を用いて識別することができる。したがって、同一の論理ユニットに対応し一意的識別子を共有する２つ以上の実行可能エンティティは、デバイス識別子によって相互に区別することが可能である。２０８で、実行可能エンティティは、対応する識別子と併せ、例えば永続ストレージに保管することができる。
【００１８】
図３は、本開示の一つの実施形態におけるランタイム方法を示すフロー図である。３０２で、コンピュータ上でプログラムを実行するために、どの一つ以上のプラットフォームが利用可能であるかの判定が行われる。３０６で、プログラム・コードの各指定点において、実行対象の論理ユニットが判定される。判定された論理ユニットに関連付けられ且つ利用可能と判定された前記一つ以上のプラットフォームに適合する、一つ以上の実行可能エンティティが選択される。３０８で、選択された一つ以上の実行可能エンティティを、利用可能と判定された一つ以上のプラットフォームのそれぞれに配信することができる。
【００１９】
本開示の一つの実施形態において、包括的なコンパイラ・インフラストラクチャとランタイム・システムとを提供することができ、これらは、組み合わさって、異種のアクセラレータまたは同様物を備えたコンピューティング・システムをプログラミングするために単一言語の使用と、得られたプログラム群のかかるアーキテクチャ上での連成計算とを可能にする。一つの態様において、本開示の設計機能は、シーケンシャルか、または（マルチコアＣＰＵのような）スレッド並列か、（ＧＰＵのような）ベクトル並列か、または（ＦＰＧＡのような）ビット並列かの如何を問わず、いかなるプロセッサ上で実行する場合にも、同一のセマンティックスを有することを可能にできる。
【００２０】
一つの実施形態において、本開示のコンパイラは、プログラムを、最初に、独立しているが相互連結された各計算ノードまたは各論理ユニットとして計算を記述する、中間表現体に翻訳することができる。例えば、図１に戻って参照すると、ソース・プログラム１０２は、これらの計算ノード（１０２に示されるような論理ユニットとも言う）に分割することができる。
【００２１】
次いで、本開示のコンパイラは、一連の準独立のバックエンド・コンパイラに、相異なるターゲット・アーキテクチャに対する計算ノードの一つ以上の群をコンパイルする機会を与えることができる。ほとんどのバックエンド・コンパイラには、あらゆるものをコンパイルする義務はない。但し、一つの実施形態では、一つのバックエンドは、常にプログラム全体をコンパイルし、あらゆるノードが少なくとも一つの実装を有することを保証するように設定される。
【００２２】
一つの実施形態において、本開示の手法を用いたコンパイルの結果は、相異なるアーキテクチャに対するアーチファクトの集積であり、その各々は該アーチファクトが実装する特定の計算ノードで標識されている。しかして、ランタイムは、どのノードが起動されているかに応じて自身が利用可能な、機能的に等価な数多くの構成を有する。
【００２３】
本開示の一つの実施形態において、連成計算のため、例えばヒューリスティックスを用いてプログラムの動的分割が行われる。本開示のコンパイラは、例えば、ターゲットのマルチコアＣＰＵ、ＧＰＵ、およびＦＰＧＡなど利用可能な処理エレメントの全体にわたり、プログラムの動的分割を用いて、アプリケーションの尚早な静的分割の問題を解消することができる。実行時に分割を行う利点は、その分割が恒久的なものである必要がなく、プログラムの作業負荷の変化、プログラムのフェーズ変化、リソースの可用度、および他のきめ細かい動的フィーチャに適応できることである。
【００２４】
本出願で開示されたコンパイル・フレームワークおよびランタイムは、以下だけに限らないが、下記の機能を提供することができる。
【００２５】
一ソース−多重アーキテクチャ：論理ユニットの同一のセットを、アーキテクチャ固有のコンパイラを使って別個の実行可能アーチファクトにコンパイルし、しかして、例えばＪａｖａ（Ｒ）様の言語でコードを記述する可能性を与え、アクセラレータまたは同類のプロセッサに対してネイティブな実行ファイルを実現することが可能である。
【００２６】
ＧＰＵ、ＦＰＧＡおよびその他などの特定用途向けプロセッサへの自動コンパイル：例えば、一つの実施形態において、本開示のコンパイル・フレームワークは、ＧＰＵ上での実行のためのＪａｖａ（Ｒ）バイトコード、ＯｐｅｎＣＬコード、およびＦＰＧＡ上での実行のためのＶｅｒｉｌｏｇ（Ｒ）コードを生成することができる。
【００２７】
ストリーム計算のためのマネージド・ランタイム：一つの実施形態において、本開示のコンパイル・フレームワークは、例えばＪａｖａ（Ｒ）などの一つの言語で全体が実装された言語ランタイムを提供することができ、例えば任意のＪａｖａ（Ｒ）仮想マシン（ＶＭ：ｖｉｒｔｕａｌ  ｍａｃｈｉｎｅ）などの仮想マシンにホストされることが可能である。該ランタイムは、プログラム中に並列性が存在する場合、ネイティブの並行処理メカニズムを用い、この並列性を利用して、論理ユニットの実行をスケジュールすることができる。本開示において、論理ユニットはタスクとも言う。本開示において、タスク・グラフとは、例えば入力と出力とによって、結合されたタスク群のネットワークを言う。例えばタスク１は、タスク１の出力がタスク２の入力端４によって使用される結果としてタスク２に結合され得る。連成計算のためのフレキシブルな構成：一つの実施形態において、本開示のコンパイル・フレームワークは、前述のアーチファクトが存在するとき、例えば、Ｊａｖａ（Ｒ）ＶＭ、ＧＰＵおよびＦＰＧＡもしくは他のプロセッサまたはこれらの組み合わせなど、相異なるプロセッサの間で、通信並びにアーチファクトに対するデータのシリアル化および非シリアル化の管理を含め、論理ユニットの連成計算を統合することができる。
【００２８】
図４は、一つの実施形態における、本開示のコンパイルおよびランタイム・アーキテクチャの例示的な構造概要図である。このアーキテクチャは、フロントエンド（ＦＥ：ｆｒｏｎｔｅｎｄ）コンパイラ４０２と、ＧＰＵおよびＦＰＧＡなど特殊プロセッサに対する、アーキテクチャ固有のバックエンド（ＢＥ：ｂａｃｋｅｎｄ）コンパイラ群４０４とで編成することができる。フレームワーク（例えば、フレームワークのユーザ・インタフェース・モジュール）は、ソース・ファイル４０８のセットを受信し、実行のためのアーチファクト４１０を生成する。アーチファクトは、全体プログラムに（例えば、バイトコードを生成する場合のように）、もしくはそのサブセットに（例えば、ＯｐｅｎＣＬ／ＧＰＵおよびＶｅｒｉｌｏｇ（Ｒ）／ＦＰＧＡバックエンドを使用する場合のように）対応が可能な実行可能エンティティである。アーチファクトは、実行時において、それと意味的に同等な別のアーチファクトとの置き換えが可能なようにパッケージされる。
【００２９】
図４に示されたアーキテクチャには、汎用ＣＰＵに対する汎用コンパイラとしてＪａｖａ（Ｒ）バイトコード・コンパイラと、ＧＰＵおよびＦＰＧＡのそれぞれに対するバックエンド・コンパイルとしてＯｐｅｎＣＬおよびＶｅｒｉｌｏｇ（Ｒ）とが例示されている。これらのコンポーネントは単に例として示されている。なお、本開示の手法およびフレームワークは、図４に示された構成には限定されない。それどころか、本開示に記載されたオペレーションおよび機能は、他の汎用および特定用途のプロセッサとコンパイルとに適用することができる。さらに、一例として、本開示のコンパイラ・フレームワークによってコンパイルが可能な単一ソース・プログラムをプログラミングするのに用いられる一つの言語として、Ｊａｖａ（Ｒ）様のプログラミング言語並びにそのシンタックスおよびコマンドを以下に説明する。但し、本開示の手法は、この言語またはいかなる単一言語だけを用いてプログラムされたプログラムに限定されるものではない。
【００３０】
図４を参照すると、例示的な単一ソース言語４０８は、タスク・グラフ４１２の形で論理ユニットを顕現することができる。タスクは、データ項目がそのタスクへの入力として渡される限り、繰り返して機能を適用する。タスク・グラフは、タスクを、一つのタスクの出力が別のタスクの入力になるように、これらを一緒に結合して得られる。
【００３１】
フロントエンド・コンパイラ４０２の実装には、バイトコード・コンパイラを含めることができる。例えば、フロントエンド・コンパイラ４０２には、Ｊａｖａ（Ｒ）準拠の言語を含めることができ、これをエクリプス（ＥＣＪ）に組み込まれた既存のロバストＪａｖａ（Ｒ）コンパイラへの増分修正によって構築することが可能である。エクリプス・コンパイラ（および移行的にＦＥ４０２）は、浅い最適化（ｓｈａｌｌｏｗ  ｏｐｔｉｍｉｚａｔｉｏｎ）を行うことができる。エクリプス・コンパイラは、内部で、全体を通してプログラム表現として抽象シンタックス・ツリー（ＡＳＴ：ａｂｓｔｒａｃｔ  ｓｙｎｔａｘ  ｔｒｅｅ）を用いることが可能である。ＦＥ４０２は、ＡＳＴからＡＳＴへの書き換えを介して言語特質を実装し、既存のエクリプス・バイトコード生成フェーズを再利用する。
【００３２】
一つの実施形態において、バイトコード生成の直前に、ＦＥ４０２中のコンポーネントをＡＳＴに適用し、ＡＳＴをバックエンド４０４に適した中間表現体に変換することが可能である。該コンポーネントは、プログラムが実行時に生成することになる多くのタスク・グラフ４１２（定数伝播のインライン化および他の最適化後のこれらのトポロジおよび各ノードのコードを含む）の構造を静的に見出すことを目的に、プログラム４０８の諸部分の解釈的実行を行ってタスク・グラフを構築することができる。解釈的実行は、プログラムが構築できる可能性のある全てのあり得るタスク・グラフを見出すことはできない。
【００３３】
各種のバックエンド４０４は、これらのグラフを構成するタスクを個々にコンパイルすることが可能である。各バックエンドには、各タスクを調べてその方法がコンパイル可能かどうかを判定する排除機能コンポーネントを持たせることができる。そのバックエンドに適さない言語構造体を使った方法を包含するタスクは、当該バックエンドによるさらなるコンパイルから除外され、それに対するアーチファクトは生成されない。上記の場合を除き、バックエンドは、それがコンパイルした各タスクに対するアーチファクト４１０を生成する。バックエンドは、元のプログラムでは個別のタスクであったものに対してアーチファクトを生成することができる。これに換えて、バックエンドは、例えば、パイプライン全体（すなわち、連結されたタスクのシーケンス）、または一部のタスクが排除機能によって拒否され得る場合には少なくともパイプラインの可能最大サブセクションなど、連続するタスク群の集合体に対するアーチファクト４１０を生成することが可能である。
【００３４】
本開示の一つの実施形態において、フロントエンドおよびバックエンド・コンパイラ４０２、４０４は、各生成されたアーチファクトを表し、それを一意的タスク識別子で標識したマニフェストを協力して生成する。マニフェストおよびアーチファクト４１０のセットは、ランタイム４１４によって、どのタスク実装同士が相互に意味論的に等価かを判定する際に用いられる。プログラムが実行される際に、プログラム中のタスク構造およびグラフ構造の表現がこれらの識別子をランタイム４１４に伝えることができるように、同一のタスク識別子がバイトコード・コンパイルの最終フェーズに組み込まれる。個別のタスクは、それが、一つ以上のバックエンド４０４によって生成された、より大きな集合タスク群の部分であり得るので、複数のタスク識別子を有し得る。但し、タスク識別子は、同じタスク識別子を有するタスクが（単一体か複合体かの如何にかかわらず）機能的に等価であるような仕方で生成される。
【００３５】
ハイブリッド・コンピュータを構成することが可能な特殊プロセッサの一例にＧＰＵ４１８がある。この例において、ＧＰＵに対するバックエンドは、ＯｐｅｎＣＬコードを生成することができ、該コードは、プラットフォーム固有のＯｐｅｎＣＬランタイム・コンパイラを用いて、ネイティブのオブジェクト・コードに自動的にコンパイルされる。ＯｐｅｎＣＬコードの生成は、ＯｐｅｎＣＬ実装を備えたさまざまなプラットフォーム上で、コード４０８をネイティブに実行できるという利点をもたらす。一例として、一つの実施形態における本開示のフレームワークは、ＯｐｅｎＣＬを、ユニプロセッサ、ＧＰＵ、およびマルチコア・プロセッサに対して移植可能な「アセンブリ」言語として取り扱うことができる。
【００３６】
ＯｐｅｎＣＬバックエンド４２２は、個別タスクもしくは結合されたタスク・グラフに対するアーチファクト４１０を生成することができる。該バックエンドは、各タスクをＯｐｅｎＣＬカーネルにコンパイルし、タスクのスケジューリングを行い、タスク間のデータ転送を管理することが可能である。相異なるカーネル間の通信は、結合されたタスクの引き続く実行の間はデータがＧＰＵデバイスのメモリ中に常駐するように最適化することができる。これにより、ホストＣＰＵとＧＰＵとの間の不必要なデータ転送を回避し、しかしてパフォーマンスを最大化することができる。
【００３７】
並列性は、タスク・グラフ中に（例えば、プログラム中の明示的コマンドを介し）明示的に存在し得、または、プログラマによってもっと命令的スタイルで（例えば、マップまたは適用などの集合演算として）間接的に表すことが可能である。並列コードの部分が抽出されると、それは、例えばＯＰｅｎＣＬバックエンド４２２などのバックエンド・コンパイラ４０４によって、ＯｐｅｎＣＬ並列実行モデルに関連付けられたインデックス・スペースに直接マップするループに、内部で変換することができる。生成されたＯＰｅｎＣＬコードは、デバイス上で実行される、任意の入力サイズおよび任意の数のスレッドに適応させることが可能である。これは、多くの場合固定数のスレッドまたは固定された入力サイズを前提とする手書きのコードと対照的である。しかして、生成されたコードは、手書きのものよりも包括的でフレキシブルである。
【００３８】
ＧＰＵ４１８の良好なパフォーマンスを得るために、本開示のコンパイラ・フレームワークはデータを各種メモリに丁寧にマップすることができる。一般に、ＯｐｅｎＣＬプログラミング・モデルにおいては、４種類のメモリ、すなわちグローバル、定数、ローカル、およびプライベート・メモリが利用可能である。これらは、最遅で最大（グローバル・メモリ）から最速で最小（プライベート・メモリ）の順になっており、ＧＰＵデバイスの基板に配置される。グローバル・メモリには、デバイス上で実行されている全てのスレッドが読み取り／書き込みのためにアクセスできる。これはＣＰＵの主メモリ（ＲＡＭ）に相当する。定数メモリは、主としてプログラム定数を保管するのに使われる小型の読み取り専用グローバル・メモリと見なすことができる。ローカル・メモリは、同一の計算ユニット上で実行されている全てのスレッドの間で共有されている（マルチコア・プロセッサ中の共有レベル２キャッシュと類似の）読み取り／書き込みメモリである。最後に、プライベート・メモリは、各スレッド専用であり、スレッド間でデータを交換するために使うことはできない。バックエンド４０４（例えば４２２）は、各種メモリ中へのデータの配置を自動的に最適化し、最善のパフォーマンスを確実にするため、適切なプログラム変換を実施することが可能である。例えば、ループ・タイリングを並列ループに適用することが可能で、ローカル・メモリをスクラッチパッド・メモリとして用いて、グローバル・メモリへのトラフィックを最小化することができる。別の最適化は、グローバル・メモリからの冗長なロードを検出し、それらを、当該値を高速のプライベート・メモリに保管することによって排除することを含み得る。ＧＰＵ４１８に対し、他の諸最適化を実施することも可能である。
【００３９】
ハイブリッド・コンピュータを構成することが可能なプロセッサの別の例にＦＰＧＡ４２０がある。この例において、ＦＰＧＡバックエンド４２４は、タスク・グラフを演算することができ、パイプラインに対するＶｅｒｉｌｏｇ（Ｒ）コード、および並列処理のための明示で規定された他のプログラム・コマンドを生成することができる。簡潔に言えば、Ｖｅｒｉｌｏｇ（Ｒ）は、ハードウェア記述言語である。ＦＰＧＡ４２０を有する一つの実施形態において、本開示のバックエンド・コンパイラ４０４は、基本データ型を演算するタスクに対応することができ、無制限のアレイ割り当てを有するタスクを排除するが、有限のアレイ割り当ては可能にする。一つの態様において、コード生成手順は、タスク・グラフ中に表されるきめの粗いパイプライン並列処理と、タスクの方法の中で利用可能なきめの細かい命令レベル並列処理との二重のアプローチである。バックエンド・コンパイラ４２４は、モデルを用いて静的な作業見積もりを行ってボトルネックのタスクを判定し、次いで、そのワーカ方式を、単一演算として細粒化された極めてきめ細かいブロックに積極的に分割しようと試みる。ＦＰＧＡに対するバックエンド４２４には、諸最適化を含めることが可能である。バックエンド４２４は、ＣＰＵ４１６とＦＰＧＡ４２０との間でデータを転送するための通信ファームウエアを含む、事前生成されたハードウェア・ブロックのライブラリを使用することができる。バックエンド４２４は、生成されたＶｅｒｉｌｏｇ（Ｒ）の論理合成を自動的に実行し、ビットファイルを生成する（これは、プログラムを実行する前にＦＰＧＡを設定するために用いられる）。このステップでは、ユーザのいかなる介入も必要なく、供給元固有のＥＤＡ（ｅｌｅｃｔｒｏｎｉｃ  ｄｅｓｉｇｎ  ａｕｔｏｍａｔｉｏｎ（電子設計自動化））ツールを使うことができる。一例として、ＰＣＩｅベースのＸｉｌｉｎｘ（Ｒ）ＦＰＧＡに対応することができる。他のＦＰＧＡにも対応が可能である。
【００４０】
本開示中のランタイム・コンポーネントは、コンパイルされたコード（実行可能エンティティまたはアーチファクト）の、適切なハードウェアまたはプロセッサ上での実行を可能にする。一例として、ランタイム・モジュール４１４は、Ｊａｖａ（Ｒ）中に実装することができ、任意のＪＶＭによってホストされることが可能である。本開示の一つの実施形態において、ランタイム・モジュール４１４には、一つ以上の実行可能エンティティを実行するため、一つ以上の仮想マシンまたは同類のものを含めることができる。該モジュールは、実行時にタスク・グラフを構築し、利用可能なアーチファクト４１０の中からどのタスクの実装を使用するかを選定し、タスクのスケジューリングを実施し、必要または所望であれば、ネイティブのアーチファクトのマーシャリングおよびそれらとの通信を統合することができる。本開示の一つの実施形態において、ランタイム・モジュール４１４には、例えば、タスク・グラフを具現化し、タスク・グラフ、タスクの置き換え、並びにネイティブの結合およびマーシャリングをスケジュールし実行するなど、タスクを実施するための実行フェーズを含めることができる。
【００４１】
ランタイム・モジュール４１４の実装の一つの実施形態において、ランタイム４１４には、例えば、単一ソース・プログラム４０８をプログラムするのに使われたプログラミング言語中に生じ得る、あらゆる異なった種類のタスクに対するクラスを包含させることが可能である。バイトコード・コンパイラがあるタスクに対するコードを生成する際、該コンパイラは、これらのランタイム・クラスの一つに対するオブジェクト割り当てを直接生成するか、あるいは、適切なランタイム・クラスをサブ分類（ｓｕｂｃｌａｓｓ）するクラスを生成して、状況に応じた作用を加え、次いで生成されたクラスに対するオブジェクト割り当てを生成する。
【００４２】
一つのタスクの出力を別のタスクの入力に加える結合オペレーションは、結合を形成させる、ランタイム具備の方法に対するメソッド呼び出しを生成する。この具現化方式の結果として、プログラムが実行される際に、言語のタスク生成および結合オペレータが、ランタイム・オブジェクトの実際のグラフ中に反映されることになる。また、生成された、タスクをインスタンス化するバイトコードは、ランタイムに、バックエンド・コンパイラ４０４によって生成された、利用可能なタスク・アーチファクトのセットを広報するための一意的識別子を提供する。
【００４３】
一つの実施形態において、実行可能エンティティのスケジューリングおよび実行は以下のように行うことができる。いずれかのタスク・グラフを呼びだす際、「開始」メソッドがランタイムのスケジューリング部分を起動する。具現化されたグラフが探索され、そのグラフを構成するタスクが調べられ、各タスクのレートが計算される。「レート」とは、各入力に対し生成される出力の数を言う。ユーザ・メソッドから作成されたタスクは１：１のレートを有し、一方、内蔵のタスクは、静的に知ることが可能な（だが必ずしも１：１でない）他のレートを有し得、あるいはこれを動的に変化させることが可能である。
【００４４】
全タスクのレートが判明したならば、そのグラフは、スケジューラによって、（１）同期する領域中の全てのタスクが静的に既知のレートを有する、もしくは（２）その同期する領域が、動的に変化するレートを持つ単一のタスクを有する、ようにして、同期領域に分割される。第一の種類の各同期領域に対しては、静的スケジュールが計算され、該スケジュールは、タスクのレートのバランスを保つために適正な回数、各タスクを実行させることになる。したがって、一つの同期領域中のタスクの間の結合はエラスティック・バッファを持つ必要はないが、但し、同期領域群の間の結合は、変化するレートを調整するためにかかるバッファを有する。
【００４５】
グラフ中のタスクがバイトコードのアーチファクトだけを有することを前提として、ランタイムは、各同期領域に対するスレッドを生成する。これらのスレッドは、領域のスケジュールを一回反復し、出力する結合上のデータを生成するのに十分なデータが利用可能となるまで、当該領域から入来する接合をブロックすることになる。これらのスレッドの生成および開始は、ランタイムのｓｔａｒｔ（）演算の実装を完了させる。
【００４６】
一つの実施形態において、タスクの置き換え（すなわち、コンピュータ中の諸プロセッサ間での動的プログラム分割）は以下のように実施することができる。グラフ中のタスクが非バイトコード・アーチファクトである場合、ランタイムは、具現化されたタスク・グラフを調べる間にそのことを知る。というのは、そこに格納されたタスク群の一意的識別子は、バックエンド４０４によってポピュレートされたアーチファクト・ストア（図１の１３６を参照）中で効率的に検索することができるからである。ランタイムは、各タスクに対し、または（例えば、利用可能な複数の実行可能エンティティなどの）別の実装を有するタスクの連続シーケンスに対し置き換えを実現することができる。一つの実施形態において、ランタイムのアルゴリズムは自動的に置き換えを行うため、一つ以上のルールを用いることが可能である。例えば、あるルールは、より小さな置き換えよりも（より大きな数の連続するタスクを包含する）より大きな置き換えを選好するように規定することができる。別のルールは、バイトコードよりもＧＰＵおよびＦＰＧＡアーチファクトをサポートするように規定することが可能である。選択をマニュアルで指定することも同様に可能である。通信コストによっては、もっと高機能のアルゴリズムで動的移行を実施するか、あるいはランタイムの改作またはその他を検討することができよう。実際の置き換えの実現には、下記のネイティブな結合およびマーシャリングが含まれる。前述のように、スレッドの生成および開始の前に置き換えを行うことができるが、これがランタイムの他の部分に全般的な影響を与えることはない。
【００４７】
一つの実施形態において、ネイティブな結合およびマーシャリングは以下のように実施することができる。全ての非バイトコード・アーチファクトの特徴は、ＪＶＭのドメインとバックエンドのハードウェア・ドメインとの間に何らかの固有な種類の結合が存在することであり得る。例えば、ＪＶＭに沿うＧＰＵの連成計算には、最初に、現在動的にリンクされたライブラリの形にあるネイティブのバイナリをロードし（一回だけ実施）、ＪＶＭからＧＰＵにデータを転送するためにＪａｖａ（Ｒ）ネイティブ・インターフェース（ＪＮＩ：Ｊａｖａ  Ｎａｔｉｖｅ  Ｉｎｔｅｒｆａｃｅ）呼び出しを行うことが必要である。同様に、ＦＰＧＡの場合は、ビットファイルを用い、また、ＦＰＧＡデバイス・ドライバとのネイティブによる交信を取り扱うためのライブラリをロードして、デバイス自体がプログラムされる。全ての場合において、データの何らかのシリアル化および非シリアル化が生じ得る。技術的には、ＪＮＩは、個別のフィールドおよび従属オブジェクトにアクセスするためにコールバックを用い、参照することによってＪａｖａ（Ｒ）データ構造体の手渡しをサポートする。実際上は、多数のＪＮＩ交差を回避するためにデータのシリアル化を用いることができる。簡潔に言えば、ＪＮＩは、ＪＶＭで実行されるＪａｖａ（Ｒ）が、ハードウェアまたはオペレーティング・システムに固有のネイティブ・プログラムを呼び出しまたはこれから呼び出されることを可能にする。
【００４８】
大部分のネイティブ結合の待ち時間を軽減するために、結合上に何らかのバッファを生成し使用することが可能である。しかして、Ｊａｖａ（Ｒ）バイトコードを実行するタスクの真っただ中のネイティブ・タスクの存在によって、同期領域を破り、そのネイティブ・タスクを、スレッド・スケジューリングに関し同様に分離されたネイティブ領域中に入れることができる。ＪＶＭ中の同期領域は単純なデータ待ち行列によって分離できる一方、ネイティブ領域の間での待ち行列設定は、少なくとも部分的に、ネイティブ・コード中に埋め込むことが可能で、その詳細はバックエンドの種類に応じて変わり得る。
【００４９】
一例として、本開示のコンパイラ・フレームワークおよびランタイム・システムによってサポートされる単一言語をＪａｖａ（Ｒ）様の言語とすることができる。かかる言語は、必要なセマンティクスを有し、高度に多様なアーキテクチャの簡潔なプログラミングおよび効率的なコンパイルを可能にするように設計することができる。この言語は、タスク粒度のプログラム分割を可能にする、タスク・ベースのデータフロー・プログラミング・モデルを提供することが可能である。タスクは、その状態が（あったとしても）タスク内部に起因するものを除き変化できないようにするため、高い確実性で、それが可変のグローバル・プログラム状態にアクセスできず、そのタスクに対する外部参照が存在しないように、強く分離することができる。タスク・グラフは、タスクの一つの出力が別の一つの入力となるようにタスクを一緒に結合することによってもたらされる。値型だけが、これらの結合に沿ってタスクの間を流れるようにすることが可能である。値型は、不変オブジェクトを表現し、しかしてタスク分離が破られることはない。この言語は、分離性および不変性を保証し、連成計算のため、動的プログラム分割およびタスク・グラフの異種構成アーキテクチャへのマッピングの実施を理想的なものにすることができる。一つの実施形態において、かかるプログラミング言語は、並列性を顕現するよう設計された幾つかの機能によってＪａｖａ（Ｒ）を増補することができる。多種多様なプロセッサをプログラムするのに使用が可能な機能を含む、単一プログラミング言語の例が、Ｊｏｓｈｕａ  Ａｕｅｒｂａｃｈ、Ｄａｖｉｄ  Ｆ．Ｂａｃｏｎ、Ｐｅｒｒｙ  Ｃｈｅｎｇ、およびＲｏｄｒｉｃ  Ｒａｂｂａｈ著の論文：「ａ  Ｊａｖａ−ｃｏｍｐａｔｉｂｌｅ  ａｎｄ  ｓｙｎｔｈｅｓｉｚａｂｌｅ  ｌａｎｇｕａｇｅ  ｆｏｒ  ｈｅｔｅｒｏｇｅｎｅｏｕｓ  ａｒｃｈｉｔｅｃｔｕｒｅｓ」、２０１０年、ＯＯＰＳＬＡの中に、また、Ｊｏｓｈｕａ  Ａｕｅｒｂａｃｈ、Ｄａｖｉｄ  Ｆ．Ｂａｃｏｎ、Ｐｅｒｒｙ  Ｃｈｅｎｇ、およびＲｏｄｒｉｃ  Ｒａｂｂａｈ著の論文：「Ｔｈｅ  Ｌｉｑｕｉｄ  Ｍｅｔａｌ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅ−Ｌａｎｇｕａｇｅ  Ｒｅｆｅｒｅｎｃｅ  Ｍａｎｕａｌ」、技術レポート、ＲＣ２５００４、ＩＢＭ（ＩＢＭ社の登録商標）Ｒｅｓｅａｒｃｈ、２０１０年の中に記載されている。ｈｔｔｐ：／／ｄｏｍｉｎｏ．ｒｅｓｅａｒｃｈ．ｉｂｍ．ｃｏｍ／ｌｉｂｒａｒｙ  ／ｃｙｂｅｒｄｉｇ．ｎｓｆを参照されたい。ＳｔｒｅａｍＩｔのさらなる詳細が、Ｔｈｉｅｓ，Ｗｉｌｌｉａｍの論文「Ｌａｎｇｕａｇｅ  ａｎｄ  ｃｏｍｐｉｌｅｒ  ｓｕｐｐｏｒｔ  ｆｏｒ  ｓｔｒｅａｍ  ｐｒｏｇｒａｍｓ」、ＰｈＤ論文、Ｍａｓｓａｃｈｕｓｅｔｔｓ  Ｉｎｓｔｉｔｕｔｅ  ｏｆ  Ｔｅｃｈｎｏｌｏｇｙ、２００９年、およびＴｈｉｅｓ，Ｗｉｌｌｉａｍ、Ｋａｒｃｚｍａｒｅｋ、Ｍｉｃｈａｌ、およびＡｍａｒａｓｉｎｇｈｅ，Ｓａｍａｎ  Ｐの論文「ＳｔｒｅａｍＩｔ：Ａ  Ｌａｎｇｕａｇｅ  ｆｏｒ  Ｓｔｒｅａｍｉｎｇ  Ａｐｐｌｉｃａｔｉｏｎｓ」、ＣＣ、２００２年に記載されている。
【００５０】
なお、本開示のコンパイラおよびランタイムの手法およびフレームワークは、特定の言語の使用に限定されるものではない。むしろ、前述の言語は単なる一例として提示するものである。
【００５１】
図５は、本開示の一つの実施形態において、コンパイラ・フレームワークもしくはランタイム・システムまたはその両方が動作可能なシステムの例を示す。かかるシステムは、一つ以上のプロセッサ５０２、メモリ５０４含み得、ネットワーク、ストレージ、および他のデバイスに接続することが可能である。本開示のコンパイラ・フレームワークおよびランタイム・システム５０６は、コンピュータ・メモリ５０４に在置し、プロセッサ（群）５０２によって実行することができる。例えば、コンパイラ・フレームワークおよびランタイム・システム５０６は、永続性ストレージ・デバイスからロードする、もしくはネットワークからロードする、またはその両方からロードすることが可能である。プログラムは、前述のように本開示のコンパイラによってコンパイルすることができる。得られた実行可能エンティティは、前述のように、本開示のランタイム・システム５０６によって、保管もしくは実行またはその両方を行うことが可能である。なお、プログラムは、同じマシンでコンパイルして実行する必要はない。すなわち、例えば、一つのマシン上で本開示のコンパイラ・フレームワークを用いてプログラムをコンパイルし、保管された実行可能エンティティを、別のマシン上で本開示のランタイム・システムによって実行するため、そのマシンに移植することができる。一例として、図５にはマシンＡとマシンＢとが示されており、これらは相異なるプロセッサ構成を有し得る。プログラムは、マシンＢ上でマシンＢのプロセッサ５１０とメモリ５０８とを使用してコンパイルし、その後、マシンＡ上で実行することができ、その逆も可能である。図５中のコンピュータの構成は、単なる例として示されており、本開示の手法は他の任意の構成に適用することができる。
【００５２】
本開示では、（例えば、在来型のＣＰＵコア、ＧＰＵ、およびＦＰＧＡの混成による）異種アクセラレータ群を用いたコンピューティング・システムをプログラミングするために単一言語を使用することと、得られたプログラムをかかるアーキテクチャ上で連成計算することとを協働して可能にするコンパイラ・インフラストラクチャおよびランタイム・システムを上で説明してきた。一例として、既存のＪａｖａ（Ｒ）コンパイラを活用しいくつかの適用可能なコンパイル技法を顕現するフレームワークによって、Ｊａｖａ（Ｒ）準拠の言語を説明してきた。これらコンパイル技法には、以下に限らないが、（１）もたらされるグラフの構造およびコードを静的に見出すための、動的グラフ構築表現の解釈的実行と、（２）複数のバックエンドに対し冗長的にコンパイルし、所与のバックエンドに対し容易にコンパイルできないものを除外する多重バージョニング方式とが含まれる。ランタイム・モジュールは、計算エレメントに対し最適化された分割を選択できるようにされる。
【００５３】
ＣＰＵ、ＧＰＵ、ＦＰＧＡおよびさまざまなアクセラレータに対する別々のプログラミング技術が存在するが、これらは相異なるアーキテクチャにプログラムされることが必要な完全に異なった言語またはダイアレクトである。他方で、一つの実施形態における本開示の手法は、単一プログラムによって相異なるプロセッサ群をプログラミングすることを可能にする。さらに、本開示の手法は、一つのプログラムを、相異なるアーキテクチャ上で実行され合わさってシームレスに機能する別々の計算エレメント群に編成することを含む、連成計算を可能にする。さらに、本開示の手法は、何をどこで実行することになるかの判断について動的且つ自動的な決定を可能にする。
【００５４】
一つの実施形態において、本開示の手法もしくは一つ以上のコンポーネントまたはその両方は、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、グラフィカル処理ユニット（ＧＰＵ：ｇｒａｐｈｉｃａｌ  ｐｒｏｃｅｓｓｉｎｇ  ｕｎｉｔ）、他の特定用途プロセッサまたは回路、または中央処理装置（ＣＰＵ）あるいはこれらの任意の組み合わせ上に実装し、実行することができる。ハードウェア記述言語（ＨＤＬ：ｈａｒｄｗａｒｅ  ｄｅｓｃｒｉｐｔｉｏｎ  ｌａｎｇｕａｇｅ）などの言語を用いてかかるハードウェアまたは集積回路をプログラムすることが可能である。本開示の一つの実施形態において、例えば、プログラムの主論理をＦＰＧＡ上で実行し、一方、プログラムの従属的論理をＣＰＵ上で実行することができる。
【００５５】
当業者ならよく理解できるように、本発明の態様は、システム、方法、またはコンピュータ・プログラム製品として具現化することができる。したがって、本発明の態様は、全体がハードウェアの実施形態、全体がソフトウェアの実施形態（ファームウエア、常駐ソフトウェア、マイクロコードなどを含む）、あるいは、ソフトウェア態様およびハードウェア態様を組み合わせた実施形態の形を取ることができ、これらは一般に本明細書では全て「回路」、「モジュール」、または「システム」と称することがある。さらに、本発明の態様は、コンピュータ可読プログラム・コードが中に具現化されている一つ以上のコンピュータ可読媒体（群）中に具現化されたコンピュータ・プログラム製品の形を取ることも可能である。
【００５６】
一つ以上のコンピュータ可読媒体（群）の任意の組み合わせを用いることができる。コンピュータ可読媒体は、コンピュータ可読信号媒体、またはコンピュータ可読ストレージ媒体とすることができる。コンピュータ可読ストレージ媒体は、例えば、以下に限らないが、電子的、磁気的、光学的、電磁気的、赤外的、または半導体の、システム、装置、もしくはデバイス、あるいはこれらの任意の適切な組み合わせであり得る。コンピュータ可読ストレージ媒体のさらに具体的な例（非包括的リスト）には、一つ以上の配線を有する電気接続、携帯型コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ（ＲＡＭ：ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）、読み取り専用メモリ（ＲＯＭ：ｒｅａｄ−ｏｎｌｙ  ｍｅｍｏｒｙ）、消去可能プログラム可能読み取り専用メモリ（ＥＰＲＯＭ：ｅｒａｓａｂｌｅ  ｐｒｏｇｒａｍｍａｂｌｅ  ｒｅａｄ−ｏｎｌｙ  ｍｅｍｏｒｙまたはフラッシュ・メモリ）、光ファイバ、携帯型コンパクト・ディスク読み取り専用メモリ（ＣＤ−ＲＯＭ：ｃｏｍｐａｃｔ  ｄｉｓｃ  ｒｅａｄ−ｏｎｌｙ  ｍｅｍｏｒｙ）、光ストレージ・デバイス、磁気ストレージ・デバイス、または前述の任意の適切な組み合わせが含まれよう。本文書の文脈において、コンピュータ可読ストレージ媒体は、命令実行システム、装置、またはデバイスによってあるいはこれらに関連させて使用するためのプログラムを、包含または格納できる任意の有形媒体であり得る。
【００５７】
コンピュータ可読信号媒体には、例えばベースバンド中にまたは搬送波の一部として具現化されたコンピュータ可読プログラム・コードを有する、伝播データ信号を含めることができる。かかる伝播信号は、以下に限らないが、電磁気的、光学的、またはこれらの任意の適切な組み合わせを含め、さまざまな形態の任意の形を取ることが可能である。コンピュータ可読信号媒体は、コンピュータ可読ストレージ媒体ではないが、命令実行システム、装置、もしくはデバイスによってまたはこれらに関連させて使用するためのプログラムを通信、伝播、または伝送が可能な任意のコンピュータ可読媒体であり得る。
【００５８】
コンピュータ可読媒体上に具現化されたプログラム・コードは、以下に限らないが、無線、有線、光ファイバ・ケーブル、ＲＦなど、または前述の任意の適した組み合わせを含め、任意の適切な媒体を用いて送信することができる。
【００５９】
本発明の態様のオペレーションを実行するためのコンピュータ・プログラム・コードは、Ｊａｖａ（Ｒ）、Ｓｍａｌｌｔａｌｋ（Ｒ）、Ｃ＋＋などのオブジェクト指向プログラミング言語、および、“Ｃ”プログラミング言語または類似のプログラミング言語などの従来式手続き型プログラミング言語、Ｐｅｒｌ、ＶＢＳまたは類似の言語などのスクリプト言語、もしくは、ＬｉｓｐおよびＭＬなどの関数型言語、およびＰｒｏｌｏｇなどの論理指向言語、またはこれらの組み合わせを含む、一つ以上のプログラミング言語の任意の組み合わせで記述することができる。このプログラム・コードは、スタンドアロン・ソフトウェア・パッケージとしてユーザのコンピュータで専ら実行することも、ユーザのコンピュータで部分的に実行することもでき、一部をユーザのコンピュータで一部を遠隔コンピュータで実行することもでき、あるいは遠隔のコンピュータまたはサーバで専ら実行することもできる。後者の場合は、ローカル・エリア・ネットワーク（ＬＡＮ：ｌｏｃａｌ  ａｒｅａ  ｎｅｔｗｏｒｋ）または広域ネットワーク（ＷＡＮ：ｗｉｄｅ  ａｒｅａ  ｎｅｔｗｏｒｋ）を含む任意の種類のネットワークを介して、遠隔コンピュータをユーザのコンピュータに接続することもでき、あるいは（例えばインターネット・サービス・プロバイダを使いインターネットを介し）外部のコンピュータへの接続を行うこともできる。
【００６０】
本発明の態様は、本発明の実施形態による方法、装置（システム）およびコンピュータ・プログラム製品のフローチャート図もしくはブロック図またはその両方を参照しながら説明されている。当然のことながら、フローチャート図もしくはブロック図またはその両方の各ブロック、および、フローチャート図もしくはブロック図またはその両方中のブロックの組み合わせは、コンピュータ・プログラム命令によって実装することが可能である。これらのコンピュータ・プログラム命令を、汎用コンピュータ、特定用途コンピュータ、またはマシンを形成する他のプログラム可能データ処理装置のプロセッサに供給し、そのコンピュータまたは他のプログラム可能データ処理装置のプロセッサを介して実行されるこれらの命令が、フローチャートもしくはブロック図またはその両方のブロックまたはブロック群中に規定された機能群／動作群を実装するための手段を生成するようにできる。
【００６１】
また、これらのコンピュータ・プログラム命令を、コンピュータ、他のプログラム可能データ処理装置、または他のデバイスに対し特定の仕方で機能するよう命令することができるコンピュータ可読媒体に格納し、そのコンピュータ可読媒体に格納された命令が、フローチャートもしくはブロック図またはその両方のブロックまたはブロック群中に規定された機能／動作を実装する命令群を包含する製造品を生成するようにすることが可能である。
【００６２】
さらに、コンピュータ・プログラム命令を、コンピュータ、他のプログラム可能データ処理装置、または他のデバイスにロードし、そのコンピュータ上、他のプログラム可能装置上、または他のデバイス上で一連のオペレーション・ステップを実行させて、コンピュータ実装されるプロセスを生成し、当該コンピュータ上または他のプログラム可能装置上で実行される命令が、フローチャートもしくはブロック図またはその両方のブロックまたはブロック群中に規定された機能群／動作群を実装するためのプロセスを提供するようにすることもできる。
【００６３】
図面のフローチャートおよびブロック図は、本発明のさまざまな実施形態による、システム、方法、およびコンピュータ・プログラム製品の可能な実装のアーキテクチャ、機能、およびオペレーションを例示している。この点に関し、フローチャートまたはブロック図中の各ブロックは、規定の論理機能（群）を実装するための一つ以上の実行可能命令を含む、モジュール、セグメント、またはコードの部分を表し得る。また、一部の別の実装においては、ブロック中に記載された機能が、図面に記載された順序を外れて行われ得ることに留意すべきである。例えば、連続して示された２つのブロックが、関与する機能によって実際にはほぼ同時に実行されることがあり、時にはこれらのブロックが逆の順序で実行されることもあり得る。さらに、ブロック図もしくはフローチャート図またはその両方の各ブロック、およびブロック図もしくはフローチャート図またはその両方中のブロック群の組み合わせは、特定の機能または動作を実施する、特定用途ハードウェア・ベースのシステム、または特定用途ハードウェアとコンピュータ命令との組み合わせによって実装可能なことにも留意すべきである。
【００６４】
本開示のシステムおよび手法は、一つ以上のプロセッサもしくはコアまたはそれらの両方、メモリ、およびコンピュータ処理システムを実装する他のシステム・コンポーネント（図面には明示せず）を包含する処理ユニット、またはコンピュータ・プログラム製品を実行できるコンピュータ、を含むコンピュータ・システムで遂行または実行が可能である。該コンピュータ・プログラム製品には、例えば、ハード・ディスク、コンパクト・ディスクなどのコンパクト・ストレージ媒体、または他のストレージ・デバイスなどの媒体を含めることができ、該媒体を、当業者が既知のまたは今後知られる任意の技法を用い処理ユニットによって読み取って、コンピュータ・プログラム製品を、実行のため処理システムに供給することができる。
【００６５】
コンピュータ・プログラム製品には、本明細書で説明した手法の実装を可能にする全ての機能を含めることができ、該製品は、コンピュータ・システム中にロードされたとき本方法を遂行することができる。ここでの文脈において、コンピュータ・プログラム、ソフトウエア・プログラム、プログラム、またはソフトウェアとは、情報処理能力を有するシステムに、直接に、もしくは（ａ）別の言語、コード、または表記法への変換、および（ｂ）異なった材料形態での再生のいずれかまたは両方を行った後に、特定の機能を実行させるよう意図された命令のセットの、任意の言語、コードまたは表記法による任意の表現を意味する。
【００６６】
また、本開示のシステムおよび方法を遂行するコンピュータ処理システムには、出力の表示を提示し、そして、例えば、キーボード、およびマウス・デバイスまたはポインティング・デバイスなどの入力デバイスと相まって、ユーザがその表示を介してデータを入力し処理システムとやり取りできる表示を提供する、モニタまたは表示画面などの表示デバイスを含めることができる。また、コンピュータ処理システムは、直接にあるいは遠隔接続を介して、プリンタ、スキャナ、スピーカ、および他の任意のデバイスなど一つ以上の周辺デバイスに接続または連結することができる。該コンピュータ処理システムは、ローカル・イーサネット（Ｒ）、ＷＡＮ接続、インターネットなどの任意の一つ以上を介して、あるいは相異なるコンピューティング・システムを接続しそれらを相互に通信させることのできる他の任意のネットワーキング手法を介して、サーバ、他の遠隔のコンピュータ処理システム、ネットワーク・ストレージ・デバイスなど一つ以上の他の処理システムに接続または連結することが可能である。本開示のシステムおよび方法のさまざまな機能およびモジュールは、異なった処理システムに分散してまたは任意の単一プラットフォームで、例えば、ローカルにまたはネットワーク上に分散して保管されたデータにアクセスするなどして実装または遂行することができる。
【００６７】
本明細書で使用する用語は、単に特定の実施形態を説明する目的のためのものであり、本発明を限定することは意図されていない。本明細書で用いられる、単数形「ある（“ａ”、“ａｎ”）」、および「該（“ｔｈｅ”）」は、文脈上明確に別途に示されていなければ、複数形も同じように含むことが意図されている。さらに、当然のことながら本明細書で用いられる「含む（“ｃｏｍｐｒｉｓｅ”）」もしくは「含んでいる（“ｃｏｍｐｒｉｓｉｎｇ”）」またはその両方は、述べられた機能、整数、ステップ、オペレーション、エレメント、もしくはコンポーネント、またはこれらの組み合わせの存在を特定するが、一つ以上の他の機能、整数、ステップ、オペレーション、エレメント、コンポーネント、もしくはこれらの群、または前述の組み合わせの存在を排除するものではない。
【００６８】
添付の請求項中のミーンズ・プラス・ファンクションまたはステップ・プラス・ファンクションの要素全ての、対応する構造、材料、動作および均等物は、具体的に請求された他の請求要素と組み合わせてその機能を遂行するための、一切の構造、材料または動作を包含することが意図されている。本発明の記述は、例示および説明の目的で提示されたもので、網羅的であることも、または本発明を開示した形態に限定することも意図されていない。当業者には、本発明の範囲および趣旨から逸脱することのない多くの修改および変形が明白であろう。本実施形態は、本発明の原理および実際的な応用を最善に説明し、他の当業者が、意図する特定の用途に適したさまざまな修改を加えたさまざまな実施形態に関して、本発明を理解できるように選択し説明されたものである。
【００６９】
本開示のさまざまな態様は、プログラム、ソフトウェア、コンピュータ中に具体化されたコンピュータ命令、あるいはマシン可用または可読の媒体として具現化することができ、これらは、コンピュータ、プロセッサ、もしくはマシンまたはこれらの組み合わせ上で実行されたとき、コンピュータまたはマシンに本発明のステップを遂行させる。また、本開示中で説明したさまざまな機能および方法を実行するためにマシンが実行できる命令のプログラムを実態的に具現化する、マシン可読のプログラム・ストレージ・デバイスが提供される。
【００７０】
本開示のシステムおよび方法は、汎用コンピュータ・システムまたは特定用途コンピュータ・システムに実装し、実行することができる。このコンピュータ・システムは、既知のまたは今後知られるシステムの任意の種類とすることができ、一般に、プロセッサ、メモリ・デバイス、ストレージ・デバイス、入力／出力デバイス、内部バス、もしくは、通信ハードウェアおよびソフトウェアなどと併用して通信を行うための通信インターフェース、またはこれらの組み合わせを含み得る。
【００７１】
本出願で使用され得る用語「コンピュータ・システム」および「コンピュータ・ネットワーク」は、固定型もしくは携帯型コンピュータ・ハードウェアまたはその両方、ソフトウェア、周辺機器、およびストレージ・デバイスのさまざまな組み合わせを含み得る。コンピュータ・システムには、協働して機能するためにネットワークで結ばれたあるいは別途にリンクされた、複数の個別コンポーネントを含めることができ、あるいは一つ以上のスタンドアローン・コンポーネントを含めることができる。本出願のコンピュータ・システムのハードウェアおよびソフトウェアは、デスクトップ、ラップトップ、もしくはサーバ、またはこれらの組み合わせを含むことができ、これらに含めることができる。モジュールは、何らかの「機能」を実装するデバイス、ソフトウェア、プログラム、またはシステムのコンポーネントであり得、ソフトウェア、ハードウェア、ファームウエア、電子回路構成などとして具現化することが可能である。
【００７２】
前述した諸実施形態は、説明のための例であって、本発明がこれらの特定の実施形態に限定されると解釈すべきではない。しかして、当業者は、添付の特許請求の範囲に定義される本発明の趣旨および範囲から逸脱することなく、さまざまな変更および修改を実現することができよう。
【図１】
0005984158.tif 000002
【図２】
0005984158.tif 000003
【図３】
0005984158.tif 000004
【図４】
0005984158.tif 000005
【図５】
0005984158.tif 000006