処理方法
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法。この方法は、前記処理要素のうちの特定の1つの処理要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別するステップを含む。この方法は、コンピュータ・コードの少なくとも1つの第1の部分に関係するコンピュータ・コードの少なくとも1つのさらなる部分を識別するステップをさらに含む。コンピュータ・プログラム・コードの少なくとも1つの第1の部分およびコンピュータ・プログラム・コードの少なくとも1つのさらなる部分が、前記処理要素のうちの特定の1つの処理要素によって実行させられる。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータ・プログラム・コードを処理するための方法に関するものであり、より具体的には複数の処理要素上で実行するためのコンピュータ・プログラムを処理するための方法に関するものである。
【背景技術】
【0002】
コンピュータは、一般的に、ユーザーによって要求されたタスクを実行できるように組み合わせて動作する複数の相互作用するコンポーネントを備える。1つのコンポーネントは、中央演算処理装置(CPU)であり、命令を実行し、コンピュータ内の他のコンポーネントにそれらのコンポーネントの指定された機能を実行させる役割を持つ。
【0003】
コンピュータは、現在では、ビジネス環境とレジャー環境とにおけるさまざまな異なるアプリケーションに広く使用されており、コンピュータの処理能力に課される要求は、高まる一方である。例えば、いくつかのビジネス・アプリケーションでは、増大している多数の複雑な情報を迅速に処理する必要性がある。レジャーアプリケーションでは、コンピュータは、娯楽目的に使用され、コンピュータ・グラフィックスの高度化に対するユーザーの期待が高まるにつれ、ユーザーの期待に応えるコンピュータ・グラフィックスを生成するために処理性能が向上することが要求される。
【0004】
一般に、単一のCPUを備えるコンピュータは、どのクロック・サイクルでも命令を1つしか実行できない。このことは、不可避的に、与えられた期間において実行されうる命令の数を制限することによってプロセッサの性能を制約する要因となる。このことを念頭に置き、一般にマルチ・コア・プロセッサと称される、複数のプロセッサ・コアを持つCPUが、コンピュータにおいて使用されてきた。マルチ・コア・プロセッサ内のそれぞれの処理コアは命令を同時に実行することができるので、複数の命令がどの時点においても実行され、このため、プロセッサの性能を改善することができる。
【0005】
したがって、マルチ・コア・プロセッサは、複数のプロセッサ・コアを使用してアプリケーションの命令を並列処理する能力を備えている。アプリケーションは、それぞれが独立したプロセッサ・コア上で実行されうる多数の個別に処理可能なタスク(しばしばスレッドと称される)に分割されうる。
【0006】
単一のアプリケーションに対して並列処理を活用するには、アプリケーションがスレッドを利用して複数のプロセッサ・コアを使用するように意図的に設計される必要がある。
【0007】
複数のプロセッサ・コアを使用するようにアプリケーションを設計することは、一般的には、複雑で困難なタスクであると考えられている。大まかに言うと、複数のプロセッサ・コアを使用するようにアプリケーションを設計する作業の複雑さおよび困難さは、使用されるプロセッサ・コアの個数とともに増大する。複数のスレッドを伴うプログラムを設計する場合には、複数のスレッドによって使用されうるデータを管理し、特定のスレッドがこれらのスレッドが依存する他のスレッドの前に実行されないことを保証することが必要になる。
【0008】
既存のプログラムでは、この問題は、複数のプロセッサ・コアを使用するようにアプリケーションを書き換え、プログラムの完全性が維持されることを保証する必要があることでいっそう悪化する。
【発明の概要】
【発明が解決しようとする課題】
【0009】
本発明の目的は、上述の問題のうちの1つまたは複数を取り除くか、または軽減することである。
【課題を解決するための手段】
【0010】
本発明の第1の態様によれば、コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理する方法が提供される。この方法は、前記処理要素のうちの特定の1つの処理要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別することと、コンピュータ・コードの前記少なくとも1つの第1の部分に関係するコンピュータ・コードの少なくとも1つのさらなる部分を識別することと、コンピュータ・プログラム・コードの前記第1の部分およびコンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの特定の1つの処理要素によって実行されることを引き起こすこととを含む。
【0011】
このような点で、コンピュータ・プログラム・コードの第1の部分が、特定の処理要素によって実行されるべきであると識別された場合、本発明の第1の態様の方法は、関係するコンピュータ・プログラム・コードも特定の処理要素によって実行されることを保証するために使用されうる。
【0012】
処理要素のそれぞれは、各型を有するものとしてよく、前記処理要素のうちの特定の1つの要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別することは、コンピュータ・プログラム・コードの少なくとも1つの第1の部分が実行されるべき特定の型の処理要素を識別することを含むものとしてよい。コンピュータ・プログラム・コードの第1の部分およびコンピュータ・プログラム・コードのさらなる部分が処理要素のうちの特定の1つの処理要素によって実行されることを引き起こすことは、コンピュータ・プログラム・コードの第1の部分およびコンピュータ・プログラム・コードのさらなる部分が特定の型を有する処理要素のうちの1つの処理要素によって実行されることを引き起こすことを含むことができる。
【0013】
複数の処理要素は、コンピュータ・プログラム・コードの第1の部分およびコンピュータ・プログラム・コードのさらなる部分が実行されるべき特定の型の処理要素であるものとしてよく、またコンピュータ・プログラム・コードの第1の部分およびコンピュータ・プログラム・コードのさらなる部分が特定の型を有する複数の処理要素のうちの1つの処理要素によって実行されることを引き起こすことは、特定の型を有する複数の処理要素のうちの1つの処理要素を選択することをさらに含むことができる。
【0014】
コンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別することは、コンピュータ・プログラム・コードの少なくとも1つの第1の部分が前記処理要素のうちの前記特定の1つの処理要素によって実行されるべきであることを示す少なくとも1つのプログラム構成体を識別することを含むことができる。つまり、この識別は、プログラマーによってコンピュータ・プログラム・コード内に挿入されたマーカーに基づくものとしてよい。これらのマーカーは、既存のコンピュータ・プログラム・コードに都合よく追加され、これにより、コンピュータ・プログラム・コードの特定の部分が特定の処理要素上で実行されなければならないことを示すように既存のコンピュータ・プログラム・コードを修正するための手段を実現することができる。
【0015】
コンピュータ・プログラム・コードの前記さらなる部分は、コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分において参照されうる。例えば、コンピュータ・プログラム・コードのさらなる部分は関数であってよく、前記関数は、コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分から呼び出されるものとしてよい。
【0016】
関数は、コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分から間接的に呼び出されるものとしてよい。例えば、コンピュータ・プログラム・コードの少なくとも1つの第1の部分内のコンピュータ・プログラム・コードのさらなる部分への参照は、コンピュータ・プログラム・コードのさらなる部分が仮想関数の特定の実装である、その仮想関数への呼び出しであってもよい。代替的に、コンピュータ・プログラム・コードの第1の部分は、関数への参照を受け取り、前記参照を受け取ったことに応答して前記関数を呼び出すようになされるものとしてもよい。例えば、コンピュータ・プログラム・コードの第1の部分は、関数への関数ポインタを受け取り、関数ポインタを受け取ったことに応答して関数を呼び出すようになされるものとしてもよい。
【0017】
第1のコンピュータ・プログラム・コードおよびさらなるコンピュータ・プログラム・コードが複数の処理要素のうちの特定の1つの処理要素によって実行されることを引き起こすことは、複数の処理要素のうちの特定の1つの処理要素に対してコンピュータ・プログラム・コードの前記第1の部分およびコンピュータ・プログラム・コードの前記さらなる部分をコンパイルすることを含むことができる。例えば、複数の処理要素のうちの異なる複数の処理要素が、異なる命令セットを有していてもよく、したがって、その引き起こすことは、コンピュータ・プログラム・コードがコンパイルされるべきターゲット命令セットを選択することを含むことができる。
【0018】
この方法は、複数の前記処理要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも1つの第2の部分を識別することと、コンピュータ・プログラム・コードの前記第2の部分が前記複数の前記処理要素によって実行されることを引き起こすことをさらに含むことができる。
【0019】
コンピュータ・プログラム・コードは、コンピュータ・プログラム・コードの第2の部分への第1および第2の参照を含むことができ、コンピュータ・プログラム・コードの前記第2の部分が前記複数の前記処理要素によって実行されることを引き起こすことは、前記コンピュータ・プログラム・コードの前記第2の部分が前記第1の参照への応答として第1の処理要素によって、また前記第2の参照への応答として第2の処理要素によって実行されることを引き起こすことを含むことができる。第1の処理要素は、処理要素が第1の参照を実行することに基づいて決定され、第2の処理要素は、処理要素が第2の参照を実行することに基づいて決定されうる。
【0020】
複数の処理要素が、複数の記憶域、例えば複数のメモリ内に格納されているデータにアクセスすることができる。前記引き起こすことは、複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分を修正することを含むことができる。
【0021】
コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを含むものとしてよく、前記修正することは、前記コンテキスト・レベルに基づき少なくとも1つのメモリ・アクセス・オペレーションを修正することを含むことができる。例えば、少なくとも1つのメモリ・アクセス・オペレーションは、メモリ・アクセス・オペレーションに関連付けられているデータ・アイテムが宣言され、メモリ・アクセス・オペレーションが実行される相対的なコンテキスト・レベルに基づき修正されうる。データ・アイテムの例は、変数および定数である。一般に、変数およびデータ・アイテムという用語は、本明細書では交換可能に使用され、メモリ・ロケーションに格納されている任意のデータを指す。
【0022】
それぞれのコンテキスト・レベルは、関連付けられている記憶域を有することができ、前記修正することは、第2のコンテキスト・レベルに関連付けられている記憶域内のデータにアクセスする第1のコンテキスト・レベルにおけるメモリ・アクセス・オペレーションを修正することを含むことができ、第2のコンテキスト・レベルは第1のコンテキスト・レベルと明確に区別される。前記修正することは、第2のコンテキスト・レベルに関連付けられている記憶域の識別子をメモリ・アクセス・オペレーションに追加することを含むことができる。
【0023】
修正することは、第2のコンテキスト・レベルに関連付けられているソフトウェア実装キャッシュにアクセスするように第1のコンテキスト・レベルにおけるメモリ・アクセス・オペレーションを修正することを含むことができる。
【0024】
修正することは、メモリ・アクセス・オペレーションがソフトウェア・トランザクション・メモリ(software transactional memory)(STM)技術を使用して実行されるようにメモリ・アクセス・オペレーションを修正することを含むことができる。
【0025】
修正することは、メモリ・アクセス・オペレーションがコンピュータ・ネットワーク上でデータ転送を使用して実行されるようにメモリ・アクセス・オペレーションを修正することを含むことができる。例えば、特定のコンテキスト・レベルに関連付けられている記憶空間は、リモートに配置されてもよく、特定のコンテキスト・レベルに関連付けられている記憶装置レベルへのアクセスは、ネットワーク上で実行されうる。
【0026】
特定のコンテキスト・レベルに関連付けられている記憶空間については、その記憶空間内に格納されているデータは、ガーベジ・コレクションなどの、自動メモリ管理を受けるものとしてよい。ガーベジ・コレクション・システムは、メモリ空間のどれかの中に割り当てられた記憶域を回収するように動作可能であるものとしてよく、そこでは、データへのポインタまたは参照は、どのようなコンテキスト・レベルにおいても保持されないと決定される。特定のコンテキスト・レベルに関連付けられているメモリ空間のうちの1つのメモリ空間は、ガーベジ・コレクションで回収されるメモリ空間として処理されてもよく、そこでは、そのコンテキスト・レベルにおけるすべてのメモリ参照は、ガーベジ・コレクションの目的のために追跡される。コンテキスト・レベル内のポインタによる到達が可能でないデータを格納するガーベジ・コレクションで回収されるメモリ空間内のどのロケーションも、他のデータを格納するために使用できるように割り当てられたデータ・プールから解放することに利用可能にされうる。
【0027】
前記コンピュータ・プログラムの前記さらなる部分は、少なくとも2回、前記コンピュータ・プログラム・コードにおいて参照され、それぞれの参照は各メモリ・アクセス・オペレーションを含むことができる。この方法は、第1の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第1の修正を作成することと、第2の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第2の修正を作成することとをさらに含むことができる。
【0028】
第1のメモリ・アクセス・オペレーションは、第1の記憶域内のデータにアクセスすることができ、第2のメモリ・アクセス・オペレーションは、第2の異なる記憶域内のデータにアクセスすることができる。
【0029】
この方法は、前記コンピュータ・プログラム・コードの前記さらなる部分の第1の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への第1の参照を処理することと、前記コンピュータ・プログラム・コードの前記さらなる部分の第2の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への第2の参照を処理することとをさらに含むことができる。
【0030】
この方法は、前記コンピュータ・プログラム・コードの前記第1の部分および前記さらなる部分のコピーを作成することをさらに含むことができ、前記引き起こすことは、複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの第1の部分のコピーおよびコンピュータ・プログラム・コードのさらなる部分のコピーを修正することを含む。
【0031】
本発明の第2の態様によれば、コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理する方法が提供され、コンピュータ・プログラム・コードは、複数のデータ・アイテムを参照し、少なくとも1つのデータ・アイテムが特定の処理要素のローカルにあるメモリ内に格納され、少なくとも別のデータ・アイテムが複数の処理要素間で共有されるメモリ内に格納される。この方法は、前記データ・アイテムのうちの第1のデータ・アイテムへの参照を含むコンピュータ・プログラム・コードの第1の部分を処理することと、前記第1のデータ・アイテムが格納されているメモリを決定することと、決定されたメモリを示すようにコンピュータ・プログラム・コードを修正することとを含む。
【0032】
このような点で、コンピュータ・プログラム・コードは、複数の異なるメモリへのコンピュータ・プログラム内の参照が適切なメモリを識別するように正しく処理されることを保証するように修正されうる。
【0033】
コンピュータ・プログラム・コードの前記第1の部分は、第1の処理要素上で実行され、前記決定することは、第1のデータ・アイテムが第1の処理要上で実行されるものとしてコンピュータ・プログラム・コードの一部において宣言されているかどうかを判定することを含むことができる。
【0034】
コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを定義することができ、前記第1のデータ・アイテムが格納されるメモリを決定することは、前記第1のデータ・アイテムが宣言されるコンテキスト・レベルを決定すること含むことができる。修正することは、前記コンピュータ・プログラム・コードの前記第1の部分が第1のデータ・アイテムが宣言されているコンテキスト・レベルと異なるコンテキスト・レベルで出現する場合、ただしその場合に限り実行されうる。
【0035】
複数のデータ・アイテムへのそれぞれの各参照は、静的ポインタであるか、または動的ポインタのいずれかであってよい。特定の参照が静的ポインタであるか、または動的ポインタであるかは、決定されたメモリを示すようにコンピュータ・プログラム・コードの修正をもたらしうる。例えば、参照が静的ポインタである場合、ポインタの型が修正され、参照が動的ポインタである場合、ポインタの値が修正されうる。
【0036】
修正は、第1のデータ・アイテムへの参照の複製を作成することと、決定されたメモリを示すように複製を修正することとを含むことができる。
【0037】
決定されたメモリを示すように複製を修正することは、決定されたメモリに関連付けられているコンテキスト・レベルを示すように複製を修正することを含むことができる。前記決定されたメモリに関連付けられているコンテキスト・レベルの指示は、コンピュータ・プログラム・コードの第1の部分が出現するコンテキスト・レベルの指示であってよい。例えば、修正することは、第1のコンピュータ・プログラム・コードが出現するコンテキスト・レベルが第1のデータ・アイテムが宣言されるコンテキスト・レベルのうちのコンテキスト・レベルの外部にあることを示すように適切なキーワードを参照に追加すること含むことができる。
【0038】
複数のデータ・アイテム内の少なくとも1つのデータ・アイテムは、関数であってもよい。したがって、データ・アイテムへの参照は、関数への参照とすることができる。関数への参照の例は、関数ポインタ、仮想メソッド、およびメンバ関数ポインタを含む。
【0039】
本発明の第3の態様によれば、複数のメモリを備えるシステム内で実行されるべきコンピュータ・プログラム・コードの構文上の、および/またはセマンティクス上の正しさを判定するための方法が提供され、この方法は、第1のポインタ・データ・アイテムを第2のポインタ・データ・アイテムの値に割り当てる第1の命令を識別することと、前記第1および第2のポインタ・データ・アイテムがそれぞれ共通メモリ内のメモリ・ロケーションを識別するかどうかを判定することと、前記第1および第2のポインタ・データ・アイテムが共通メモリ内のメモリ・ロケーションを識別しないと判定された場合に、エラーを示すこととを含む。
【0040】
本発明の第4の態様によれば、コンピュータ・プログラム・コードが複数の処理要素にまたがって実行されることを引き起こすようにコンピュータ・プログラム・コードを処理する方法が提供される。この方法は、コンピュータ・コードの少なくとも1つの部分が特定の処理要素上で実行されなければならないことを示すようにコンピュータ・プログラム・コードの少なくとも1つの部分に修飾子をアタッチすることを含む。
【0041】
処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、単一の処理要素上で実行されるようになされうる。コンピュータ・プログラム・コードは、単一の処理要素上で実行されることが意図されている少なくとも1つの制御の流れを定義することができ、前記修飾子は、単一の制御の流れの一部が別の処理要素上で実行されることを引き起こしうる。
【0042】
処理要素のそれぞれは、各型を有するものとしてよく、それらの処理要素の少なくとも2つは、異なる型を有する。処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、それぞれ同じ型を有する複数の処理要素にまたがって実行されるようになされうる。例えば、コンピュータ・プログラム・コードは、修飾子のアタッチ前に、ホモジニアス・マルチ・コアプロセッサ上で実行されるようになされるものとしてよく、修飾子のアタッチは、コンピュータ・プログラム・コードがヘテロジニアス・マルチ・コアプロセッサ上で実行されることを引き起こしうる。
【0043】
処理要素は、マルチ・コア・プロセッサのプロセッサもしくはプロセッシング・コアとすることができる。
【0044】
本発明の第5の態様によれば、コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理する方法が提供され、この方法は、前記コンピュータ・プログラム・コードの一組の部分が異なる処理要素によって実行されることを指示することを含む。この一組の部分は、その指示に基づきリンク時に決定されうる。コンピュータ・プログラム・コードのその一組の部分は、一組の関数であってもよい。コンピュータ・プログラム・コードの一組の部分の指示は、一組の関数を含むロケーションを示すプレースホルダを含んでいてもよい。次いで、プレースホルダによって示される実際の一組の関数を見つけるためにプレースホルダがリンク時に調べられ、その一組の関数が異なる処理要素によって実行されるように修正されうる。
【0045】
本発明の第6の態様によれば、コンピュータ・プログラム・コードを複数の記憶空間を備える環境内で実行するのに適したコードにするための方法が提供され、コンピュータ・プログラム・コードは、前記記憶空間のうちの1つの記憶空間への参照を含む少なくとも1つの型定義を備え、この方法は、前記記憶空間のうちの前記1つの記憶空間への前記参照を前記記憶空間のうちの別の1つの記憶空間への参照と置き換えることによって前記型定義のコピーを作成することを含む。
【0046】
この型定義は、struct型、union型、またはクラスのうちの1つを定義することができる。
【0047】
本発明の態様は、都合のよいどの方法でも実装されうることは理解されるであろう。例えば、本発明は、有形のキャリア媒体(例えば、ディスク)または無形のキャリア媒体(例えば、通信信号)であってもよい適切なキャリア媒体上で搬送されうる適切なコンピュータ・プログラムによって実装されるものとしてよい。本発明の態様は、本発明を実施するようになされているコンピュータ・プログラムを実行するプログラム可能コンピュータの形態をとりうる好適な装置を使用して実装されるものとしてもよい。
【0048】
本発明の一態様を参照しつつ説明されている本発明の特徴が、本発明の他の態様内に含まれるものとしてよいこともさらに理解されるであろう。
【0049】
次に、例えば添付図面を参照しつつ、本発明の実施形態が説明される。
【図面の簡単な説明】
【0050】
【図1】マルチ・コア・プロセッサを備えるコンピュータのコンポーネントを示す略図である。
【図2】図1のマルチ・コア・プロセッサをさらに詳しく示す略図である。
【図3A】プログラム・コードがマルチ・コア・プロセッサ上で実行されることを可能にするプログラム・コードの処理の概要を示す略図である。
【図3B】本発明の一実施形態による処理の概要を示す略図である。
【図4】本発明の一実施形態によりアクセラレーション・セクションとアクセラレーション関数を定義するように行われる修正を示すプログラム・コードの例を示す図である。
【図5】本発明の一実施形態によりアクセラレーション・セクションとアクセラレーション関数を定義するように行われる修正を示すプログラム・コードの例を示す図である。
【図6】本発明の一実施形態によりアクセラレーション・セクションとアクセラレーション関数を定義するように行われる修正を示すプログラム・コードの例を示す図である。
【図7】本発明の一実施形態による、アクセラレーション・セクションの内側のデータ・アクセスを示すプログラム・コードの一例を示す図である。
【図8】本発明の一実施形態による、処理によって変換されない関数を示すプログラム・コードの一例を示す図である。
【図9】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図10】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図11】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図12】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図13】本発明の一実施形態によるデータ・アクセスを示すプログラム・コードの一例である。
【図14】ポインタの初期化を示すプログラム・コードの一例を示す図である。
【図15】ポインタのキャストを示すプログラム・コードの一例を示す図である。
【図16】ポインタのキャストを示すプログラム・コードの一例を示す図である。
【図17】オブジェクト指向クラスを示すプログラム・コードの一例を示す図である。
【図18】本発明の一実施形態により処理される図17のプログラム・コードを示す図である。
【図19】本発明の実施形態によるプログラム・コード内に関数の複製を生成するためのそのプログラム・コードの処理を示す流れ図である。
【図20】本発明の実施形態によるプログラム・コード内に関数の複製を生成するためのそのプログラム・コードの処理を示す流れ図である。
【図21】共有メモリを有するホスト処理ユニットとバスによってホスト処理ユニットに接続されているアクセラレータ・プロセッシング・コアとを備えるコンピュータのコンポーネントを示す略図である。
【図22】図21に示されているコンポーネント上で実行されるように処理されうるプログラム・コードの一例を示す図である。
【図23】図22のプログラム・コードと図21のコンポーネントとの間の関係を示す略図である。
【発明を実施するための形態】
【0051】
図1は、コンピュータ装置の略図である。コンピュータ装置は、RAM 2の形態をとる揮発性メモリに格納されている命令を読み出して実行するようになされているプロセッサ1を備える。RAM 2は、コンピュータによって実行されるプログラム、さらにはプログラムによって使用されるデータを構成する両方の命令を格納する。コンピュータ装置は、ハード・ディスク・ドライブ3の形態の不揮発性メモリをさらに備える。コンピュータ装置は、適切な入力/出力デバイスとの通信を可能にするI/Oインターフェイス4および有線または無線手段によってコンピュータ・ネットワークとの通信を可能にするようになされたネットワーク・インターフェイス5も備える。上述のコンポーネントは、通信バス6によって1つに接続される。
【0052】
本明細書で説明されている開発は、図2を参照しつつ説明されている型のマルチ・コア・プロセッサであるプロセッサ1によるコンピュータ・プログラムの実行に関係する。図2は、1つのホスト・コア7と3つのアクセラレータ・コア8、9、10とを備えるマルチ・コア・プロセッサの概略を示している。マルチ・コア・プロセッサは、ホスト・コア7だけでなく、アクセラレータ・コア8、9、10のそれぞれによってアクセス可能である共有メモリ11をさらに備える。それに加えて、アクセラレータ・コア8、9、10のそれぞれは、各ローカルの「スクラッチ・パッド」メモリ12、13、14を有する。ホスト・コア7は、主制御処理ユニットであるが、アクセラレータ・コア8、9、10は、実行プログラムによって指定された特定の機能でホスト・コア7を支援するように割り当てられた処理ユニットである。共有メモリ11は、ホスト・コア7によって直接アクセスされうるが、アクセラレータ・コア8、9、10のそれぞれは、ダイレクト・メモリ・アクセス(DMA)を通じて共有メモリ11にアクセスすることができる。アクセラレータ・コアは、共有メモリ11内の任意のロケーションにランダムにアクセスすることができるものとしてよい。しかし、共有メモリ11へのアクセラレータ・コアのアクセスには、付加的な制約もありうる。例えば、リード・オペレーションおよびライト・オペレーションは、最小または最大のデータ・サイズに制約され、読み出されるか、または書き込まれるデータのサイズは、特定の倍数のバイト数(例えば、4、8、12、16)に制約され、アクセスされるデータは、メモリ11内でアライメントを揃えられうる(例えば、アクセラレータ・コア8、9、10は、2のべき乗の偶数倍数であるアドレスに格納されているデータにのみアクセスすることができるものとしてよい)。
【0053】
つまり、共有メモリへのアクセラレータ・コアのアクセスは、メモリへのホスト・コアのアクセスと異なるような仕方で制約されうる。
【0054】
ホスト・コア7およびアクセラレータ・コア8、9、10のそれぞれは同一ものであってもよく、この場合、プロセッサ1はホモジニアス・マルチ・コア・プロセッサと称される。代替的に、マルチ・コア・プロセッサ1は、ヘテロジニアス・マルチ・コア・プロセッサであってもよく、その場合、コア7、8、9、10は互いに異なり、例えば、アクセラレータ・コア8、9、10のそれぞれは、各異なる機能を備えていてもよい。例えば、ヘテロジニアス・マルチ・コア・プロセッサは、1つの汎用ホスト・コアと物理エンジン、シナジスティックプロセッシングエレメント、またはグラフィカル・プロセッシング・ユニット(GPU)などの多数の専用アクセラレータ・コアとを備えることができる。ヘテロジニアス・マルチ・コア・プロセッサ内の異なるアクセラレータ・コアは、異なる命令セットを使用することができ、異なるサイズのローカル・メモリ12、13、14を有することができ、異なる性能特性を有することができる。
【0055】
多くのコンピュータ・プログラムは、順次実行を意図して書かれ、また書かれてきた。このようなプログラムは、上述の、図2に示されている型のマルチ・コア・プロセッサによって実現される並列処理機能を利用することは容易にはできない。マルチ・コア・プロセッサによって実現される並列処理を活用するように、順次定義されたコンピュータ・プログラムを処理するためのシステムの概要が、図3Aおよび3Bを参照しつつ説明されている。
【0056】
ごく一般的な言い方をすると、本発明の実施形態は、コンピュータ・プログラム・コードが、処理されたコードの異なる部分が異なるプロセッサ・コア上で実行されるように処理されることを可能にするものである。プロセスの概要は、図3Bに提示されている。
【0057】
ブロック15で、特定のプロセッサ上で実行されなければならないソース・コードの少なくとも1つの指示を含むようにソース・コードに注釈が入れられる。この注釈は、人間のプログラマーによる手作業で行うことができる。ブロック16で、処理されたソース・コードの一部分が、注釈に基づいてプロセッサ・コアに割り当てられる。ブロック17で、ソース・コードのさまざまな部分が複製され、ソース・コードのこれらの複製された部分が複数のプロセッサ・コア上で実行されることを可能にする。ソース・コードの一部分の複製は、以下に詳しく説明されるが、大まかに言えば、例えば、プロセッサ、プロセッサ・コア、および/またはコンピュータ・ネットワーク・ノードであってもよい、複数の実行ユニット上で実行するためのソース・コードの処理部分に関するものである。この複製は、異なるバージョンの特定のコードが異なるメモリ内に格納されているデータにアクセスするために生成される必要があるとすれば、複製された(または処理された)コードが共有メモリ11とアクセラレータ・コア8、9、10のローカルにあるメモリ12、13、14のうちの1つのメモリの両方に格納されているデータを処理することも可能にする。これは、複製されるソース・コードが、異なる引数を付けてソース・コードの異なる部分から呼び出される関数を含む場合であることが多い。
【0058】
コードのさまざまな他の部分は、ブロック18で処理され、そのコードとマルチ・コア・プロセッサの実行との互換性を保証する、例えば、共有メモリをターゲットとするポインタとアクセラレータ・コア8、9、10のうちの1つのアクセラレータ・コアのローカルにあるメモリ12、13、14のうちの1つのメモリをターゲットとするポインタとの間の整合性を保証する。
【0059】
上述の処理を実行すると、それぞれのプロセッサ・コアに対するソース・コードが、ブロック19で、そのプロセッサ・コアに適したコンパイラによるコンパイルのために作成される。
【0060】
次に、図3Bを参照すると、ソース・コード・プリプロセッサ20は、マルチ・コア・プロセッサ1の特定のコア7、8、9、10上で処理および実行を行うようにコンパイルされなければならないソース・コードのセクションを識別し、共有メモリ11内に、またはアクセラレーション・コア8、9、10のうちの1つのアクセラレーション・コアのメモリ12、13、14内に置かれなければならないデータを識別するようにユーザーによって修正されている、C、C++、C#、またはJavaなどの、プログラミング言語で書かれたソース・コードを受け取る。
【0061】
ソース・コード・プリプロセッサ20は、関数および変数をプログラム・パーティショニング・ツール21に出力する。ソース・コード・プリプロセッサ20から出力される関数および変数の形態は、例えば、ソース・プログラムの字句、抽象構文木、または高水準コンパイラ中間表現のリストとすることも可能である。ソース・コード・プリプロセッサ20の出力は、どのソース・コードが特定のプロセッサ・コアによって処理のマークを明示的に付けられているかを示す情報、および特定のデータがプロセッサ・コア間で共有されているか、またはアクセラレータ・コアのうちの1つのアクセラレータ・コアに特有のものであるかの任意の明示的な指示を表す情報を含む。表現は、RAM 2内に格納されうるか、またはプログラム全体の表現がプログラム・パーティショニング・ツール21に利用可能になるようにハード・ディスク・ドライブ3に保存されうる。ソース・コード・プリプロセッサ20からの出力は、高水準中間表現と称される。
【0062】
標準の前処理タスク(CおよびC++では、#includeおよび#defineステートメントの処理など)に加えて、プリプロセッサ20は、構文および型検査を供給される修正済みソース・コードに対して実行し、構文に関して、またセマンティクスに関して誤りのあるソース・コードを拒絶することができる。
【0063】
プログラム・パーティショニング・ツール21は、特定のプロセッサ・コア上で実行されるように指定されている任意のソース・コードのセクションがそのプロセッサ・コア上で確かに実行されることを保証する。同様に、プログラム・パーティショニング・ツール21は、ソース・コードがデータがコア間で共有されるか、またはコアのうちの特定の1つのコアによってアクセスされるべきであることを指定している場合に、データが指定されているとおりに確かに処理されることを保証する。
【0064】
プログラム・パーティショニング・ツール21は、プロセッサ・コア7、8、9、10のそれぞれについて各プログラム・コードおよびデータを出力する。これを行う際に、プログラム・パーティショニング・ツール21は、元のソース・コードにさまざまな修正を加えて、実行および格納が望み通りに取り扱われることを保証する。これらの修正の性質については、以下でさらに詳しく説明される。プログラム・パーティショニング・ツール21は、プログラム・コードおよびデータをCなどの人間が読めるプログラミング言語で出力することができる。代替的に、プログラム・パーティショニング・ツール21は、コードおよびデータをコンパイラ中間表現で出力することができる。コードおよびデータは、それぞれのプロセッサ・コア7、8、9、10について複数のコンパイラ22に出力される。2つのコンパイラ22a、22bが図3に示されており、第1のコンパイラ22aはホスト・コア7に特有のプログラム・コードを受け取るが、第2のコンパイラ22bはアクセラレータ・コア8、9、10のうちの特定の1つのアクセラレータ・コアに対するプログラム・コードを受け取る。
【0065】
コンパイラ22は、プログラム・パーティショニング・ツール21の出力をプロセッサ・コア7、8、9、10のそれぞれについて実行可能コードに変換する。プログラム・パーティショニング・ツール21は、関数のリストをビルド・ツール23にさらに出力する。ビルド・ツール23は、以下でさらに詳しく説明されているようにそれぞれのプロセッサ・コア7、8、9、10について呼び出しスタックを分析する。
【0066】
ソース・コード・プリプロセッサ20が、特定のプロセッサ・コア上に特定のコードが実装されなければならないことを示すように修正されている高水準言語コンピュータ・プログラム・コードを受け取ることが上では示されている。そこで、このような修正が、以下でさらに詳しく説明される。ソース・コードに対して行われる修正は、ソース・コードが書かれているプログラミング言語に新しい概念を持ち込むようになされる。特に、ソース・コードに対する修正は、アクセラレーション・セクション(アクセラレーション・セクション内のコードが特定のプロセッサ上で実行されなければならないことを示す)、およびそれぞれについて以下でさらに詳しく説明されているコンテキスト指示(データが格納されなければならないメモリを示す)を導入するように使用されうる。
【0067】
アクセラレーション・セクションは、アクセラレータ・コア8、9、10のうちの1つのアクセラレータ・コア上で実行されるように指定されているコードの一セクションである。アクセラレーション・セクションは、アクセラレータ・コア上で実行されなければならないコードを示すようにキーワードを使用して示される。例えば、プログラマーは、関数内に、キーワードの後のコード(例えば、中括弧で囲まれている)がアクセラレータ・コア上で実行されなければならず、コードは複数のプロセッサ・コアを有するプロセッサ上で実行されるべきであることを示すために注釈「accelerationsection」を挿入する。利用可能なアクセラレーション・セクションには複数の型があってもよく(それぞれ関連するキーワードを有する)、これにより、プログラマーはソース・コードの特定のセクションがアクセラレータ・コア8、9、10のうちの特定の1つのアクセラレータ・コア上で実行されなければならないことを示すことが可能になる。注釈「accelerationsection」は、例としてのみ与えられており、適したものであればどのような注釈でも使用可能であることは理解されるであろう。特定の構文を使用すべきであるとする要求条件はないことも理解されるであろう。
【0068】
図4のコード例は、注釈_accelerationsection_によって識別されるアクセラレーション・セクション・コード・ブロックを含む関数exFuncを定義する。アクセラレーション・セクション・コード・ブロック内のどのコードも、アクセラレータ・プロセッサ、例えばアクセラレータ・コア8上で実行されなければならないが、アクセラレーション・セクション・コード・ブロックの外のコードは、ホスト・プロセッサ2上で実行されなければならない。
【0069】
代替的に、図5に示されているように、関数全体が、キーワードをその定義に追加することによってアクセラレータ・コアのうちの1つのアクセラレータ・コアにより実行されるものとしてマークを付けられるものとしてよい。
【0070】
図5のコードは、speedyFunctionと呼ばれる関数を定義し、マーカー_acceleratedfunction_をその定義内に含め、speedyFunction関数がアクセラレータ・コア8、9、10のうちの1つのアクセラレータ・コア上で実行されなければならないことを示す。同様にして、マーカー_unacceleratedfunction_が、特定の関数がアクセラレータ・コアのうちの1つのアクセラレータ・コア上で実行されてはならないが、その代わりにホスト・コア7上で実行されなければならないことを示すために使用されうる。
【0071】
関数のオーバーロードをサポートするプログラミング言語では、図5に示されている型の関数宣言は、_acceleratedfunction_マーカーを持たないが、他の点では同じシグネチャを有する、関数宣言と明確に区別できるものであるとしてよい。アクセラレーション・セクションの内側から関数を呼び出すことは、関数のマーク付きバージョンが呼び出されることを引き起こすが、アクセラレーション・セクションの外側から呼び出すと、その結果、_acceleratedfunction_マーカーなしで関数を呼び出すことになる。従来の関数のオーバーロードは、2つの関数定義が同じ名前を有するが、異なる関数シグネチャ(例えば、異なる数および/または型のパラメータ、または異なるポインタ修飾子(暗黙のポインタを含む))を有する場合に生じるが、ここでは、「オーバーロード」は、同じ関数シグネチャを有するが、関数が実行されなければならないプロセッサ・コアに関する異なる指示を有する2つの定義からも生じることがわかる。オーバーロードの解決は、例えば、ホスト・プログラミング言語の規則に従って実行されうるが、これらの規則によって解決できないあいまいさが生じる場合、関数は、プロセッサ・コアの指示に基づき選択されうる。
【0072】
特定のアクセラレーション・セクション内において、そのアクセラレーション・セクション内で呼び出された特定の名前付き関数は、それ自体、特定のアクセラレータ・コア上で実行されなければならないと指定することもさらに可能である。一例が、図6に示されている。ここで、コードは、関数a、b、およびcがアクセラレーション・セクション内の他のコードと同じアクセラレータ・コア上で実行されなければならないことを示す。関数a、b、およびcがアクセラレータ・コア上で実行されることを可能にするために、プログラム・パーティショニング・ツールは、以下でさらに詳しく説明されるようにアクセラレータ・プロセッサ上で実行されるように変換された関数a、b、およびcの複製を作成する。
【0073】
より詳しくは、図6のコードは、関数ポインタを引数としてとる関数fを定義する。関数f内に定義されたアクセラレーション・セクション内のコードは、関数fへの引数として与えられた関数を呼び出す。上記のように、アクセラレーション・セクションは、_accelerationsection_マーカーを使用してマークされ、アクセラレーション・セクションの内側のコードがアクセラレータ・コア上で実行されることを示す。しかし、ここでは、_accelerationsection_マーカーは、関数a、b、cのどれかがアクセラレーション・セクション内のコードによって呼び出される場合、これらはアクセラレーション・セクション内のコードと同じアクセラレータ・コア上で実行されなければならないことをさらに指定する。したがって、関数a、b、cのうちの1つが関数fに与えられた引数によって指示される場合、受け渡された関数が、アクセラレーション・セクション内の他のコードと同じアクセラレータ・コア上で実行される。
【0074】
アクセラレーション・セクションは、アクセラレーション・セクションが別の(子)アクセラレーション・セクションを囲むことができるように入れ子にされうる。それぞれのアクセラレーション・セクションは、データ・アイテムがアクセスされ、関数が呼び出される、コンテキスト・レベルを定義する。それぞれのコンテキストは、レベル・インデックスなどの割り当てられた識別子によって識別されうる。例えば、外側レベル・コンテキストにはレベル・インデックス0を割り当てることができ、外側コンテキスト・レベルは主コンテキスト・レベルであり、外側コンテキスト・レベル内のコードは、ホスト・コア7によって処理される。第1のアクセラレーション・セクションは、第2のコンテキスト・レベルを定義し、これにコンテキスト・レベル・インデックス1を割り当てることが可能である。第1のアクセラレーション・セクション内のさらなるアクセラレーション・セクションは、第3のコンテキスト・レベルを定義し、これにコンテキスト・レベル・インデックス2を割り当てることが可能であり、これ以降同様に割り当てることが可能である。それぞれのコンテキスト・レベルは、アクセラレータ・コア8、9、10のうちの異なる各1つのアクセラレータ・コアによる処理および実行のためのソース・コードを含むことができる。
【0075】
先行する記述は、アクセラレータ・コア8、9、10のうちの特定の1つのアクセラレータ・コア上での実行に関してコードのセクションをコードがどのように識別することができるかを説明している。次に、データ・アクセスがどのように取り扱われなければならないかを示すために使用される方法が説明される。
【0076】
メモリ・アクセス・セマンティクスが、メモリ・アクセスが処理されなければならない方法を定義する。多くのシステムにおいて、データ・アイテムがRAMから読み出されるときにはデータ・アイテムがローカル・メモリ(例えば、レジスタもしくはオンチップ・キャッシュ)にコピーされること、およびデータ・アイテムが書き込まれるときにはRAMに書き込まれることを指定する単一のメモリ・アクセス・セマンティクスがある。しかし、並列システムおよびマルチ・コア・プロセッサでは、さらなるメモリ・アクセス・セマンティクスを導入してメモリ・アクセスが処理されなければならない異なる方法を指定することが望ましい場合がある。
【0077】
コンピュータ・プログラムが複数のプロセッサ・コアにまたがって実行される場合、特定のプロセッサ・コア上で実行されるコードに対してプライベートのものであるデータと複数のプロセッサ・コア上で実行されるコード間で共有されるデータとが区別されうる。したがって、マルチ・コア・プロセッサ上で実行されることが意図されているコンピュータ・プログラム・コードでは、ソース・コードにおいて、それぞれのデータ・アクセス・オペレーションについて、アクセスされるデータがプライベートであるかまたは共有であるかを指定することが有用である。
【0078】
例えば、プログラミング言語は、プライベート・データおよび共有データを表すために限定子を備えていることがある。変数は、プライベート限定子および共有限定子を使って注釈を付けられ、それらの変数が共有であるかプライベートであるかを示し、ポインタ型も、これらのポインタがプライベートまたは共有データを指し示すかどうかを指定するように限定することもできる。例えば、プログラマーは、変数が
_shared_ int sharedVariable;
_private int privateVariable;
のように共有またはプライベート・メモリ内に格納されなければならないことを指示することができる。
【0079】
ただし、変数sharedVariableは、複数のプロセッサ・コア上で実行されているプログラム・コードの間で共有され、変数privateVariableは、特定の1つのプロセッサ・コアに対してプライベートである。
【0080】
同様に、ポインタは、
_shared_ int *sharedDataPointer;
_private_ int *privateDataPointer;
のように共有またはプライベート・メモリを指しているものとしてマークされうる。
【0081】
ここで、整数ポインタsharedDataPointerは共有メモリを指しているが、整数ポインタ変数privateDataPointerは特定の1つのプロセッサ・コアに対してプライベートであるメモリを指している。
【0082】
データ・アイテムは、異なるアクセラレーション・セクション・コンテキスト・レベルにおいて宣言され、コンテキスト・レベルにまたがってアクセスされうる。上記からの仮説的表記を使用して、一例が図7に示されている。
【0083】
図7のコード例は、整数データ・アイテムoutervalが宣言され、整数データ・アイテムoutervalに値2が割り当てられている関数fを定義する。outervalが、ホスト・コンテキスト・レベルlevel 0(つまり、アクセラレーション・セクションの外側)で宣言されるので、変数outervalは、共有メモリ11内に格納される。関数f内のアクセラレーション・セクション内において、第2の整数データ・アイテムinnervalが宣言され、第2の整数データ・アイテムinnervalに値4が割り当てられる。innervalは第1のアクセラレーション・セクション・コンテキスト・レベル内で宣言されるので、データ・アイテムinnervalは、アクセラレーション・セクションが関係するアクセラレータ・プロセッサのローカル・メモリ内に格納される。例えば、アクセラレーション・セクションがアクセラレータ・コア8に関係する場合、データ・アイテムinnervalは、アクセラレータ・コア8のローカル・メモリ12に格納される。
【0084】
データ・アイテムoutervalは、アクセラレーション・セクションの内側のコードからアクセスされる。データ・アイテムが定義されているコンテキスト・レベルと異なるコンテキスト・レベルでデータ・アイテムにアクセスすることは、そのデータ・アイテムの、そのデータ・アイテムが宣言されているコンテキストからそのデータ・アイテムが必要とされるコンテキスト内への転送を引き起こす。このような転送は、アクセラレーション・セクションのコードを実行する、アクセラレータ・コア8から共有メモリ11へのダイレクト・メモリ・アクセス(DMA)要求を用いて遂行されるものとしてよい。
【0085】
それに加えて、ポインタ変数が特定のアクセラレーション・セクションのコンテキスト内にあることも理解されるであろう。
【0086】
静的ポインタ型では、プログラム・パーティショニング・ツール21が、どのコンテキスト・レベルにポインタ・ターゲットが配置されているか、またポインタが生成されるコンテキスト・レベル(つまり、ポインタ変数が宣言されているコンテキスト・レベル)を記述する情報をポインタ型(例えば、データ・アイテムのアドレスをとるとき)にアタッチする。次いで、コンパイラ22が、適切なデータ転送命令を生成することができる。
【0087】
動的ポインタ型では、コンテキスト・レベル情報はポインタ型にアタッチされず、ポインタの値にアタッチされる。次いで、ポインタの値が、実行時に検査され、どのようなコンテンツ情報がアタッチされているかに応じて、適切なデータ転送が実行される。例えば、範囲0−0x0FFF内のメモリ・アドレスは共有メモリ11に割り当てられ、範囲0x1000−0x1FFF内のアドレスはアクセラレータ・コアのうちの1つのアクセラレータ・コアのローカル・メモリに割り当てられるということが可能であるが、ただし、それぞれのプロセッサ・コアは異なるアドレス空間に割り当てられる。代替的に、コンテキスト・レベル情報(例えば、フラグの形態の)が、ポインタ値にアタッチされうる(例えば、コンテキスト・レベル情報をポインタ値の一部として表すことによって、またはポインタ値とコンテキスト・レベル情報とからなる構造体としてポインタを実装することによって)。
【0088】
アクセラレーション・セクションが入れ子になっている場合、データ・アイテムは、複数のコンテキスト・レベルにまたがってアクセスされてもよい。データが複数のコンテキスト・レベルにまたがってアクセスされる場合、データ・アイテムは、データ・アイテムが宣言されているテキスト・レベルに関連付けられているメモリからデータ・アイテムが必要とされるコンテキスト・レベルに直接転送されてもよく、ただし、そのような転送がハードウェアによってサポートされている場合に限る。代替的に、要求されたデータ・アイテムは、カスケード転送を使用して、一方のコンテキスト・レベルから次のコンテキスト・レベルへ、一時バッファを使用して転送されるものとしてよい。
【0089】
異なるコンテキスト・レベルで宣言されている変数は、異なるメモリ・アクセス・セマンティクスを介してアクセスされうる。例えば、データは、アクセラレーション・セクションの外部の既定のメモリ・アクセス・セマンティクスを使用してアクセスされることもあるが、アクセラレーション・セクション内から共有メモリ11内に格納されているデータにアクセスする場合にはソフトウェア・キャッシングが使用されるものとしてよい。つまり、共有メモリ11に格納されているデータの一部のキャッシュが保持され、アクセラレーション・セクション内のコードによって、そこからデータが読み込まれ、そこへデータが書き込まれうる。特定のアクセラレーション・セクションに対してプライベートであるデータは、既定のメモリ・アクセス・セマンティクスを使用してそのアクセラレーション・セクション内でアクセスされうる。
【0090】
ソフトウェア・キャッシングの使用は、アクセラレータ・コアがダイレクト・メモリ・アクセス技術またはメッセージ・パッシングを使用して共有メモリにアクセスすることしかできないときに有利な場合がある。
【0091】
ソフトウェア・キャッシングは、プログラムがホスト・コア7上で実行されるときにプログラムがデータにアクセスする方法と似た方法でアクセラレータ・コア上で実行されるときにプログラムが共有メモリ内のデータにアクセスすることを可能にすることができる。それに加えて、われわれの以前の特許出願(国際特許出願公開第2007/085855号)で説明されているように、メモリへのライトは、アクセラレーション・セクションの終わりまで遅延させることができ、これにより、コンパイラがアクセラレーション・セクション内の並列処理を最大化することを可能にする。
【0092】
使用されうる別のメモリ・アクセス・セマンティクスは、ソフトウェアで実装されたトランザクション・メモリに基づく。ここで、共有データへのすべてのリードが追跡され、共有メモリへのすべてのライトがキューに置かれる。ライトは、リードおよびライトの正しい順序が保持されている場合にのみ共有メモリに適用される。
【0093】
使用されうる別のメモリ・アクセス・セマンティクスは、ガーベジ・コレクション・システムに基づく。ここで、特定のコンテキスト・レベル(特定のコンテキスト・レベルが与えられたメモリ空間に関連付けられている)内のすべてのポインタは、追跡可能であるものとして指定されてよく、したがって、そのコンテキスト・レベルに関連付けられているメモリ空間がガーベジ・コレクションを施される。ガーベジ・コレクション・システムは、追跡可能なポインタのそれぞれを辿って、メモリ空間内のどのデータ要素がポインタによってメモリ空間に到達可能であるか、およびメモリ空間内のどのデータ要素がポインタによって到達可能でないかを判定することができる。到達可能でないすべてのデータ要素は、解放され、空きメモリ・プールに戻すことができる。
【0094】
アクセラレーション・セクションが同期的にまたは非同期的に実行されなければならないことを指示するためにさらなる修飾子が指定されうる。
【0095】
アクセラレーション・セクションの内側で使用されるすべてのコードは、そのアクセラレーション・セクションのコンテキスト・レベルに関連付けられているアクセラレータ・コアに対して適しているコンパイラ22によって自動的に(さらなる注釈を必要とすることなく)コンパイルされる。したがって、アクセラレーション・セクション内にそのルートを有する呼び出しグラフ全体が、アクセラレーション・セクションから(直接的にまたは間接的に)呼び出されるすべての関数を識別するために、そのアクセラレーション・セクションのコンテキスト・レベルについて処理される。異なるコンテキスト・レベルが潜在的に異なる命令セットを持つ異なるアクセラレータ・プロセッサ上にマッピングされうるので、異なるコンテキスト・レベルから呼び出される関数は、この関数が使用されるコンテキスト・レベルに関連付けられているそれぞれのアクセラレータ・コアについてコンパイルされる。
【0096】
上述の型のポインタ修飾子は、プログラマーがポインタ宣言において特定のポインタのターゲットを指定することを可能にする。これらの修飾子は、場合によっては、例えば、アクセラレーション・セクションに対して関数を処理することで異なるアクセラレーション・セクション情報を有するポインタ型の間に変換の不一致が生じるときに必要になることがある。このような変換の不一致は、以下でさらに詳しく説明される。注釈を最低限度に留めるために、プログラム・パーティショニング・ツール21は、多くの場合、注釈が付けられていない値およびポインタの型に対するコンテキスト・レベル情報を推論することができる。例えば、ポインタのコンテキスト・レベルは、そのポインタが初期化されて指す変数のコンテキスト・レベルから推論され、関数の戻り値のコンテキスト・レベルは、関数の「return」ステートメントに含まれる値から推論されうる。
【0097】
特定のコードが特定のプロセッサ・コア上で実行されなければならないことをプログラマーが指示することを可能にすること、およびデータ・アクセス・セマンティクスが指定されることを可能にすることは、プロセッサ・コアのメモリ・アクセス・セマンティクスおよび選択が場合によってはコンピュータ・プログラムにおいて優先する特定の状況により推論されうるけれども、多くの場合において、どのようなことが生じるべきかをプログラマー側で指定することができることが好ましいので有益である。したがって、プログラム・パーティショニング・ツール21は、特定のプロセッサ・コアによって、また特定のメモリ・アクセス・セマンティクスを有するデータ・アクセス・オペレーションにより、またソース・コード内に指定されたプロセッサ・コアまたはメモリ・アクセス・セマンティクスを有していない関数およびデータ・アクセス・オペレーションにより、実行されるべきソース・コードにおいて指定されている両方の関数をとる。
【0098】
次に説明されるが、プログラム・パーティショニング・ツール21は、どのプロセッサ・コアに対してどの関数がコンパイルされなければならないか、またどのデータ・アクセス・オペレーションでどのデータ・アクセス・セマンティクスが適用されなければならないかを決定するために一連の規則を適用する。確かに、上に示されているように、特定の関数が異なるコンテキストから呼び出されうるので、特定の関数が複数のプロセッサ・コア上で実行されるように、また複数のメモリ・アクセス・セマンティクスとともに、コンパイラされることが必要になる場合がある。
【0099】
例えば、プログラム内のあるポイントにおいて、関数fが、既定のデータ・アクセス・セマンティクスを有し、ホスト・コア7上で実行されるべき関数から呼び出される場合、およびプログラム内の別のポイントにおいて、関数fが、アクセラレーション・データ・アクセス・セマンティクスを持つアクセラレーション・セクションから呼び出される場合、プログラム・パーティショニング・ツール21は、関数fの2つの変換されたバージョンを生成し、第1のバージョンは既定のデータ・アクセス・セマンティクスを持つポスト・コア7に対してコンパイルされ、第2のバージョンはアクセラレータ・コア、例えば、アクセラレーション・データ・アクセス・セマンティクスを持つアクセラレータ・コア8に対してコンパイルされうる。正しいメモリ・アクセス・セマンティクスを維持するために、一組の規則がポインタおよび参照の型に適用される。関数を変換するためにプログラム・パーティショニング・ツール21によって実行される処理について、以下でさらに詳しく説明される。
【0100】
データが正しくアクセスされることを保証するために、いくつかの実施形態では、プログラム・パーティショニング・ツール21は、それぞれの異なる種類のデータ・アクセス・セマンティクスを使用してデータを読み出し、書き込むための異なるマクロを含む、一連のCマクロを出力する。異なるCマクロは、それぞれの与えられたデータ・アクセス・セマンティクスに対して正しいリードおよびライト・オペレーションを実行するように定義されるものとすることが可能である。
【0101】
それぞれの関数について、プログラム・パーティショニング・ツール21は、呼び出しサイト(つまり、関数が呼び出されるプログラム・コード内のコンテキスト)および呼び出される関数の高水準中間表現(ソース・コード・プリプロセッサ20によって生成される)を下記の基準に従って調べる。
【0102】
高水準中間表現において、関数が指定メモリ・アクセス・セマンティクスを持たないポインタ型パラメータを有する場合、および関数が呼び出されるときにポインタ引数を受け渡される場合に、変換された関数内の対応するパラメータは、呼び出しサイトで受け渡される関数引数と同じメモリ・アクセス・セマンティクスを有する。例えば、ポインタ型パラメータをとる関数が共有ポインタを受け渡される場合、変換された関数は共有ポインタ・パラメータをとる。
【0103】
高水準中間表現において、関数がメモリ・アクセス・セマンティクスが指定されていない参照型パラメータを有する場合、および呼び出しサイトで参照型引数を受け渡される場合に、変換された関数の対応するパラメータは、呼び出しサイトで受け渡される参照と同じメモリ・アクセス・セマンティクスを有する。例えば、参照型パラメータをとる関数が特定のプロセッサ・コアに対してプライベートであるメモリへの参照とともに呼び出される場合、変換された関数はプライベート参照パラメータをとる。
【0104】
変換されるべき関数内の変数が、明示的なメモリ・アクセス・セマンティクスが指定されていないポインタ型であると宣言されている場合、および変数がポインタ値に初期化される場合、変数は、初期化値のメモリ・アクセス・セマンティクスとともに生成される。複数のメモリ・セマンティクスが初期化値に適用される可能性があれば初期化時に変数にアタッチされるメモリ・アクセス・セマンティクスはない。例えば、ポインタが定数値に初期化され、その定数値が異なるメモリ領域内で有効なアドレスである場合、その値が特定のメモリへのアドレスでない限りメモリ・アクセス・セマンティクスはその変数にアタッチされないか、または定数の型(ポインタ型にアタッチされた情報)が特定のメモリ・セマンティクスを強制する。
【0105】
明示的なメモリ・アクセス・セマンティクスを持たないポインタが関数内で宣言され、変数がプライベート値を指すように初期化される場合、ポインタ変数はプライベート・ポインタに変換される。同様に、ポインタ変数がアクセラレーション・セクション内で宣言され、共有変数を指すように割り当てられた場合、ポインタは外側のポインタに変換される。
【0106】
メモリ・アクセス・セマンティクスが指定されていないポインタ型変数が、変換されるべき関数内でアクセスされるが、変換されるべき関数の外で宣言され、その関数が呼び出される前に割り当てられることも、アクセスされることもない場合、および変換されるべき関数内で、その変数がポインタ値を代入されている場合、割り当てられたポインタ値のメモリ・アクセス・セマンティクスを有する変数の複製が作成される。
【0107】
メモリ・アクセス・セマンティクスが指定されていないポインタ型変数が変換されるべき関数の参照パラメータへの引数として受け渡される場合、変換された関数の変数と参照パラメータ型の両方が、その変換された関数の内側の変数の、もしあれば、初期化からメモリ・アクセス・セマンティクスを受け取る。
【0108】
変換されるべき関数内の変数が、メモリ・アクセス・セマンティクスが指定されていない参照型であると宣言されている場合、および変数がメモリ内の特定のデータ・アイテムを参照するように初期化される場合、変数は、初期化データ・アイテムのメモリ・アクセス・セマンティクスとともに生成される(例えば、参照がプライベート・データへの参照である場合、その参照はプライベートにされる)。
【0109】
関数がreturnステートメントを含み、関数がメモリ・アクセス・セマンティクスが指定されていないポインタまたは参照を返す場合、変換された関数は、メモリ・アクセス・セマンティクスが返される値によって決定される戻り型を有する。
【0110】
関数変換の終わりにメモリ・アクセス・セマンティクスが指定されていないまま続くポインタ型については、既定のメモリ・アクセス・セマンティクスが選択されなければならない。この既定のセマンティクスは、システムの実装者によって決定されうる。
【0111】
次いで、一方のメモリ・アクセス・セマンティクスを持つポインタまたは参照から他方のメモリ・アクセス・セマンティクスを持つポインタまたは参照へのどのような変換も未定義または予想外の挙動を引き起こさないことを確認するために変換された関数が型検査される。例えば、一方のメモリ・アクセス・セマンティクスから他方のメモリ・アクセス・セマンティクスへのポインタの変換は、デスティネーション・メモリ・アクセス・セマンティクスがソース・メモリ・アクセス・セマンティクスのスーパーセットでない限り、不正になるものとしてよい。
【0112】
上述の型の変換の後、変換された関数は最適化され(必要な場合)、コンパイラ22のうち1つのコンパイラに与えられるべきターゲット・コンパイラ可読中間表現にコンパイルされる。
【0113】
(必要ならば)必要な変換は、さまざまな例を参照しつつ次に説明されるように処理されている特定の関数の性質に依存する。以下の説明では、アクセラレーション・セクション内で、限定子「_outer」は、変数が共有メモリ11内に格納されることを示し、限定子「_inner」は、変数がアクセラレーション・セクションが関係するアクセラレータ・コアのローカル・メモリ内に格納されることを示す。以下の説明で使用される限定子は、単に説明的なものにすぎず、適切な限定子があればそれが使用されうることは理解されるであろう。
【0114】
図8は、一対の値を引数としてとり、結果を返す、単純関数である、multiplyを示している。関数multiplyは大域的環境への依存性を有していないことがわかる。したがって、関数multiplyは、変換が要求されることなく関数が実行されるべきそれぞれのプロセッサ・コアに対しコンパイルされうる。
【0115】
少し複雑な事例が、図9の例に示されている。ここで、関数new_multiplyは、単一のパラメータをとり、関数に受け渡される値にグローバル変数bの値を乗じる。ここで、関数new_multiplyは、グローバル変数bへの参照がDMAを使用してアクセスされる共有メモリ11内に格納されている変数bへの参照で置き換えられた関数new_multiplyの複製を作成するように変換される。このような変換は、関数new_multiplyがホスト・コア7およびアクセラレータ・コア8、9、10のそれぞれの上で実行されることを可能にし、元の関数new_multiplyはホスト・コア7上で実行され、変換された複製はアクセラレータ・コア8、9、10上で実行される。
【0116】
アクセラレーション・セクションの内側のポインタ引数(C++における参照、PascalにおけるVARパラメータ、「this」ポインタおよび戻り値へのポインタなどの暗黙の引数などの明示的なポインタ型または暗黙のポインタ型の両方を含む)を付けて呼び出される関数は、コンパイラがその関数のコピーを生成し、コピー内のポインタ・パラメータが呼び出し内の対応する引数のコンテキスト情報を含むようにプログラム・パーティショニング・ツール21によって処理される。このプロセスは、以下でさらに詳しく説明される。
【0117】
値変数の代わりにポインタ変数をとる関数の一例が、図10に示されている。関数another_multiplyは、図8の例の場合のように、2つの値引数の代わりに、2つのポインタ引数をとる。」このような場合、関数変換は、関数を呼び出すために引数のどのような組み合わせを使用するかに応じて、元の関数の複数の変換を生成することがある。一般に、2つのポインタ引数aおよびbがあれば、変数aとbの両方が共有メモリ11内のロケーションを指す、変数aとbの両方がアクセラレータ・コア8、9、10のローカルのメモリ内のロケーションを指す、変数aが共有メモリ11を指し、変数bがアクセラレータ・コア8、9、10のローカルのメモリを指す、および変数bが共有メモリ11を指し、変数aがアクセラレータ・コア8、9、10のローカルのメモリを指す、の4つの可能性がある。そのため、使い方に応じて、関数の最大4つまでのバージョンが出力されうる。出現しないと(関数が呼び出される方法に基づき)判定されうるパラメータの組み合わせは、無視または回避されうる、つまり、関数のそれぞれの呼び出しへの引数の分析によって決定されるように、複製が要求によって駆動されうる。同じアプローチが、参照型のパラメータに適用されうる。関数の複製は、複製されたコードが、特定のアクセラレータ・コア8、9、10のローカルのメモリとは反対に、共有メモリ11を参照するように決定された引数へのアクセスのため、メモリ・リードおよびライトの代わりにDMA転送を生成することを引き起こす。
【0118】
次に、参照パラメータをとる関数が変換されうる例が、図11に示されている疑似コードを参照しつつ説明される。
【0119】
図11の行1から4は、関数funcを定義している。関数funcは、2つの整数参照パラメータをとり、第1のパラメータによって参照されている整数値に第2のパラメータによって参照されている整数値を乗じた結果を返す。funcは、整数参照をパラメータとしてとるので、これは、関数funcが作用する参照によって受け渡される実際の整数変数であり、これらの整数変数のコピーではない(例えば図8のコードの場合のように)。つまり、funcが呼び出されるときに、受け渡された変数が格納されるメモリ内のロケーションにアクセスする必要がある。
【0120】
主関数(行5から16)において、アクセラレーション・セクションは、行9でaccelerationsectionマーカーで定義される。アクセラレーション・セクション・マーカーは、主関数のコードを2つのテキスト・レベル、つまり、アクセラレーション・セクション内のコードとアクセラレーション・セクションの外側のコードとに分割する。アクセラレーション・セクションの外側のコードは、ホスト・コア7によって処理されるべきであるが、アクセラレーション・セクションの内側のコードは、例えば、アクセラレータ・コア8によって処理されるべきである。
【0121】
アクセラレーション・セクションの外側において、行7で、整数変数aが定義され、値2を割り当てられる。整数aは、アクセラレーション・セクションの外側で定義されるので、共有メモリ11内に格納される。
【0122】
アクセラレーション・セクション内では、行11で、整数変数bが定義され、値3を割り当てられる。整数bは、アクセラレーション・セクション内で定義されるので、アクセラレータ・コア8のローカル・メモリ12内に格納される。
【0123】
アクセラレーション・セクション内では、関数funcは、3度呼び出され、呼び出されるたび毎に、変数aおよびbの異なる組み合わせをパラメータとして受け渡される。
【0124】
行12で、funcが呼び出され、第1のパラメータとして変数a、および第2のパラメータとして変数bを受け渡される。行12のコメント(//によって表される)は、関数funcがこの場合にどのように変換されるかを示している。関数は、第1のパラメータの前にマーカー_outerが付けられるように変換される。マーカー_outerは、第1のパラメータがアクセラレーション・セクションの外側で定義されている整数への参照、つまり、共有メモリ11内に格納されることを示す。第2のパラメータは、整数bが関数funcへの呼び出しと同じコンテキスト、つまり、アクセラレーション・セクションのコンテキスト内で定義されるので無変化である。
【0125】
行13で、funcが呼び出され、第1のパラメータとして変数b、および第2のパラメータとして変数aを受け渡される。行13のコメントは、関数funcがこの場合にどのように変換されるかを示している。関数は、第2のパラメータの前にマーカー_outerが付けられるように変換される。第1のパラメータは、整数bが関数funcへの呼び出しと同じコンテキスト、つまり、アクセラレーション・セクションのコンテキスト内にあるので無変化である。
【0126】
行14で、funcが呼び出され、変数bをその第1および第2の引数として受け渡される。行14のコメントは、この場合に、第1および第2のパラメータの両方が、整数bが関数funcへの呼び出しと同じコンテキスト内にあるため無変化であることを示している。
【0127】
行8で、アクセラレーション・セクションの外側において、関数funcが呼び出され、変数aをその第1および第2の引数として受け渡される。この場合、関数funcは、アクセラレーション・セッションの外側で呼び出されるため、パラメータへの変換は不要である。
【0128】
前記の例から、アクセラレーション・セクション・レベルが1つである(つまり、入れ子になったアクセラレーション・セクション・レベルがない)プログラムでは、データ・アイテムは、アクセラレーション・セクション(レベル1)の内側で、またはホスト・レベル(レベル0)で定義されうることがわかる。示されているように、2つのポインタ型パラメータを持つ関数では、関数が呼び出されうるポインタ型引数の4つの異なる組み合わせ、つまり、(レベル0,レベル0)、(レベル0,レベル1)、(レベル1,レベル0)、(レベル1,レベル1)を取り扱うために最大4つまでのコピーが必要であり、それぞれの組は関数に受け渡される引数のアクセラレーション・セクション・コンテキスト・レベルを示す。
【0129】
別の例が、図12に示されている。findMin関数は、そのポインタ・パラメータintListを通じてfindMinに受け渡される整数値のリストで最小の整数値を返す。
【0130】
図12の主関数のアクセラレーション・セクション内で、関数findMinは、最初に、図12のソース・コード内でグローバル変数として宣言されている共有メモリ11内に保持されている配列arrayOflntegersを付けて呼び出される。したがって、プログラム・パーティショニング・ツール21は、外部ポインタ(つまり、共有メモリ11へのポインタ)をその引数として受け付けるfindMinの変換された複製バージョンを作成する。型推論がない場合、コンパイラは、共有メモリ11をターゲットとする外部ポインタ(intList+1)を内部ポインタp(findMin関数内で宣言されている)に割り当てようと試みる入力プログラムを拒絶し、したがって、メソッド複製の試みは失敗することになる。型推論がある場合、forループ内の外部ポインタへのpの初期化は、変数pを_outer限定子と自動的に関連付けることによって有効にされる。したがって、外側限定子_outer限定子の自動伝搬が与えられた場合、ソース・コードへの大幅な変更を実行する必要はない。メソッドの本体内の明示的な_outer限定子の追加があれば、プログラマーがfindMinのオーバーロードを生成し、そのパラメータとして与えられるローカル・ポインタ・パラメータの場合(関数findMinが配列IocalArrayOflntegersを付けて呼び出されるときに生じるような)を取り扱う必要がある。対照的に、_outer限定子の推論は、プログラム・パーティショニング・ツールが必要に応じて適切なオーバーロードを生成することを可能にする。
【0131】
アクセラレーション・セクションの外側で宣言されたポインタは、常に、ホストの共有メモリ11内のデータを指している。このようなポインタは、_outer限定子を自動的に与えられる。内部ポインタと外部ポインタとの間の割り当てを許可しないことで、ホスト/アクセラレータ境界をまたがる、有益なある程度の型検査が行われる。例えば、アクセラレーション・セクション内で、内部ポインタを外部ポインタに(またはその逆に)割り当てると、その結果、コンパイル時エラーが発生する。この強い型検査は、行われないと一方のメモリ(例えば、共有メモリ11)内のロケーションへのポインタが他方のメモリ(例えば、アクセラレータ・コア8、9、10のメモリ12、13、14のうちの1つのメモリ)内のロケーションに設定されている場合に生じるであろう混乱を防ぐ。とは言っても、一方のメモリ内の特定のメモリ・ロケーションの内容を異なるメモリ内のロケーションに割り当てることが可能でなければならない。これは、図13を見ると最もよくわかる。ここで、float型のグローバル変数xは、行1で宣言されている。主関数(行2から13)のアクセラレーション・セクション内で、float型の値へのポインタpは、行6で_outer限定子とともに定義され、ポインタは共有メモリ11内の値を参照する。ポインタpは、変数xを格納するメモリ・ロケーションを指すように初期化される。
【0132】
行7で、さらなる変数が定義される。変数aは、限定子を持たず、したがって、アクセラレーション・セクションの内部変数である。変数aは、変数pによって示されているロケーション、つまり、共有メモリ11内のロケーションに格納されている値を割り当てられる。この割り当てを達成するために、共有メモリ11からの値が、ダイレクト・メモリ・アクセスによって読み出される。
【0133】
行8で、値1.0が、ポインタpによって示されるロケーションに格納される。ポインタpが共有メモリを指しているとすると、割り当ては、ダイレクト・メモリ・アクセスを使用して共有メモリ11にデータを書き込むことを伴う。
【0134】
類似のオペレーションが、行9および10に見られる。行9で、float型の変数が定義され、値xに初期化される。xが共有メモリ11内に格納されているとすると、このコマンドは、ダイレクト・メモリ・アクセスを使用する。同様に、変数xが値bに設定されている場合、リダイレクト・メモリ・アクセスのライト・コマンドが使用される。
【0135】
行11の命令は、ポインタpが変数aのアドレスを指すようにしようとする。変数a(行7で宣言されている)は内部変数であり、したがって行11で試みられた割り当ては不正であることが思い出される。したがって、行11の命令は、プログラム・パーティショニング・ツール21によってエラーとして識別される。
【0136】
メソッド複製を大きな例に適用する場合、いくつかの場合において_outer限定子が自動的に適用されるように型システムを設計すると都合がよい。_outerがプログラマーによって省かれ自動的に適用されうる2つのコンテキストが、初期化とキャストとにある。つまり、宣言およびキャストにおいて_outer限定子を使用する必要はないということである。これは、プログラマーによって必要とされる手作業のソース・コード注釈作成の量が低減されるため、既存のソース・コードが本明細書で説明されているメソッド内で使用されるように修正されている場合に特に有用である。
【0137】
初期化の場合を最初に考えると、図14に示されているソース・コードのフラグメンツを参照しつつ一例が提示されている。ここで、ポインタ変数xは、アクセラレーション・セクションの外側にあると宣言される。アクセラレーション・セクション内では、ポインタ変数zが宣言される。既定では、ポインタzは内部ポインタとなるが、ここでは、_outer限定子は、ポインタ変数zが共有メモリを指すことを示すために明示的に使用されることがわかる。したがって、ポインタzは、ポインタxに有効になるように割り当てられうる。
【0138】
ポインタ変数z2は、_outer限定子なしで宣言される。しかし、その宣言は、ポインタxへの初期化を含む。ポインタxが外部ポインタであるとすると、プログラム・パーティショニング・ツール21によって、ポインタz2は外部ポインタでもあることが推論され、またそれに応じて作成されうる。
【0139】
次に、キャストに基づく一例が、図15を参照しつつ説明される。ここで、型T1のグローバル・ポインタ変数gが宣言されている。主関数のアクセラレーション・セクション内で、外部ポインタ変数であることが明示的に示される型T2のポインタ変数varが宣言される。ポインタ変数varは、型T2となるようにキャストされる、グローバル・ポインタ変数gの値を割り当てられている。キャストがアクセラレーション・セクション内にあるとすれば、その結果、既定により、内部ポインタが作成される。しかし、キャストされている値(つまり、g)は外部ポインタであるため、キャスト・オペレーションの結果は、外部ポインタであると自動的に推論される。
【0140】
図16は、さらなる一例を示している。ここで、関数reinterpretIntにパラメータとして受け渡された、整数値へのポインタiは、flot型の値へのポインタとなるようにキャストされ、キャスト・オペレーションの結果によって示されるアドレスに格納されている値が、この関数によって返される。ここで、キャスト・オペレーションによって生成されたポインタは、ポインタiが内部ポインタであるか外部ポインタであるかに応じて内部ポインタまたは外部ポインタであると判定される。
【0141】
上で示されている内部および外部限定子は、メモリ空間の、レベル0とレベル1の二元分類を表している。構文は、任意の数のレベルへのポインタ型の表現が可能になるようになされている。ポインタ型は、declspec(_setmemorylevel(level))などの構成体を使用して宣言されるものとしてよく、ただし、levelは例えば、ローカル・ポインタには値1、外部ポインタには値0を有することができるアクセラレーション・セクション・ブロック・レベルである。2以上のレベルに対する値は、入れ子になったアクセラレーション・セクションを示す。したがって、限定子_declspec(_setmemorylevel_(0))は_outerと同等であることがわかる。declspecの使用は、アクセラレータ・ローカル・ポインタ型がローカル・ポインタ型を持つ構造体メンバを明示的に宣言するために構造体宣言の内側で有用な場合があるアクセラレーション・セクション・ブロックの外側で宣言されることを可能にする。
【0142】
C++、Java、またはC#などのオブジェクト指向プログラミング言語でソフトウェアを書くことが望ましい場合が多い。例えば、図17の疑似コードにおいて、オブジェクト型(多くのオブジェクト指向言語ではクラスと呼ばれる)が名前MyObjectで定義される。getIncrementedFieldと呼ばれるメソッドが、MyObjectのデータ・アイテムfieldを読み出し、その値をインクリメントし、インクリメントされた値を返すMyObjectについて定義されている。
【0143】
特定のプロセッサ・コアに対してプライベートであるデータおよびプロセッサ・コア間で共有されるデータを考慮するようにオブジェクト指向プログラミング言語で書かれているソフトウェアを適応させる場合、プライベートであるオブジェクトおよび共有されているオブジェクトに対してそれぞれのメソッドを実装することが必要である。図17に示されている例では、これは、メソッドが作用するオブジェクトがプライベートであるか、または共有されているかを示す指定子とともに、getIncrementedField()メソッドを2回またはそれ以上の回数だけ書くことを必要とする場合がある。例えば、図17の疑似コードは、プログラム・パーティショニング・ツール21によって図18に示されている疑似コードを生成するように修正されうる。この方法で、MyObjectのインスタンスがアクセラレーション・セクション内でインスタンス化される場合、_private指定子を含むメソッドが使用されるが、MyObjectのインスタンスがアクセラレーション・セクションの外側でインスタンス化される場合、_shared指定子を含むメソッドが使用される。
【0144】
本発明の実施形態が、C++またはC#などのプログラミング言語で書かれているコンピュータ・プログラムを処理するように実装される場合、new、new[]、delete、delete[]演算子のアクセラレーション・セクション・バージョンは、アウター・クオリファイド・バージョンでオーバーロードされうる。これは、開発者が共有メモリに関連付けられているヒート・データからアクセラレータ・コアのローカルのメモリに関連付けられているヒープ・データを別々に管理することを可能にする。
【0145】
オーバーロードの解決は、共有メモリに関連付けられているdelete演算子のあるバージョンが_outerで限定されたポインタ上で呼び出されることを保証することができる。newの外部バージョンが呼び出される場合、_outer修飾子がnewキーワードの後に自動的に付加され、これにより、共有メモリ内に関連するオブジェクトを作成することになる。
【0146】
いくつかの場合において、new演算子の正しいバージョンが演算子に与えられるパラメータとより具体的にはそれらのパラメータが内部パラメータであるか外部パラメータであるかとに基づき推論されうるので、new演算子への呼び出しがnew演算子の外部バージョンを明示的に呼び出す必要はない。
【0147】
いくつかの場合において、両方の関数シグネチャが戻り型の点でのみ異なるので既定のアクセラレーション・セクションのnew演算子は既定のアクセラレーション・セクションの外部new演算子でオーバーロードされえないことを意味するオーバーロード規則が適用されうる。
【0148】
オブジェクト指向クラスに関する上述の問題は、型定義、例えば、structにも当てはまる。既定では、型定義内で定義されたポインタ、例えばC流の言語のtypedefステートメントで定義されたポインタは、共有メモリ11への外部ポインタである。このことは、そのような型定義が、ホスト・コア7とアクセラレータ・コア8、9、10の両方で実行されるコードによって使用できることを保証する。とは言っても、内部ポインタを有する型の定義を可能にすることは有益であり、したがって、そのような型はアクセラレータ・コア8、9、10のうちの1つのアクセラレータ・コア上で実行されるときにより効率的に使用されうる。内部ポインタの使用を有効にするために、型定義が複製され、これにより、外部ポインタを使用するバージョンと内部ポインタを使用するバージョンを備えることができる。型定義のそのような複製の結果、関数が複製され、これにより、外部ポインタを使用する型定義と内部ポインタを使用する型定義の両方で動作しうる、特定の関数のバージョンを構成することができることは理解されるであろう。
【0149】
関数ポインタまたは仮想メソッドでは、システムのユーザーは、複製されるべき一組の関数内に特定の関数が含まれなければならないことを指定する必要がある場合がある。代替的に、プログラム・パーティショニング・ツール21は、全体的なプログラム分析を使用してこの一組の関数を決定することができる。ビルド・ツール23は、システム内のそれぞれのプロセッサ・コアに対して正しいコンパイラ22およびリンカーを呼び出し、それぞれのアクセラレーション・セクションまたはデータ・オブジェクトに対する正しいメモリ・アクセス・セマンティクスに対し正しいランタイム・システムをリンクする。
【0150】
変換された関数を含む関数集合への参照としてプレースホルダ・システムを使用してリンク時まで複製されるべき一組の関数の指定を遅延させることが可能である。プレースホルダ・シンボルが表す一組の関数が、別のロケーションで定義され、別のコンパイル単位(つまり、コードの別々にコンパイルされたブロック)内に置かれる可能性がある。リンク時に、複製されるべき最終的な一組の関数が、他のコンパイル単位からの定義による指定に含まれるプレースホルダ・シンボルを解決することによってビルドされる。プレースホルダ・シンボルが複数回定義される場合、その最終的な一組の関数は、これらの定義の合併集合となりうる。プレースホルダ・シンボルが関数集合内に指定されているが、どのコンパイル単位にも定義されていない場合、ビルド・ツールは該当するエラーを発生させる。
【0151】
ビルド・ツール23は、関数が、最後のコンパイル以降に修正されている場合にのみ再コンパイルされるように保証することができ、これにより、修正後にプログラムを再コンパイルするのに要する時間を短縮する。
【0152】
関数が変換された後、関数は、他の同等の呼び出しサイト(例えば、同じコンテキスト・レベル内の同じ関数への呼び出し)から呼び出されるために利用可能である。したがって、すでに変換されている関数は、可能ならば、関数の不要な再変換を回避するために使用される。関数変換ツールは、内部ストア内にこれらのすでに変換されている関数を格納する必要がある。
【0153】
上述のメソッドが適用されるコンピュータ・プログラムは、複数のソース・コード・ファイル(コンパイル単位と称される)として出現することがあり、またこれらのファイルのそれぞれは個別に処理されうる。したがって、第1のソース・コード・ファイル内のアクセラレーション・セクションの内側で呼び出される関数は、異なる第2のソース・コード・ファイルにおいて定義されうる。関数が第2のソース・コード・ファイル内のアクセラレーション・セクション内から呼び出されない場合、プログラム・パーティショニング・ツールは、第2のソース・コード・ファイルを処理するときに、特定のアクセラレータ・コアに対して関数がコンパイルされなければならないと判定することができない。この結果、アクセラレータ・セクション内から関数の呼び出しが試みられるとリンク・エラーが発生しうる。これを回避するために、関数属性_duplicateが、必要ならば関数の複製を明示的にトリガーするために使用される。つまり、関数は、適切なアクセラレータ・コアに対してあるバージョンの関数がコンパイルされることを保証するために複製属性で限定されうるということである。
【0154】
複製属性は、コンパイラが複製を生成する関数シグネチャを指定するオプションの引数を有する。_duplicateへのパラメータがない場合、元の関数のシグネチャに含まれうるポインタおよび参照の型は、アクセラレーション・セクションの複製関数におけるローカル・ポインタ/参照型となり、上で説明されているように、ときには、内部変数と外部変数の組み合わせを使用して演算可能な特定の関数のバージョンを備えることが有益である。
【0155】
図19は、高水準の、関数の明示的関数複製を使用してプログラムのコンパイルのためのアルゴリズムを示す流れ図である。以下の説明では、「コンパイル単位」という用語は、個別に処理されたソース・コードを示すために使用される。
【0156】
ステップS1で、コンパイルされるべき一組のコンパイル単位内のコンパイル単位が選択される。ステップS2で、選択されたコンパイル単位内の関数が選択される。ステップS3で、選択された関数が、例えば図5に示されている関数speedyFunctionなどのアクセラレーション関数であるかどうかが判定される。選択された関数がアクセラレーション関数ではないと判定された場合、処理はステップS4に進み、そこで、選択された関数がどれかのアクセラレーション・セクションを含むかどうかが判定される。ステップS4で、選択された関数が1つまたは複数のアクセラレーション・セクションを含むと判定された場合、処理はステップS5に進み、そこで、選択された関数内のアクセラレーション・セクションが選択される。
【0157】
処理はステップS5からステップS6に進み、そこで、選択されたアクセラレーション・セクション内のコードによって呼び出される関数に対して呼び出しグラフが構築される。次いで、処理はステップS7に進み、そこで、呼び出しグラフ内に指示されている関数のそれぞれが、アクセラレーション・セクションが関連付けられているアクセラレータ・コア8、9、10上で実行されるようにコンパイルされる。ステップS7から、処理はステップS8へ進み、そこで、アクセラレーション・セクションの本体が適切なアクセラレータ・コア8、9、10上で実行されるようにコンパイルされる。
【0158】
次いで、処理はステップS9に進み、そこで、選択されたアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションであるかどうかが判定される。選択されたアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションではないと判定された場合、処理はステップS5に戻り、選択された関数内の次のアクセラレーション・セクションが選択される。
【0159】
その一方で、ステップS9で、選択されたアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションであると判定された場合、処理はステップS10に進み、そこで、選択された関数内の残りのコード(つまり、アクセラレーション・セクション内にないコード)が、ホスト・プロセッサ7上で実行されるようにコンパイルされる。
【0160】
ステップS10から処理がステップS11に進み、そこで、選択された関数が現在選択されているコンパイル単位内の最後の関数であるかどうかが判定される。選択された関数が現在選択されているコンパイル単位内の最後の関数ではないと判定された場合、処理はステップS2に戻り、現在選択されているコンパイル単位内の次の関数が選択される。
【0161】
その一方で、ステップS11で、選択された関数が現在選択されているコンパイル単位内の最後の関数であると判定された場合、処理はステップS12に進み、そこで、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であるかどうかが判定される。現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位でないと判定された場合、処理はステップS1に戻り、コンパイルされるべき次のコンパイル単位が選択される。その一方で、ステップS12において、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であると判定された場合、処理はステップS13で終了する。
【0162】
ステップS3で、選択された関数がアクセラレーション関数であると判定された場合、処理はステップS14に進み、そこで、選択された関数がアクセラレータ・コア8、9、10のうちの適切な1つのアクセラレータ・コア上で実行されるようにコンパイルされる。処理はステップS14からステップS11に進む。
【0163】
ステップS4で、選択された関数がどのアクセラレーション関数も含まないと判定された場合、処理はステップS15に進み、そこで、選択された関数がホスト・プロセッサ7上で実行されるようにコンパイルされる。処理はステップS15からステップS16に進み、そこで、選択された関数が例えば上述の_duplicate修飾子を使用して関数複製に関して明示的に注釈を入れられるかどうかが判定される。選択された関数が複製に関して注釈を入れられないと判定された場合、処理はステップS16からステップS11に進む。その一方で、ステップS16で、関数が複製に関して注釈を入れられると判定された場合、処理はステップS17に進み、選択された関数がアクセラレータ・プロセッサ上で実行されるようにコンパイルされる。処理はステップS17からステップS11に進む。
【0164】
図19を参照しつつ上で説明されているメソッドでは、関数がアクセラレーション・セクションを有せず、それ自体アクセラレーション関数でないと判定された場合にのみ_duplicate修飾子を使用することは理解されるであろう。関数がアクセラレーション関数である場合に複製修飾子を使用するために説明されているメソッドに修正を加えることができることは理解されるであろうが、代替的アクセラレータ・コア上で実行されるように関数をコンパイルすることによって関数を複製することが望ましい。
【0165】
上で図19を参照しつつ説明されている処理は、コンパイル・プロセスにおけるコンパイル単位の独立性を取り扱い、アクセラレータ・プロセッサ上で実行されなければならないコードのセクションがアクセラレータ・プロセッサ上で実行されるように正しく変換されることを保証する。コンパイル単位の独立したコンパイルが行われるとした場合、複製は、複製修飾子を使用する注釈を介したプログラマーの明示的な命令を除き翻訳単位の境界をまたがない。
【0166】
複製について関数に注釈を入れる必要性を回避する複製のアプローチは、コンパイラが、特定のコンパイル単位のコンパイル時に、未解決の複製関数、つまり、本体が現在のコンパイル単位内にない複製を必要とする関数を識別し、非ローカル関数の必要な複製を生成するために依存関係を再コンパイルすることができる場合に達成される。図20は、異なるコンパイル単位内の関数を識別し、再コンパイルするために実行される処理を示す流れ図である。
【0167】
ステップS25で、コンパイルされるべき一組のコンパイル単位内のコンパイル単位が選択される。ステップS26で、選択されたコンパイル単位内の関数が選択される。ステップS27で、選択された関数がアクセラレーション関数であるかどうかが判定される。選択された関数がアクセラレーション関数ではないと判定された場合、処理はステップS28に進み、そこで、選択された関数がどれかのアクセラレーション・セクションを含むかどうかが判定される。ステップS28で、選択された関数が1つまたは複数のアクセラレーション・セクションを含むと判定された場合、処理はステップS29に進み、そこで、選択された関数内の第1のアクセラレーション・セクションが選択される。
【0168】
処理はステップS29からステップS30に進み、そこで、選択されたアクセラレーション・セクション内のコードによって呼び出される関数に対して呼び出しグラフが構築される。次いで、処理はステップS31に進み、そこで、ステップS31で作成された呼び出しグラフ内の関数が選択される。次いで、処理はステップS32に進み、そこで、ステップS31で選択された関数が現在のコンパイル単位の一部であるかどうかが判定される。ステップS31のグラフで選択された関数が現在のコンパイル単位の一部であると判定された場合、処理はステップS33に進み、そこで、ステップS31で選択された関数がアクセラレータ・コア8、9、10のうちの適切な1つのアクセラレータ・コアに対してにコンパイルされる。処理はステップS33からステップS34に進み、そこで、選択された関数が呼び出しグラフ内の最後の関数であるかどうかが判定される。選択された関数が呼び出しグラフ内の最後の関数ではないと判定された場合、処理はステップS31に戻り、呼び出しグラフ内の次の関数が選択される。
【0169】
ステップS32で、呼び出しグラフから選択された関数が、現在のコンパイル単位内にないと判定された場合、処理はステップS35に進み、そこで、ステップS31で選択された関数を含むコンパイル単位が決定され選択される。処理はステップS35からステップS36に進み、そこで、ステップS31で選択された関数がステップS35で選択されたコンパイル単位内から選択される。次いで、処理はステップS37に進み、ステップS31で選択された関数がアクセラレーション・プロセッサ8、9、10上で実行されるようにコンパイルされる。処理はステップS37からステップS34に進む。
【0170】
ステップS34で、ステップS31で選択された関数が呼び出しグラフ内の最後の関数であると判定された場合、処理はステップS38に進み、そこで、選択されたアクセラレーション・セクションの本体がアクセラレータ・コア8、9、10のうちの適切な1つのアクセラレータ・コア上で実行されるようにコンパイルされる。
【0171】
次いで、処理はステップS38からステップS39に進み、そこで、現在選択されているアクセラレーション・セクション(ステップS29で選択された)が現在選択されている関数(ステップS26で選択された)内の最後のアクセラレーション・セクションであるかどうかが判定される。現在選択されているアクセラレーション・セクションが現在選択されている関数内の最後のアクセラレーション・セクションではないと判定された場合、処理はステップS29に戻り、次のアクセラレーション・セクションが選択される。その一方で、ステップS39で、現在のアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションであると判定された場合、処理はステップS40に進み、そこで、選択された関数内の残りのコード(つまり、アクセラレーション・セクション内にないコード)が、ホスト・プロセッサ7上で実行されるようにコンパイルされる。
【0172】
ステップS40から処理がステップS41に進み、そこで、選択された関数が現在選択されているコンパイル単位内の最後の関数であるかどうかが判定される。選択された関数が現在選択されているコンパイル単位内の最後の関数ではないと判定された場合、処理はステップS26に進み、現在選択されているコンパイル単位内の次の関数が選択される。
【0173】
その一方で、ステップS41で、選択された関数が現在選択されているコンパイル単位内の最後の関数であると判定された場合、処理はステップS42に進み、そこで、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であるかどうかが判定される。現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位でないと判定された場合、処理はステップS25に進み、コンパイルされるべき次のコンパイル単位が選択される。その一方で、ステップS42において、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であると判定された場合、処理はステップS43で終了する。
【0174】
ステップS27で、選択された関数がアクセラレーション関数であると判定された場合、処理はステップS44に進み、そこで、選択された関数がアクセラレータ・プロセッサ8、9、10上で実行されるようにコンパイルされる。処理はステップS44からステップS41に進む。
【0175】
ステップS28で、選択された関数がどのアクセラレーション関数も含まないと判定された場合、処理はステップS45に進み、そこで、選択された関数がホスト・プロセッサ7上で実行されるようにコンパイルされる。処理はステップS45からステップS41に進む。
【0176】
処理されているが、変換されてはいないプログラム・ソース全体の中の関数のすべてをディスクに保存することによって、関数は、必要に応じて、ただ単に単一のコンパイル単位ではなく、プログラム全体にわたって変換されうる。すでに変換されている関数およびその元ソースのストアを維持することによって、前のコンパイルで変換されていなかった、または前のコンパイル以降に変化した関数のみを変換することが可能である。
【0177】
関数がアクセラレーション・セクションから呼び出されるが、呼び出される関数のソース・コードが利用可能でない場合、関数は呼び出される関数がコンパイルされたコンテキストにおいて実行される必要がある。例えば、関数がレベル0(ホスト・レベル)についてコンパイルされ、アクセラレーション・セクション・レベル1から呼び出された場合、呼び出される関数への呼び出しは、ホスト・コア7を介してディスパッチされうる。このメカニズムは、さらに多くのアクセラレーション・セクションを生成するために使用され、これにより、アクセラレータ・コアの利用がなおいっそう改善し、ひいては並列性が向上し、消費電力がさらに低減しうる。つまり、呼び出される関数が特定のアクセラレータ・コアについてのみコンパイルされる場合、その関数は、そのアクセラレータ・コア上で、アクセラレータ・コアのうちの別の1つのアクセラレータ・コア上で実行されるコードから実行させられうる。これは、呼び出しに対する引数が関連するプロセッサ・コアへのメッセージ・パッシング・システムを介して送信される遠隔呼び出しを使用して達成されうる。
【0178】
Cell BEプロセッサなどのプロセッサにおいて、コスト・プロセス・コアが通常のメモリ・アクセス・セマンティクスを有し、アクセラレータ・プロセッサ・コアがローカル・メモリを有し、共有メモリへのDMAアクセスを行える場合、どのアクセラレーション・セクションであってもその外部にあるコードは、システムを通じて受け渡され予想通りに動作しなければならない。アクセラレーション・セクションの内側にあるコードは、アクセラレータ・コア上で実行されるように変換される関数に変換されなければならない。アクセラレータ・コア上でコードの実行を開始するために、アクセラレーション・セクションを含む関数は、変換された関数の呼び出しグラフ全体をアクセラレータ・コア上にロードするランタイム関数を呼び出し、アクセラレーション・セクションの本体を表す変換された関数を呼び出すためにアクセラレータ・プロセッサ上で関数呼び出しを発行しなければならない。これを達成するために、ビルド・ツール23は、変換される関数の呼び出しグラフを必要に応じてアクセラレータ・コア上にコピーするようになされたコードを備える。
【0179】
アクセラレーション・セクション内では、DMAなどのアクセラレータ特有の機能が使用されうる。このような機能は、型付けされていない、したがって、比較的安全でない(プログラミングの意味で)可能性があるが、プログラマーには高い性能をもたらしうる。ソース・コード・プリプロセッサは、アクセラレーション・セクション内のコードを分析することができ、DMAなどの機能がより効果的に使用されることを可能にするプログラム・コードへの手動または自動化された変更を提案するアドバイスをプログラマーに提供する。
【0180】
自動化された変更の場合、特定のデータ・アクセス・セマンティクス(例えば、ソフトウェア・キャッシング)を使用して実行されたときに不効率であるホスト・メモリ内のデータへのアクセス・パターンが検出される。そのような一アクセス・パターンは、外部ポインタ算術演算およびそのポインタ算術演算によって指示されるメモリ・ロケーションでのアクセスを使用して、ホスト・メモリ内の配列からアイテムのシーケンスを読み出すことを伴いうる。このような場合、命令のシーケンスが生成され、ポインタ算術演算およびデリファレンス・アクセスを型安全で効率的なDMAアクセスで置き換えるように入力ソース・コードを修正するようになされたツールに与えられるようにできる。
【0181】
DMA機能が使用される際に用いられる型安全なインターフェイスを構成するためにC++テンプレート・クラスが使用される。演算子オーバーロードは、コード内の外部ポインタの代わりに、適切な型パラメータでパラメータ化されている、このクラスのインスタンスを使用することを可能にする。アクセス・パターンに応じて、異なるC++テンプレートがインスタンス化されうる。このようなテンプレートは、オンデマンドでリードもしくはライトを実行するか、またはホスト・メモリからの外部配列をアクセラレータ・メモリ内にキャッシュすることができる。
【0182】
効率を改善するために使用されうる自動化されたコード修正の別の例は、アクセラレーション・セクション・ブロックのパラメータ・リストにローカル変数を追加することを伴う。
【0183】
上で説明されている型の自動化されたソース・コード修正は、都合のよいどの方法でも実装されうることは理解されるであろう。例えば、コンピュータ・プログラムは、入力として、元のソース・コードおよびソース・コード・プリプロセッサによって生成された命令のシーケンスを受け取ることができる。次いで、このようなコンピュータ・プログラムは、修正されたソース・コードを出力する。そのような修正を実行するようになされたコンピュータ・プログラムは、既存のソース・コード開発環境へのプラグインを使って都合よく形成されうる。
【0184】
図21は、本発明の一実施形態によって処理されたコードが実行されうるプロセッサ配置構成を示している。ホスト処理ユニット30は、ホスト・プロセッサ・コア31とホスト・メモリ32とを備える。ローカル・メモリ34を有するアクセラレータ・プロセッサ33は、外部バス35によってホスト処理ユニット30に接続される。アクセラレータ・コア33は、DMAコマンドを使用してホスト・メモリ32内に格納されているデータにアクセスすることができる。これを行うために、ホスト・プロセッサ・コア31は、最初に、ホスト・メモリ32内のデータ・バッファ内にデータを用意し、データ・バッファの内容はアクセラレータ・プロセッサ33によってアクセス可能である。
【0185】
このような配置構成を都合よく可能にするために、2つの入れ子になったアクセラレーション・セクションが、図22のコードに示されていうように使用されうる。ここで、コード40は、アクセラレーション・セクションの外側にあり、ホスト・プロセッサ・コア31上で実行される。第1のレベルのアクセラレーション・セクション41内のコードは、アクセラレータ・プロセッサ33からアクセス可能なデータ・バッファ内にデータをコピーするようになされている。第2のレベルのアクセラレーション・セクション42内のコードは、アクセラレータ・プロセッサ33上で実行され、ローカル・メモリ34内のデータにアクセスする内部変数を使用する。
【0186】
次に図23を参照すると、コード40がホスト・メモリ32にアクセスすることが分かる。第1のレベルのアクセラレーション・セクション41内のコードは、DMAを使用してアクセラレータ・プロセッサ33からアクセス可能なデータ・バッファを備えるホスト・メモリ32の領域43にアクセスする。第2レベルのアクセラレーション・セクション内のコードは、ローカル・メモリ34を使用する。
【0187】
図22のコードをさらに詳しく見ると、行4において、ホスト・メモリ32に格納される変数が宣言されることがわかる。行7において、第1のレベルのアクセラレーション・セクション41内で、行4で宣言された変数の値に初期化される変数が宣言されていることがわかる。行7の宣言が第1のレベルのアクセラレーション・セクション内にあるとすれば、宣言された変数は、ホスト・メモリ32の領域43内に格納される。
【0188】
第2のレベルのアクセラレーション・セクション42内では、行8でさらなる変数が宣言される。ここで、その変数は、第2のレベルのアクセラレーション・セクション内にあるため、ローカル・メモリ34内に作成される。作成された変数は、行7で作成された変数を使用して(つまり、ホスト・メモリ32の領域43からのデータを使って)初期化される。
【0189】
行11では、行7で作成された変数が行10で初期化された変数の値に等しくなるように設定される。このようにして、データはホスト・メモリ32の領域43に書き込まれる、つまり、データはDMAを使用してホスト・メモリに書き戻される。
【0190】
いくつかの実施態様では、コンパイラ22は、従来のコンパイラである。したがって、本明細書で説明されているメソッドは、そのような従来のコンパイラを使用してコンパイルすることができるコードを備える。このことを念頭に置くと、プログラム・データのサイズ、順序、アライメント、パディング、およびバイト順を含むメモリ内のデータの配置構成が重要なものとなりうる。
【0191】
本発明の実施形態を使用して処理されるソース・コードは、標準ライブラリ関数を使用することができる。ソース・コードがプロセッサ・コアのうちのどれか1つのプロセッサ・コア上で実行されうるとすると、そのようなライブラリ関数がそれぞれのプロセッサ・コア上での実行に利用可能にされることが好ましい。
【0192】
したがって、本発明の実施形態は、コンパイル時にプログラムの型に対するデータ・レイアウトの特性に関するアサーションを生成することができる。これらのアサーションは、集成体型のサイズおよびアライメント、ならびにコンポーネントのオフセットに対する静的アサーションを表す。C++のプログラム・テキストの形態をとることができる。これらのアサーションをプログラム・テキストに組み込み、従来のコンパイラを使ってコンパイルすることで、相互運用性が保証される。
【0193】
前記の説明では、アクセラレーション・セクション内の特定のコードが特定のプロセッサ・コア上で実行されることを引き起こすためにアクセラレーション・セクションがソース・コード内でどのように指定できるかを説明した。アクセラレーション・セクションが適切に取り扱われるようにするために、ソース・コードはいくつかの基本的制約条件を満たしていなければならない。例えば、ソース・コードは、ローカル・ジャンプ(例えば、goto)およびアクセラレーション・セクション境界をまたぐロング・ジャンプ・コマンドを含むことはできない。このような制約条件は、ソース・コード前処理ツール20によって強制されうる。
【0194】
前記の説明では、システムのさまざまなコンポーネント間のタスクの分離について説明しているが、上述のタスクは都合のよい任意の方法でシステムのさまざまなコンポーネント間で分離されうることは理解されるであろう。例えば、ソース・コード・プリプロセッサ20は、構文および型に関する検査を実行するものとして説明されているが、そのような検査は、代わりに、プログラム・パーティショニング・ツール21によっても実行されうる。
【0195】
前記の説明では、複数のプロセッサ・コア上でソース・コードを実行させるために特定の構成体をそのソース・コードにどのように適用できるかを説明している。入力として修正されたソース・コードをとり、説明されている構成体を取り除くプリプロセッサが用意され、これにより、ソース・コードが実行のため都合よく処理されうる。このようにして、ソース・コードの可搬性が維持される。
【0196】
本発明のさまざまな特徴が、C++風の疑似コードを参照しつつ説明されているが、本明細書で説明されている方法は、好適な任意のプログラミング言語適用されうることは理解されるであろう。したがって、前記の説明では関数への参照がなされているが、関数という用語は、オブジェクト指向の意味でのメソッドの類似の構成体、プロシージャ、およびサブルーチンを包含することが意図されていることは理解されるであろう。
【0197】
本明細書で取りあげた例では特定の修飾子およびキーワードが使用されているが、本発明の実施形態は、好適な任意の修飾子およびキーワードを使用して実装されうることも理解されるであろう。
【0198】
前記の説明においてプロセッサ・コアへの参照がなされている場合、説明されているメソッドは、コードが複数の個別のプロセッサにまたがって実行され、コードの異なる部分がプロセッサのうちの異なる1つのプロセッサによって実行される場合に使用するのに適していることは理解されるであろう。
【技術分野】
【0001】
本発明は、コンピュータ・プログラム・コードを処理するための方法に関するものであり、より具体的には複数の処理要素上で実行するためのコンピュータ・プログラムを処理するための方法に関するものである。
【背景技術】
【0002】
コンピュータは、一般的に、ユーザーによって要求されたタスクを実行できるように組み合わせて動作する複数の相互作用するコンポーネントを備える。1つのコンポーネントは、中央演算処理装置(CPU)であり、命令を実行し、コンピュータ内の他のコンポーネントにそれらのコンポーネントの指定された機能を実行させる役割を持つ。
【0003】
コンピュータは、現在では、ビジネス環境とレジャー環境とにおけるさまざまな異なるアプリケーションに広く使用されており、コンピュータの処理能力に課される要求は、高まる一方である。例えば、いくつかのビジネス・アプリケーションでは、増大している多数の複雑な情報を迅速に処理する必要性がある。レジャーアプリケーションでは、コンピュータは、娯楽目的に使用され、コンピュータ・グラフィックスの高度化に対するユーザーの期待が高まるにつれ、ユーザーの期待に応えるコンピュータ・グラフィックスを生成するために処理性能が向上することが要求される。
【0004】
一般に、単一のCPUを備えるコンピュータは、どのクロック・サイクルでも命令を1つしか実行できない。このことは、不可避的に、与えられた期間において実行されうる命令の数を制限することによってプロセッサの性能を制約する要因となる。このことを念頭に置き、一般にマルチ・コア・プロセッサと称される、複数のプロセッサ・コアを持つCPUが、コンピュータにおいて使用されてきた。マルチ・コア・プロセッサ内のそれぞれの処理コアは命令を同時に実行することができるので、複数の命令がどの時点においても実行され、このため、プロセッサの性能を改善することができる。
【0005】
したがって、マルチ・コア・プロセッサは、複数のプロセッサ・コアを使用してアプリケーションの命令を並列処理する能力を備えている。アプリケーションは、それぞれが独立したプロセッサ・コア上で実行されうる多数の個別に処理可能なタスク(しばしばスレッドと称される)に分割されうる。
【0006】
単一のアプリケーションに対して並列処理を活用するには、アプリケーションがスレッドを利用して複数のプロセッサ・コアを使用するように意図的に設計される必要がある。
【0007】
複数のプロセッサ・コアを使用するようにアプリケーションを設計することは、一般的には、複雑で困難なタスクであると考えられている。大まかに言うと、複数のプロセッサ・コアを使用するようにアプリケーションを設計する作業の複雑さおよび困難さは、使用されるプロセッサ・コアの個数とともに増大する。複数のスレッドを伴うプログラムを設計する場合には、複数のスレッドによって使用されうるデータを管理し、特定のスレッドがこれらのスレッドが依存する他のスレッドの前に実行されないことを保証することが必要になる。
【0008】
既存のプログラムでは、この問題は、複数のプロセッサ・コアを使用するようにアプリケーションを書き換え、プログラムの完全性が維持されることを保証する必要があることでいっそう悪化する。
【発明の概要】
【発明が解決しようとする課題】
【0009】
本発明の目的は、上述の問題のうちの1つまたは複数を取り除くか、または軽減することである。
【課題を解決するための手段】
【0010】
本発明の第1の態様によれば、コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理する方法が提供される。この方法は、前記処理要素のうちの特定の1つの処理要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別することと、コンピュータ・コードの前記少なくとも1つの第1の部分に関係するコンピュータ・コードの少なくとも1つのさらなる部分を識別することと、コンピュータ・プログラム・コードの前記第1の部分およびコンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの特定の1つの処理要素によって実行されることを引き起こすこととを含む。
【0011】
このような点で、コンピュータ・プログラム・コードの第1の部分が、特定の処理要素によって実行されるべきであると識別された場合、本発明の第1の態様の方法は、関係するコンピュータ・プログラム・コードも特定の処理要素によって実行されることを保証するために使用されうる。
【0012】
処理要素のそれぞれは、各型を有するものとしてよく、前記処理要素のうちの特定の1つの要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別することは、コンピュータ・プログラム・コードの少なくとも1つの第1の部分が実行されるべき特定の型の処理要素を識別することを含むものとしてよい。コンピュータ・プログラム・コードの第1の部分およびコンピュータ・プログラム・コードのさらなる部分が処理要素のうちの特定の1つの処理要素によって実行されることを引き起こすことは、コンピュータ・プログラム・コードの第1の部分およびコンピュータ・プログラム・コードのさらなる部分が特定の型を有する処理要素のうちの1つの処理要素によって実行されることを引き起こすことを含むことができる。
【0013】
複数の処理要素は、コンピュータ・プログラム・コードの第1の部分およびコンピュータ・プログラム・コードのさらなる部分が実行されるべき特定の型の処理要素であるものとしてよく、またコンピュータ・プログラム・コードの第1の部分およびコンピュータ・プログラム・コードのさらなる部分が特定の型を有する複数の処理要素のうちの1つの処理要素によって実行されることを引き起こすことは、特定の型を有する複数の処理要素のうちの1つの処理要素を選択することをさらに含むことができる。
【0014】
コンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別することは、コンピュータ・プログラム・コードの少なくとも1つの第1の部分が前記処理要素のうちの前記特定の1つの処理要素によって実行されるべきであることを示す少なくとも1つのプログラム構成体を識別することを含むことができる。つまり、この識別は、プログラマーによってコンピュータ・プログラム・コード内に挿入されたマーカーに基づくものとしてよい。これらのマーカーは、既存のコンピュータ・プログラム・コードに都合よく追加され、これにより、コンピュータ・プログラム・コードの特定の部分が特定の処理要素上で実行されなければならないことを示すように既存のコンピュータ・プログラム・コードを修正するための手段を実現することができる。
【0015】
コンピュータ・プログラム・コードの前記さらなる部分は、コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分において参照されうる。例えば、コンピュータ・プログラム・コードのさらなる部分は関数であってよく、前記関数は、コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分から呼び出されるものとしてよい。
【0016】
関数は、コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分から間接的に呼び出されるものとしてよい。例えば、コンピュータ・プログラム・コードの少なくとも1つの第1の部分内のコンピュータ・プログラム・コードのさらなる部分への参照は、コンピュータ・プログラム・コードのさらなる部分が仮想関数の特定の実装である、その仮想関数への呼び出しであってもよい。代替的に、コンピュータ・プログラム・コードの第1の部分は、関数への参照を受け取り、前記参照を受け取ったことに応答して前記関数を呼び出すようになされるものとしてもよい。例えば、コンピュータ・プログラム・コードの第1の部分は、関数への関数ポインタを受け取り、関数ポインタを受け取ったことに応答して関数を呼び出すようになされるものとしてもよい。
【0017】
第1のコンピュータ・プログラム・コードおよびさらなるコンピュータ・プログラム・コードが複数の処理要素のうちの特定の1つの処理要素によって実行されることを引き起こすことは、複数の処理要素のうちの特定の1つの処理要素に対してコンピュータ・プログラム・コードの前記第1の部分およびコンピュータ・プログラム・コードの前記さらなる部分をコンパイルすることを含むことができる。例えば、複数の処理要素のうちの異なる複数の処理要素が、異なる命令セットを有していてもよく、したがって、その引き起こすことは、コンピュータ・プログラム・コードがコンパイルされるべきターゲット命令セットを選択することを含むことができる。
【0018】
この方法は、複数の前記処理要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも1つの第2の部分を識別することと、コンピュータ・プログラム・コードの前記第2の部分が前記複数の前記処理要素によって実行されることを引き起こすことをさらに含むことができる。
【0019】
コンピュータ・プログラム・コードは、コンピュータ・プログラム・コードの第2の部分への第1および第2の参照を含むことができ、コンピュータ・プログラム・コードの前記第2の部分が前記複数の前記処理要素によって実行されることを引き起こすことは、前記コンピュータ・プログラム・コードの前記第2の部分が前記第1の参照への応答として第1の処理要素によって、また前記第2の参照への応答として第2の処理要素によって実行されることを引き起こすことを含むことができる。第1の処理要素は、処理要素が第1の参照を実行することに基づいて決定され、第2の処理要素は、処理要素が第2の参照を実行することに基づいて決定されうる。
【0020】
複数の処理要素が、複数の記憶域、例えば複数のメモリ内に格納されているデータにアクセスすることができる。前記引き起こすことは、複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分を修正することを含むことができる。
【0021】
コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを含むものとしてよく、前記修正することは、前記コンテキスト・レベルに基づき少なくとも1つのメモリ・アクセス・オペレーションを修正することを含むことができる。例えば、少なくとも1つのメモリ・アクセス・オペレーションは、メモリ・アクセス・オペレーションに関連付けられているデータ・アイテムが宣言され、メモリ・アクセス・オペレーションが実行される相対的なコンテキスト・レベルに基づき修正されうる。データ・アイテムの例は、変数および定数である。一般に、変数およびデータ・アイテムという用語は、本明細書では交換可能に使用され、メモリ・ロケーションに格納されている任意のデータを指す。
【0022】
それぞれのコンテキスト・レベルは、関連付けられている記憶域を有することができ、前記修正することは、第2のコンテキスト・レベルに関連付けられている記憶域内のデータにアクセスする第1のコンテキスト・レベルにおけるメモリ・アクセス・オペレーションを修正することを含むことができ、第2のコンテキスト・レベルは第1のコンテキスト・レベルと明確に区別される。前記修正することは、第2のコンテキスト・レベルに関連付けられている記憶域の識別子をメモリ・アクセス・オペレーションに追加することを含むことができる。
【0023】
修正することは、第2のコンテキスト・レベルに関連付けられているソフトウェア実装キャッシュにアクセスするように第1のコンテキスト・レベルにおけるメモリ・アクセス・オペレーションを修正することを含むことができる。
【0024】
修正することは、メモリ・アクセス・オペレーションがソフトウェア・トランザクション・メモリ(software transactional memory)(STM)技術を使用して実行されるようにメモリ・アクセス・オペレーションを修正することを含むことができる。
【0025】
修正することは、メモリ・アクセス・オペレーションがコンピュータ・ネットワーク上でデータ転送を使用して実行されるようにメモリ・アクセス・オペレーションを修正することを含むことができる。例えば、特定のコンテキスト・レベルに関連付けられている記憶空間は、リモートに配置されてもよく、特定のコンテキスト・レベルに関連付けられている記憶装置レベルへのアクセスは、ネットワーク上で実行されうる。
【0026】
特定のコンテキスト・レベルに関連付けられている記憶空間については、その記憶空間内に格納されているデータは、ガーベジ・コレクションなどの、自動メモリ管理を受けるものとしてよい。ガーベジ・コレクション・システムは、メモリ空間のどれかの中に割り当てられた記憶域を回収するように動作可能であるものとしてよく、そこでは、データへのポインタまたは参照は、どのようなコンテキスト・レベルにおいても保持されないと決定される。特定のコンテキスト・レベルに関連付けられているメモリ空間のうちの1つのメモリ空間は、ガーベジ・コレクションで回収されるメモリ空間として処理されてもよく、そこでは、そのコンテキスト・レベルにおけるすべてのメモリ参照は、ガーベジ・コレクションの目的のために追跡される。コンテキスト・レベル内のポインタによる到達が可能でないデータを格納するガーベジ・コレクションで回収されるメモリ空間内のどのロケーションも、他のデータを格納するために使用できるように割り当てられたデータ・プールから解放することに利用可能にされうる。
【0027】
前記コンピュータ・プログラムの前記さらなる部分は、少なくとも2回、前記コンピュータ・プログラム・コードにおいて参照され、それぞれの参照は各メモリ・アクセス・オペレーションを含むことができる。この方法は、第1の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第1の修正を作成することと、第2の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第2の修正を作成することとをさらに含むことができる。
【0028】
第1のメモリ・アクセス・オペレーションは、第1の記憶域内のデータにアクセスすることができ、第2のメモリ・アクセス・オペレーションは、第2の異なる記憶域内のデータにアクセスすることができる。
【0029】
この方法は、前記コンピュータ・プログラム・コードの前記さらなる部分の第1の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への第1の参照を処理することと、前記コンピュータ・プログラム・コードの前記さらなる部分の第2の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への第2の参照を処理することとをさらに含むことができる。
【0030】
この方法は、前記コンピュータ・プログラム・コードの前記第1の部分および前記さらなる部分のコピーを作成することをさらに含むことができ、前記引き起こすことは、複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの第1の部分のコピーおよびコンピュータ・プログラム・コードのさらなる部分のコピーを修正することを含む。
【0031】
本発明の第2の態様によれば、コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理する方法が提供され、コンピュータ・プログラム・コードは、複数のデータ・アイテムを参照し、少なくとも1つのデータ・アイテムが特定の処理要素のローカルにあるメモリ内に格納され、少なくとも別のデータ・アイテムが複数の処理要素間で共有されるメモリ内に格納される。この方法は、前記データ・アイテムのうちの第1のデータ・アイテムへの参照を含むコンピュータ・プログラム・コードの第1の部分を処理することと、前記第1のデータ・アイテムが格納されているメモリを決定することと、決定されたメモリを示すようにコンピュータ・プログラム・コードを修正することとを含む。
【0032】
このような点で、コンピュータ・プログラム・コードは、複数の異なるメモリへのコンピュータ・プログラム内の参照が適切なメモリを識別するように正しく処理されることを保証するように修正されうる。
【0033】
コンピュータ・プログラム・コードの前記第1の部分は、第1の処理要素上で実行され、前記決定することは、第1のデータ・アイテムが第1の処理要上で実行されるものとしてコンピュータ・プログラム・コードの一部において宣言されているかどうかを判定することを含むことができる。
【0034】
コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを定義することができ、前記第1のデータ・アイテムが格納されるメモリを決定することは、前記第1のデータ・アイテムが宣言されるコンテキスト・レベルを決定すること含むことができる。修正することは、前記コンピュータ・プログラム・コードの前記第1の部分が第1のデータ・アイテムが宣言されているコンテキスト・レベルと異なるコンテキスト・レベルで出現する場合、ただしその場合に限り実行されうる。
【0035】
複数のデータ・アイテムへのそれぞれの各参照は、静的ポインタであるか、または動的ポインタのいずれかであってよい。特定の参照が静的ポインタであるか、または動的ポインタであるかは、決定されたメモリを示すようにコンピュータ・プログラム・コードの修正をもたらしうる。例えば、参照が静的ポインタである場合、ポインタの型が修正され、参照が動的ポインタである場合、ポインタの値が修正されうる。
【0036】
修正は、第1のデータ・アイテムへの参照の複製を作成することと、決定されたメモリを示すように複製を修正することとを含むことができる。
【0037】
決定されたメモリを示すように複製を修正することは、決定されたメモリに関連付けられているコンテキスト・レベルを示すように複製を修正することを含むことができる。前記決定されたメモリに関連付けられているコンテキスト・レベルの指示は、コンピュータ・プログラム・コードの第1の部分が出現するコンテキスト・レベルの指示であってよい。例えば、修正することは、第1のコンピュータ・プログラム・コードが出現するコンテキスト・レベルが第1のデータ・アイテムが宣言されるコンテキスト・レベルのうちのコンテキスト・レベルの外部にあることを示すように適切なキーワードを参照に追加すること含むことができる。
【0038】
複数のデータ・アイテム内の少なくとも1つのデータ・アイテムは、関数であってもよい。したがって、データ・アイテムへの参照は、関数への参照とすることができる。関数への参照の例は、関数ポインタ、仮想メソッド、およびメンバ関数ポインタを含む。
【0039】
本発明の第3の態様によれば、複数のメモリを備えるシステム内で実行されるべきコンピュータ・プログラム・コードの構文上の、および/またはセマンティクス上の正しさを判定するための方法が提供され、この方法は、第1のポインタ・データ・アイテムを第2のポインタ・データ・アイテムの値に割り当てる第1の命令を識別することと、前記第1および第2のポインタ・データ・アイテムがそれぞれ共通メモリ内のメモリ・ロケーションを識別するかどうかを判定することと、前記第1および第2のポインタ・データ・アイテムが共通メモリ内のメモリ・ロケーションを識別しないと判定された場合に、エラーを示すこととを含む。
【0040】
本発明の第4の態様によれば、コンピュータ・プログラム・コードが複数の処理要素にまたがって実行されることを引き起こすようにコンピュータ・プログラム・コードを処理する方法が提供される。この方法は、コンピュータ・コードの少なくとも1つの部分が特定の処理要素上で実行されなければならないことを示すようにコンピュータ・プログラム・コードの少なくとも1つの部分に修飾子をアタッチすることを含む。
【0041】
処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、単一の処理要素上で実行されるようになされうる。コンピュータ・プログラム・コードは、単一の処理要素上で実行されることが意図されている少なくとも1つの制御の流れを定義することができ、前記修飾子は、単一の制御の流れの一部が別の処理要素上で実行されることを引き起こしうる。
【0042】
処理要素のそれぞれは、各型を有するものとしてよく、それらの処理要素の少なくとも2つは、異なる型を有する。処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、それぞれ同じ型を有する複数の処理要素にまたがって実行されるようになされうる。例えば、コンピュータ・プログラム・コードは、修飾子のアタッチ前に、ホモジニアス・マルチ・コアプロセッサ上で実行されるようになされるものとしてよく、修飾子のアタッチは、コンピュータ・プログラム・コードがヘテロジニアス・マルチ・コアプロセッサ上で実行されることを引き起こしうる。
【0043】
処理要素は、マルチ・コア・プロセッサのプロセッサもしくはプロセッシング・コアとすることができる。
【0044】
本発明の第5の態様によれば、コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理する方法が提供され、この方法は、前記コンピュータ・プログラム・コードの一組の部分が異なる処理要素によって実行されることを指示することを含む。この一組の部分は、その指示に基づきリンク時に決定されうる。コンピュータ・プログラム・コードのその一組の部分は、一組の関数であってもよい。コンピュータ・プログラム・コードの一組の部分の指示は、一組の関数を含むロケーションを示すプレースホルダを含んでいてもよい。次いで、プレースホルダによって示される実際の一組の関数を見つけるためにプレースホルダがリンク時に調べられ、その一組の関数が異なる処理要素によって実行されるように修正されうる。
【0045】
本発明の第6の態様によれば、コンピュータ・プログラム・コードを複数の記憶空間を備える環境内で実行するのに適したコードにするための方法が提供され、コンピュータ・プログラム・コードは、前記記憶空間のうちの1つの記憶空間への参照を含む少なくとも1つの型定義を備え、この方法は、前記記憶空間のうちの前記1つの記憶空間への前記参照を前記記憶空間のうちの別の1つの記憶空間への参照と置き換えることによって前記型定義のコピーを作成することを含む。
【0046】
この型定義は、struct型、union型、またはクラスのうちの1つを定義することができる。
【0047】
本発明の態様は、都合のよいどの方法でも実装されうることは理解されるであろう。例えば、本発明は、有形のキャリア媒体(例えば、ディスク)または無形のキャリア媒体(例えば、通信信号)であってもよい適切なキャリア媒体上で搬送されうる適切なコンピュータ・プログラムによって実装されるものとしてよい。本発明の態様は、本発明を実施するようになされているコンピュータ・プログラムを実行するプログラム可能コンピュータの形態をとりうる好適な装置を使用して実装されるものとしてもよい。
【0048】
本発明の一態様を参照しつつ説明されている本発明の特徴が、本発明の他の態様内に含まれるものとしてよいこともさらに理解されるであろう。
【0049】
次に、例えば添付図面を参照しつつ、本発明の実施形態が説明される。
【図面の簡単な説明】
【0050】
【図1】マルチ・コア・プロセッサを備えるコンピュータのコンポーネントを示す略図である。
【図2】図1のマルチ・コア・プロセッサをさらに詳しく示す略図である。
【図3A】プログラム・コードがマルチ・コア・プロセッサ上で実行されることを可能にするプログラム・コードの処理の概要を示す略図である。
【図3B】本発明の一実施形態による処理の概要を示す略図である。
【図4】本発明の一実施形態によりアクセラレーション・セクションとアクセラレーション関数を定義するように行われる修正を示すプログラム・コードの例を示す図である。
【図5】本発明の一実施形態によりアクセラレーション・セクションとアクセラレーション関数を定義するように行われる修正を示すプログラム・コードの例を示す図である。
【図6】本発明の一実施形態によりアクセラレーション・セクションとアクセラレーション関数を定義するように行われる修正を示すプログラム・コードの例を示す図である。
【図7】本発明の一実施形態による、アクセラレーション・セクションの内側のデータ・アクセスを示すプログラム・コードの一例を示す図である。
【図8】本発明の一実施形態による、処理によって変換されない関数を示すプログラム・コードの一例を示す図である。
【図9】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図10】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図11】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図12】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図13】本発明の一実施形態によるデータ・アクセスを示すプログラム・コードの一例である。
【図14】ポインタの初期化を示すプログラム・コードの一例を示す図である。
【図15】ポインタのキャストを示すプログラム・コードの一例を示す図である。
【図16】ポインタのキャストを示すプログラム・コードの一例を示す図である。
【図17】オブジェクト指向クラスを示すプログラム・コードの一例を示す図である。
【図18】本発明の一実施形態により処理される図17のプログラム・コードを示す図である。
【図19】本発明の実施形態によるプログラム・コード内に関数の複製を生成するためのそのプログラム・コードの処理を示す流れ図である。
【図20】本発明の実施形態によるプログラム・コード内に関数の複製を生成するためのそのプログラム・コードの処理を示す流れ図である。
【図21】共有メモリを有するホスト処理ユニットとバスによってホスト処理ユニットに接続されているアクセラレータ・プロセッシング・コアとを備えるコンピュータのコンポーネントを示す略図である。
【図22】図21に示されているコンポーネント上で実行されるように処理されうるプログラム・コードの一例を示す図である。
【図23】図22のプログラム・コードと図21のコンポーネントとの間の関係を示す略図である。
【発明を実施するための形態】
【0051】
図1は、コンピュータ装置の略図である。コンピュータ装置は、RAM 2の形態をとる揮発性メモリに格納されている命令を読み出して実行するようになされているプロセッサ1を備える。RAM 2は、コンピュータによって実行されるプログラム、さらにはプログラムによって使用されるデータを構成する両方の命令を格納する。コンピュータ装置は、ハード・ディスク・ドライブ3の形態の不揮発性メモリをさらに備える。コンピュータ装置は、適切な入力/出力デバイスとの通信を可能にするI/Oインターフェイス4および有線または無線手段によってコンピュータ・ネットワークとの通信を可能にするようになされたネットワーク・インターフェイス5も備える。上述のコンポーネントは、通信バス6によって1つに接続される。
【0052】
本明細書で説明されている開発は、図2を参照しつつ説明されている型のマルチ・コア・プロセッサであるプロセッサ1によるコンピュータ・プログラムの実行に関係する。図2は、1つのホスト・コア7と3つのアクセラレータ・コア8、9、10とを備えるマルチ・コア・プロセッサの概略を示している。マルチ・コア・プロセッサは、ホスト・コア7だけでなく、アクセラレータ・コア8、9、10のそれぞれによってアクセス可能である共有メモリ11をさらに備える。それに加えて、アクセラレータ・コア8、9、10のそれぞれは、各ローカルの「スクラッチ・パッド」メモリ12、13、14を有する。ホスト・コア7は、主制御処理ユニットであるが、アクセラレータ・コア8、9、10は、実行プログラムによって指定された特定の機能でホスト・コア7を支援するように割り当てられた処理ユニットである。共有メモリ11は、ホスト・コア7によって直接アクセスされうるが、アクセラレータ・コア8、9、10のそれぞれは、ダイレクト・メモリ・アクセス(DMA)を通じて共有メモリ11にアクセスすることができる。アクセラレータ・コアは、共有メモリ11内の任意のロケーションにランダムにアクセスすることができるものとしてよい。しかし、共有メモリ11へのアクセラレータ・コアのアクセスには、付加的な制約もありうる。例えば、リード・オペレーションおよびライト・オペレーションは、最小または最大のデータ・サイズに制約され、読み出されるか、または書き込まれるデータのサイズは、特定の倍数のバイト数(例えば、4、8、12、16)に制約され、アクセスされるデータは、メモリ11内でアライメントを揃えられうる(例えば、アクセラレータ・コア8、9、10は、2のべき乗の偶数倍数であるアドレスに格納されているデータにのみアクセスすることができるものとしてよい)。
【0053】
つまり、共有メモリへのアクセラレータ・コアのアクセスは、メモリへのホスト・コアのアクセスと異なるような仕方で制約されうる。
【0054】
ホスト・コア7およびアクセラレータ・コア8、9、10のそれぞれは同一ものであってもよく、この場合、プロセッサ1はホモジニアス・マルチ・コア・プロセッサと称される。代替的に、マルチ・コア・プロセッサ1は、ヘテロジニアス・マルチ・コア・プロセッサであってもよく、その場合、コア7、8、9、10は互いに異なり、例えば、アクセラレータ・コア8、9、10のそれぞれは、各異なる機能を備えていてもよい。例えば、ヘテロジニアス・マルチ・コア・プロセッサは、1つの汎用ホスト・コアと物理エンジン、シナジスティックプロセッシングエレメント、またはグラフィカル・プロセッシング・ユニット(GPU)などの多数の専用アクセラレータ・コアとを備えることができる。ヘテロジニアス・マルチ・コア・プロセッサ内の異なるアクセラレータ・コアは、異なる命令セットを使用することができ、異なるサイズのローカル・メモリ12、13、14を有することができ、異なる性能特性を有することができる。
【0055】
多くのコンピュータ・プログラムは、順次実行を意図して書かれ、また書かれてきた。このようなプログラムは、上述の、図2に示されている型のマルチ・コア・プロセッサによって実現される並列処理機能を利用することは容易にはできない。マルチ・コア・プロセッサによって実現される並列処理を活用するように、順次定義されたコンピュータ・プログラムを処理するためのシステムの概要が、図3Aおよび3Bを参照しつつ説明されている。
【0056】
ごく一般的な言い方をすると、本発明の実施形態は、コンピュータ・プログラム・コードが、処理されたコードの異なる部分が異なるプロセッサ・コア上で実行されるように処理されることを可能にするものである。プロセスの概要は、図3Bに提示されている。
【0057】
ブロック15で、特定のプロセッサ上で実行されなければならないソース・コードの少なくとも1つの指示を含むようにソース・コードに注釈が入れられる。この注釈は、人間のプログラマーによる手作業で行うことができる。ブロック16で、処理されたソース・コードの一部分が、注釈に基づいてプロセッサ・コアに割り当てられる。ブロック17で、ソース・コードのさまざまな部分が複製され、ソース・コードのこれらの複製された部分が複数のプロセッサ・コア上で実行されることを可能にする。ソース・コードの一部分の複製は、以下に詳しく説明されるが、大まかに言えば、例えば、プロセッサ、プロセッサ・コア、および/またはコンピュータ・ネットワーク・ノードであってもよい、複数の実行ユニット上で実行するためのソース・コードの処理部分に関するものである。この複製は、異なるバージョンの特定のコードが異なるメモリ内に格納されているデータにアクセスするために生成される必要があるとすれば、複製された(または処理された)コードが共有メモリ11とアクセラレータ・コア8、9、10のローカルにあるメモリ12、13、14のうちの1つのメモリの両方に格納されているデータを処理することも可能にする。これは、複製されるソース・コードが、異なる引数を付けてソース・コードの異なる部分から呼び出される関数を含む場合であることが多い。
【0058】
コードのさまざまな他の部分は、ブロック18で処理され、そのコードとマルチ・コア・プロセッサの実行との互換性を保証する、例えば、共有メモリをターゲットとするポインタとアクセラレータ・コア8、9、10のうちの1つのアクセラレータ・コアのローカルにあるメモリ12、13、14のうちの1つのメモリをターゲットとするポインタとの間の整合性を保証する。
【0059】
上述の処理を実行すると、それぞれのプロセッサ・コアに対するソース・コードが、ブロック19で、そのプロセッサ・コアに適したコンパイラによるコンパイルのために作成される。
【0060】
次に、図3Bを参照すると、ソース・コード・プリプロセッサ20は、マルチ・コア・プロセッサ1の特定のコア7、8、9、10上で処理および実行を行うようにコンパイルされなければならないソース・コードのセクションを識別し、共有メモリ11内に、またはアクセラレーション・コア8、9、10のうちの1つのアクセラレーション・コアのメモリ12、13、14内に置かれなければならないデータを識別するようにユーザーによって修正されている、C、C++、C#、またはJavaなどの、プログラミング言語で書かれたソース・コードを受け取る。
【0061】
ソース・コード・プリプロセッサ20は、関数および変数をプログラム・パーティショニング・ツール21に出力する。ソース・コード・プリプロセッサ20から出力される関数および変数の形態は、例えば、ソース・プログラムの字句、抽象構文木、または高水準コンパイラ中間表現のリストとすることも可能である。ソース・コード・プリプロセッサ20の出力は、どのソース・コードが特定のプロセッサ・コアによって処理のマークを明示的に付けられているかを示す情報、および特定のデータがプロセッサ・コア間で共有されているか、またはアクセラレータ・コアのうちの1つのアクセラレータ・コアに特有のものであるかの任意の明示的な指示を表す情報を含む。表現は、RAM 2内に格納されうるか、またはプログラム全体の表現がプログラム・パーティショニング・ツール21に利用可能になるようにハード・ディスク・ドライブ3に保存されうる。ソース・コード・プリプロセッサ20からの出力は、高水準中間表現と称される。
【0062】
標準の前処理タスク(CおよびC++では、#includeおよび#defineステートメントの処理など)に加えて、プリプロセッサ20は、構文および型検査を供給される修正済みソース・コードに対して実行し、構文に関して、またセマンティクスに関して誤りのあるソース・コードを拒絶することができる。
【0063】
プログラム・パーティショニング・ツール21は、特定のプロセッサ・コア上で実行されるように指定されている任意のソース・コードのセクションがそのプロセッサ・コア上で確かに実行されることを保証する。同様に、プログラム・パーティショニング・ツール21は、ソース・コードがデータがコア間で共有されるか、またはコアのうちの特定の1つのコアによってアクセスされるべきであることを指定している場合に、データが指定されているとおりに確かに処理されることを保証する。
【0064】
プログラム・パーティショニング・ツール21は、プロセッサ・コア7、8、9、10のそれぞれについて各プログラム・コードおよびデータを出力する。これを行う際に、プログラム・パーティショニング・ツール21は、元のソース・コードにさまざまな修正を加えて、実行および格納が望み通りに取り扱われることを保証する。これらの修正の性質については、以下でさらに詳しく説明される。プログラム・パーティショニング・ツール21は、プログラム・コードおよびデータをCなどの人間が読めるプログラミング言語で出力することができる。代替的に、プログラム・パーティショニング・ツール21は、コードおよびデータをコンパイラ中間表現で出力することができる。コードおよびデータは、それぞれのプロセッサ・コア7、8、9、10について複数のコンパイラ22に出力される。2つのコンパイラ22a、22bが図3に示されており、第1のコンパイラ22aはホスト・コア7に特有のプログラム・コードを受け取るが、第2のコンパイラ22bはアクセラレータ・コア8、9、10のうちの特定の1つのアクセラレータ・コアに対するプログラム・コードを受け取る。
【0065】
コンパイラ22は、プログラム・パーティショニング・ツール21の出力をプロセッサ・コア7、8、9、10のそれぞれについて実行可能コードに変換する。プログラム・パーティショニング・ツール21は、関数のリストをビルド・ツール23にさらに出力する。ビルド・ツール23は、以下でさらに詳しく説明されているようにそれぞれのプロセッサ・コア7、8、9、10について呼び出しスタックを分析する。
【0066】
ソース・コード・プリプロセッサ20が、特定のプロセッサ・コア上に特定のコードが実装されなければならないことを示すように修正されている高水準言語コンピュータ・プログラム・コードを受け取ることが上では示されている。そこで、このような修正が、以下でさらに詳しく説明される。ソース・コードに対して行われる修正は、ソース・コードが書かれているプログラミング言語に新しい概念を持ち込むようになされる。特に、ソース・コードに対する修正は、アクセラレーション・セクション(アクセラレーション・セクション内のコードが特定のプロセッサ上で実行されなければならないことを示す)、およびそれぞれについて以下でさらに詳しく説明されているコンテキスト指示(データが格納されなければならないメモリを示す)を導入するように使用されうる。
【0067】
アクセラレーション・セクションは、アクセラレータ・コア8、9、10のうちの1つのアクセラレータ・コア上で実行されるように指定されているコードの一セクションである。アクセラレーション・セクションは、アクセラレータ・コア上で実行されなければならないコードを示すようにキーワードを使用して示される。例えば、プログラマーは、関数内に、キーワードの後のコード(例えば、中括弧で囲まれている)がアクセラレータ・コア上で実行されなければならず、コードは複数のプロセッサ・コアを有するプロセッサ上で実行されるべきであることを示すために注釈「accelerationsection」を挿入する。利用可能なアクセラレーション・セクションには複数の型があってもよく(それぞれ関連するキーワードを有する)、これにより、プログラマーはソース・コードの特定のセクションがアクセラレータ・コア8、9、10のうちの特定の1つのアクセラレータ・コア上で実行されなければならないことを示すことが可能になる。注釈「accelerationsection」は、例としてのみ与えられており、適したものであればどのような注釈でも使用可能であることは理解されるであろう。特定の構文を使用すべきであるとする要求条件はないことも理解されるであろう。
【0068】
図4のコード例は、注釈_accelerationsection_によって識別されるアクセラレーション・セクション・コード・ブロックを含む関数exFuncを定義する。アクセラレーション・セクション・コード・ブロック内のどのコードも、アクセラレータ・プロセッサ、例えばアクセラレータ・コア8上で実行されなければならないが、アクセラレーション・セクション・コード・ブロックの外のコードは、ホスト・プロセッサ2上で実行されなければならない。
【0069】
代替的に、図5に示されているように、関数全体が、キーワードをその定義に追加することによってアクセラレータ・コアのうちの1つのアクセラレータ・コアにより実行されるものとしてマークを付けられるものとしてよい。
【0070】
図5のコードは、speedyFunctionと呼ばれる関数を定義し、マーカー_acceleratedfunction_をその定義内に含め、speedyFunction関数がアクセラレータ・コア8、9、10のうちの1つのアクセラレータ・コア上で実行されなければならないことを示す。同様にして、マーカー_unacceleratedfunction_が、特定の関数がアクセラレータ・コアのうちの1つのアクセラレータ・コア上で実行されてはならないが、その代わりにホスト・コア7上で実行されなければならないことを示すために使用されうる。
【0071】
関数のオーバーロードをサポートするプログラミング言語では、図5に示されている型の関数宣言は、_acceleratedfunction_マーカーを持たないが、他の点では同じシグネチャを有する、関数宣言と明確に区別できるものであるとしてよい。アクセラレーション・セクションの内側から関数を呼び出すことは、関数のマーク付きバージョンが呼び出されることを引き起こすが、アクセラレーション・セクションの外側から呼び出すと、その結果、_acceleratedfunction_マーカーなしで関数を呼び出すことになる。従来の関数のオーバーロードは、2つの関数定義が同じ名前を有するが、異なる関数シグネチャ(例えば、異なる数および/または型のパラメータ、または異なるポインタ修飾子(暗黙のポインタを含む))を有する場合に生じるが、ここでは、「オーバーロード」は、同じ関数シグネチャを有するが、関数が実行されなければならないプロセッサ・コアに関する異なる指示を有する2つの定義からも生じることがわかる。オーバーロードの解決は、例えば、ホスト・プログラミング言語の規則に従って実行されうるが、これらの規則によって解決できないあいまいさが生じる場合、関数は、プロセッサ・コアの指示に基づき選択されうる。
【0072】
特定のアクセラレーション・セクション内において、そのアクセラレーション・セクション内で呼び出された特定の名前付き関数は、それ自体、特定のアクセラレータ・コア上で実行されなければならないと指定することもさらに可能である。一例が、図6に示されている。ここで、コードは、関数a、b、およびcがアクセラレーション・セクション内の他のコードと同じアクセラレータ・コア上で実行されなければならないことを示す。関数a、b、およびcがアクセラレータ・コア上で実行されることを可能にするために、プログラム・パーティショニング・ツールは、以下でさらに詳しく説明されるようにアクセラレータ・プロセッサ上で実行されるように変換された関数a、b、およびcの複製を作成する。
【0073】
より詳しくは、図6のコードは、関数ポインタを引数としてとる関数fを定義する。関数f内に定義されたアクセラレーション・セクション内のコードは、関数fへの引数として与えられた関数を呼び出す。上記のように、アクセラレーション・セクションは、_accelerationsection_マーカーを使用してマークされ、アクセラレーション・セクションの内側のコードがアクセラレータ・コア上で実行されることを示す。しかし、ここでは、_accelerationsection_マーカーは、関数a、b、cのどれかがアクセラレーション・セクション内のコードによって呼び出される場合、これらはアクセラレーション・セクション内のコードと同じアクセラレータ・コア上で実行されなければならないことをさらに指定する。したがって、関数a、b、cのうちの1つが関数fに与えられた引数によって指示される場合、受け渡された関数が、アクセラレーション・セクション内の他のコードと同じアクセラレータ・コア上で実行される。
【0074】
アクセラレーション・セクションは、アクセラレーション・セクションが別の(子)アクセラレーション・セクションを囲むことができるように入れ子にされうる。それぞれのアクセラレーション・セクションは、データ・アイテムがアクセスされ、関数が呼び出される、コンテキスト・レベルを定義する。それぞれのコンテキストは、レベル・インデックスなどの割り当てられた識別子によって識別されうる。例えば、外側レベル・コンテキストにはレベル・インデックス0を割り当てることができ、外側コンテキスト・レベルは主コンテキスト・レベルであり、外側コンテキスト・レベル内のコードは、ホスト・コア7によって処理される。第1のアクセラレーション・セクションは、第2のコンテキスト・レベルを定義し、これにコンテキスト・レベル・インデックス1を割り当てることが可能である。第1のアクセラレーション・セクション内のさらなるアクセラレーション・セクションは、第3のコンテキスト・レベルを定義し、これにコンテキスト・レベル・インデックス2を割り当てることが可能であり、これ以降同様に割り当てることが可能である。それぞれのコンテキスト・レベルは、アクセラレータ・コア8、9、10のうちの異なる各1つのアクセラレータ・コアによる処理および実行のためのソース・コードを含むことができる。
【0075】
先行する記述は、アクセラレータ・コア8、9、10のうちの特定の1つのアクセラレータ・コア上での実行に関してコードのセクションをコードがどのように識別することができるかを説明している。次に、データ・アクセスがどのように取り扱われなければならないかを示すために使用される方法が説明される。
【0076】
メモリ・アクセス・セマンティクスが、メモリ・アクセスが処理されなければならない方法を定義する。多くのシステムにおいて、データ・アイテムがRAMから読み出されるときにはデータ・アイテムがローカル・メモリ(例えば、レジスタもしくはオンチップ・キャッシュ)にコピーされること、およびデータ・アイテムが書き込まれるときにはRAMに書き込まれることを指定する単一のメモリ・アクセス・セマンティクスがある。しかし、並列システムおよびマルチ・コア・プロセッサでは、さらなるメモリ・アクセス・セマンティクスを導入してメモリ・アクセスが処理されなければならない異なる方法を指定することが望ましい場合がある。
【0077】
コンピュータ・プログラムが複数のプロセッサ・コアにまたがって実行される場合、特定のプロセッサ・コア上で実行されるコードに対してプライベートのものであるデータと複数のプロセッサ・コア上で実行されるコード間で共有されるデータとが区別されうる。したがって、マルチ・コア・プロセッサ上で実行されることが意図されているコンピュータ・プログラム・コードでは、ソース・コードにおいて、それぞれのデータ・アクセス・オペレーションについて、アクセスされるデータがプライベートであるかまたは共有であるかを指定することが有用である。
【0078】
例えば、プログラミング言語は、プライベート・データおよび共有データを表すために限定子を備えていることがある。変数は、プライベート限定子および共有限定子を使って注釈を付けられ、それらの変数が共有であるかプライベートであるかを示し、ポインタ型も、これらのポインタがプライベートまたは共有データを指し示すかどうかを指定するように限定することもできる。例えば、プログラマーは、変数が
_shared_ int sharedVariable;
_private int privateVariable;
のように共有またはプライベート・メモリ内に格納されなければならないことを指示することができる。
【0079】
ただし、変数sharedVariableは、複数のプロセッサ・コア上で実行されているプログラム・コードの間で共有され、変数privateVariableは、特定の1つのプロセッサ・コアに対してプライベートである。
【0080】
同様に、ポインタは、
_shared_ int *sharedDataPointer;
_private_ int *privateDataPointer;
のように共有またはプライベート・メモリを指しているものとしてマークされうる。
【0081】
ここで、整数ポインタsharedDataPointerは共有メモリを指しているが、整数ポインタ変数privateDataPointerは特定の1つのプロセッサ・コアに対してプライベートであるメモリを指している。
【0082】
データ・アイテムは、異なるアクセラレーション・セクション・コンテキスト・レベルにおいて宣言され、コンテキスト・レベルにまたがってアクセスされうる。上記からの仮説的表記を使用して、一例が図7に示されている。
【0083】
図7のコード例は、整数データ・アイテムoutervalが宣言され、整数データ・アイテムoutervalに値2が割り当てられている関数fを定義する。outervalが、ホスト・コンテキスト・レベルlevel 0(つまり、アクセラレーション・セクションの外側)で宣言されるので、変数outervalは、共有メモリ11内に格納される。関数f内のアクセラレーション・セクション内において、第2の整数データ・アイテムinnervalが宣言され、第2の整数データ・アイテムinnervalに値4が割り当てられる。innervalは第1のアクセラレーション・セクション・コンテキスト・レベル内で宣言されるので、データ・アイテムinnervalは、アクセラレーション・セクションが関係するアクセラレータ・プロセッサのローカル・メモリ内に格納される。例えば、アクセラレーション・セクションがアクセラレータ・コア8に関係する場合、データ・アイテムinnervalは、アクセラレータ・コア8のローカル・メモリ12に格納される。
【0084】
データ・アイテムoutervalは、アクセラレーション・セクションの内側のコードからアクセスされる。データ・アイテムが定義されているコンテキスト・レベルと異なるコンテキスト・レベルでデータ・アイテムにアクセスすることは、そのデータ・アイテムの、そのデータ・アイテムが宣言されているコンテキストからそのデータ・アイテムが必要とされるコンテキスト内への転送を引き起こす。このような転送は、アクセラレーション・セクションのコードを実行する、アクセラレータ・コア8から共有メモリ11へのダイレクト・メモリ・アクセス(DMA)要求を用いて遂行されるものとしてよい。
【0085】
それに加えて、ポインタ変数が特定のアクセラレーション・セクションのコンテキスト内にあることも理解されるであろう。
【0086】
静的ポインタ型では、プログラム・パーティショニング・ツール21が、どのコンテキスト・レベルにポインタ・ターゲットが配置されているか、またポインタが生成されるコンテキスト・レベル(つまり、ポインタ変数が宣言されているコンテキスト・レベル)を記述する情報をポインタ型(例えば、データ・アイテムのアドレスをとるとき)にアタッチする。次いで、コンパイラ22が、適切なデータ転送命令を生成することができる。
【0087】
動的ポインタ型では、コンテキスト・レベル情報はポインタ型にアタッチされず、ポインタの値にアタッチされる。次いで、ポインタの値が、実行時に検査され、どのようなコンテンツ情報がアタッチされているかに応じて、適切なデータ転送が実行される。例えば、範囲0−0x0FFF内のメモリ・アドレスは共有メモリ11に割り当てられ、範囲0x1000−0x1FFF内のアドレスはアクセラレータ・コアのうちの1つのアクセラレータ・コアのローカル・メモリに割り当てられるということが可能であるが、ただし、それぞれのプロセッサ・コアは異なるアドレス空間に割り当てられる。代替的に、コンテキスト・レベル情報(例えば、フラグの形態の)が、ポインタ値にアタッチされうる(例えば、コンテキスト・レベル情報をポインタ値の一部として表すことによって、またはポインタ値とコンテキスト・レベル情報とからなる構造体としてポインタを実装することによって)。
【0088】
アクセラレーション・セクションが入れ子になっている場合、データ・アイテムは、複数のコンテキスト・レベルにまたがってアクセスされてもよい。データが複数のコンテキスト・レベルにまたがってアクセスされる場合、データ・アイテムは、データ・アイテムが宣言されているテキスト・レベルに関連付けられているメモリからデータ・アイテムが必要とされるコンテキスト・レベルに直接転送されてもよく、ただし、そのような転送がハードウェアによってサポートされている場合に限る。代替的に、要求されたデータ・アイテムは、カスケード転送を使用して、一方のコンテキスト・レベルから次のコンテキスト・レベルへ、一時バッファを使用して転送されるものとしてよい。
【0089】
異なるコンテキスト・レベルで宣言されている変数は、異なるメモリ・アクセス・セマンティクスを介してアクセスされうる。例えば、データは、アクセラレーション・セクションの外部の既定のメモリ・アクセス・セマンティクスを使用してアクセスされることもあるが、アクセラレーション・セクション内から共有メモリ11内に格納されているデータにアクセスする場合にはソフトウェア・キャッシングが使用されるものとしてよい。つまり、共有メモリ11に格納されているデータの一部のキャッシュが保持され、アクセラレーション・セクション内のコードによって、そこからデータが読み込まれ、そこへデータが書き込まれうる。特定のアクセラレーション・セクションに対してプライベートであるデータは、既定のメモリ・アクセス・セマンティクスを使用してそのアクセラレーション・セクション内でアクセスされうる。
【0090】
ソフトウェア・キャッシングの使用は、アクセラレータ・コアがダイレクト・メモリ・アクセス技術またはメッセージ・パッシングを使用して共有メモリにアクセスすることしかできないときに有利な場合がある。
【0091】
ソフトウェア・キャッシングは、プログラムがホスト・コア7上で実行されるときにプログラムがデータにアクセスする方法と似た方法でアクセラレータ・コア上で実行されるときにプログラムが共有メモリ内のデータにアクセスすることを可能にすることができる。それに加えて、われわれの以前の特許出願(国際特許出願公開第2007/085855号)で説明されているように、メモリへのライトは、アクセラレーション・セクションの終わりまで遅延させることができ、これにより、コンパイラがアクセラレーション・セクション内の並列処理を最大化することを可能にする。
【0092】
使用されうる別のメモリ・アクセス・セマンティクスは、ソフトウェアで実装されたトランザクション・メモリに基づく。ここで、共有データへのすべてのリードが追跡され、共有メモリへのすべてのライトがキューに置かれる。ライトは、リードおよびライトの正しい順序が保持されている場合にのみ共有メモリに適用される。
【0093】
使用されうる別のメモリ・アクセス・セマンティクスは、ガーベジ・コレクション・システムに基づく。ここで、特定のコンテキスト・レベル(特定のコンテキスト・レベルが与えられたメモリ空間に関連付けられている)内のすべてのポインタは、追跡可能であるものとして指定されてよく、したがって、そのコンテキスト・レベルに関連付けられているメモリ空間がガーベジ・コレクションを施される。ガーベジ・コレクション・システムは、追跡可能なポインタのそれぞれを辿って、メモリ空間内のどのデータ要素がポインタによってメモリ空間に到達可能であるか、およびメモリ空間内のどのデータ要素がポインタによって到達可能でないかを判定することができる。到達可能でないすべてのデータ要素は、解放され、空きメモリ・プールに戻すことができる。
【0094】
アクセラレーション・セクションが同期的にまたは非同期的に実行されなければならないことを指示するためにさらなる修飾子が指定されうる。
【0095】
アクセラレーション・セクションの内側で使用されるすべてのコードは、そのアクセラレーション・セクションのコンテキスト・レベルに関連付けられているアクセラレータ・コアに対して適しているコンパイラ22によって自動的に(さらなる注釈を必要とすることなく)コンパイルされる。したがって、アクセラレーション・セクション内にそのルートを有する呼び出しグラフ全体が、アクセラレーション・セクションから(直接的にまたは間接的に)呼び出されるすべての関数を識別するために、そのアクセラレーション・セクションのコンテキスト・レベルについて処理される。異なるコンテキスト・レベルが潜在的に異なる命令セットを持つ異なるアクセラレータ・プロセッサ上にマッピングされうるので、異なるコンテキスト・レベルから呼び出される関数は、この関数が使用されるコンテキスト・レベルに関連付けられているそれぞれのアクセラレータ・コアについてコンパイルされる。
【0096】
上述の型のポインタ修飾子は、プログラマーがポインタ宣言において特定のポインタのターゲットを指定することを可能にする。これらの修飾子は、場合によっては、例えば、アクセラレーション・セクションに対して関数を処理することで異なるアクセラレーション・セクション情報を有するポインタ型の間に変換の不一致が生じるときに必要になることがある。このような変換の不一致は、以下でさらに詳しく説明される。注釈を最低限度に留めるために、プログラム・パーティショニング・ツール21は、多くの場合、注釈が付けられていない値およびポインタの型に対するコンテキスト・レベル情報を推論することができる。例えば、ポインタのコンテキスト・レベルは、そのポインタが初期化されて指す変数のコンテキスト・レベルから推論され、関数の戻り値のコンテキスト・レベルは、関数の「return」ステートメントに含まれる値から推論されうる。
【0097】
特定のコードが特定のプロセッサ・コア上で実行されなければならないことをプログラマーが指示することを可能にすること、およびデータ・アクセス・セマンティクスが指定されることを可能にすることは、プロセッサ・コアのメモリ・アクセス・セマンティクスおよび選択が場合によってはコンピュータ・プログラムにおいて優先する特定の状況により推論されうるけれども、多くの場合において、どのようなことが生じるべきかをプログラマー側で指定することができることが好ましいので有益である。したがって、プログラム・パーティショニング・ツール21は、特定のプロセッサ・コアによって、また特定のメモリ・アクセス・セマンティクスを有するデータ・アクセス・オペレーションにより、またソース・コード内に指定されたプロセッサ・コアまたはメモリ・アクセス・セマンティクスを有していない関数およびデータ・アクセス・オペレーションにより、実行されるべきソース・コードにおいて指定されている両方の関数をとる。
【0098】
次に説明されるが、プログラム・パーティショニング・ツール21は、どのプロセッサ・コアに対してどの関数がコンパイルされなければならないか、またどのデータ・アクセス・オペレーションでどのデータ・アクセス・セマンティクスが適用されなければならないかを決定するために一連の規則を適用する。確かに、上に示されているように、特定の関数が異なるコンテキストから呼び出されうるので、特定の関数が複数のプロセッサ・コア上で実行されるように、また複数のメモリ・アクセス・セマンティクスとともに、コンパイラされることが必要になる場合がある。
【0099】
例えば、プログラム内のあるポイントにおいて、関数fが、既定のデータ・アクセス・セマンティクスを有し、ホスト・コア7上で実行されるべき関数から呼び出される場合、およびプログラム内の別のポイントにおいて、関数fが、アクセラレーション・データ・アクセス・セマンティクスを持つアクセラレーション・セクションから呼び出される場合、プログラム・パーティショニング・ツール21は、関数fの2つの変換されたバージョンを生成し、第1のバージョンは既定のデータ・アクセス・セマンティクスを持つポスト・コア7に対してコンパイルされ、第2のバージョンはアクセラレータ・コア、例えば、アクセラレーション・データ・アクセス・セマンティクスを持つアクセラレータ・コア8に対してコンパイルされうる。正しいメモリ・アクセス・セマンティクスを維持するために、一組の規則がポインタおよび参照の型に適用される。関数を変換するためにプログラム・パーティショニング・ツール21によって実行される処理について、以下でさらに詳しく説明される。
【0100】
データが正しくアクセスされることを保証するために、いくつかの実施形態では、プログラム・パーティショニング・ツール21は、それぞれの異なる種類のデータ・アクセス・セマンティクスを使用してデータを読み出し、書き込むための異なるマクロを含む、一連のCマクロを出力する。異なるCマクロは、それぞれの与えられたデータ・アクセス・セマンティクスに対して正しいリードおよびライト・オペレーションを実行するように定義されるものとすることが可能である。
【0101】
それぞれの関数について、プログラム・パーティショニング・ツール21は、呼び出しサイト(つまり、関数が呼び出されるプログラム・コード内のコンテキスト)および呼び出される関数の高水準中間表現(ソース・コード・プリプロセッサ20によって生成される)を下記の基準に従って調べる。
【0102】
高水準中間表現において、関数が指定メモリ・アクセス・セマンティクスを持たないポインタ型パラメータを有する場合、および関数が呼び出されるときにポインタ引数を受け渡される場合に、変換された関数内の対応するパラメータは、呼び出しサイトで受け渡される関数引数と同じメモリ・アクセス・セマンティクスを有する。例えば、ポインタ型パラメータをとる関数が共有ポインタを受け渡される場合、変換された関数は共有ポインタ・パラメータをとる。
【0103】
高水準中間表現において、関数がメモリ・アクセス・セマンティクスが指定されていない参照型パラメータを有する場合、および呼び出しサイトで参照型引数を受け渡される場合に、変換された関数の対応するパラメータは、呼び出しサイトで受け渡される参照と同じメモリ・アクセス・セマンティクスを有する。例えば、参照型パラメータをとる関数が特定のプロセッサ・コアに対してプライベートであるメモリへの参照とともに呼び出される場合、変換された関数はプライベート参照パラメータをとる。
【0104】
変換されるべき関数内の変数が、明示的なメモリ・アクセス・セマンティクスが指定されていないポインタ型であると宣言されている場合、および変数がポインタ値に初期化される場合、変数は、初期化値のメモリ・アクセス・セマンティクスとともに生成される。複数のメモリ・セマンティクスが初期化値に適用される可能性があれば初期化時に変数にアタッチされるメモリ・アクセス・セマンティクスはない。例えば、ポインタが定数値に初期化され、その定数値が異なるメモリ領域内で有効なアドレスである場合、その値が特定のメモリへのアドレスでない限りメモリ・アクセス・セマンティクスはその変数にアタッチされないか、または定数の型(ポインタ型にアタッチされた情報)が特定のメモリ・セマンティクスを強制する。
【0105】
明示的なメモリ・アクセス・セマンティクスを持たないポインタが関数内で宣言され、変数がプライベート値を指すように初期化される場合、ポインタ変数はプライベート・ポインタに変換される。同様に、ポインタ変数がアクセラレーション・セクション内で宣言され、共有変数を指すように割り当てられた場合、ポインタは外側のポインタに変換される。
【0106】
メモリ・アクセス・セマンティクスが指定されていないポインタ型変数が、変換されるべき関数内でアクセスされるが、変換されるべき関数の外で宣言され、その関数が呼び出される前に割り当てられることも、アクセスされることもない場合、および変換されるべき関数内で、その変数がポインタ値を代入されている場合、割り当てられたポインタ値のメモリ・アクセス・セマンティクスを有する変数の複製が作成される。
【0107】
メモリ・アクセス・セマンティクスが指定されていないポインタ型変数が変換されるべき関数の参照パラメータへの引数として受け渡される場合、変換された関数の変数と参照パラメータ型の両方が、その変換された関数の内側の変数の、もしあれば、初期化からメモリ・アクセス・セマンティクスを受け取る。
【0108】
変換されるべき関数内の変数が、メモリ・アクセス・セマンティクスが指定されていない参照型であると宣言されている場合、および変数がメモリ内の特定のデータ・アイテムを参照するように初期化される場合、変数は、初期化データ・アイテムのメモリ・アクセス・セマンティクスとともに生成される(例えば、参照がプライベート・データへの参照である場合、その参照はプライベートにされる)。
【0109】
関数がreturnステートメントを含み、関数がメモリ・アクセス・セマンティクスが指定されていないポインタまたは参照を返す場合、変換された関数は、メモリ・アクセス・セマンティクスが返される値によって決定される戻り型を有する。
【0110】
関数変換の終わりにメモリ・アクセス・セマンティクスが指定されていないまま続くポインタ型については、既定のメモリ・アクセス・セマンティクスが選択されなければならない。この既定のセマンティクスは、システムの実装者によって決定されうる。
【0111】
次いで、一方のメモリ・アクセス・セマンティクスを持つポインタまたは参照から他方のメモリ・アクセス・セマンティクスを持つポインタまたは参照へのどのような変換も未定義または予想外の挙動を引き起こさないことを確認するために変換された関数が型検査される。例えば、一方のメモリ・アクセス・セマンティクスから他方のメモリ・アクセス・セマンティクスへのポインタの変換は、デスティネーション・メモリ・アクセス・セマンティクスがソース・メモリ・アクセス・セマンティクスのスーパーセットでない限り、不正になるものとしてよい。
【0112】
上述の型の変換の後、変換された関数は最適化され(必要な場合)、コンパイラ22のうち1つのコンパイラに与えられるべきターゲット・コンパイラ可読中間表現にコンパイルされる。
【0113】
(必要ならば)必要な変換は、さまざまな例を参照しつつ次に説明されるように処理されている特定の関数の性質に依存する。以下の説明では、アクセラレーション・セクション内で、限定子「_outer」は、変数が共有メモリ11内に格納されることを示し、限定子「_inner」は、変数がアクセラレーション・セクションが関係するアクセラレータ・コアのローカル・メモリ内に格納されることを示す。以下の説明で使用される限定子は、単に説明的なものにすぎず、適切な限定子があればそれが使用されうることは理解されるであろう。
【0114】
図8は、一対の値を引数としてとり、結果を返す、単純関数である、multiplyを示している。関数multiplyは大域的環境への依存性を有していないことがわかる。したがって、関数multiplyは、変換が要求されることなく関数が実行されるべきそれぞれのプロセッサ・コアに対しコンパイルされうる。
【0115】
少し複雑な事例が、図9の例に示されている。ここで、関数new_multiplyは、単一のパラメータをとり、関数に受け渡される値にグローバル変数bの値を乗じる。ここで、関数new_multiplyは、グローバル変数bへの参照がDMAを使用してアクセスされる共有メモリ11内に格納されている変数bへの参照で置き換えられた関数new_multiplyの複製を作成するように変換される。このような変換は、関数new_multiplyがホスト・コア7およびアクセラレータ・コア8、9、10のそれぞれの上で実行されることを可能にし、元の関数new_multiplyはホスト・コア7上で実行され、変換された複製はアクセラレータ・コア8、9、10上で実行される。
【0116】
アクセラレーション・セクションの内側のポインタ引数(C++における参照、PascalにおけるVARパラメータ、「this」ポインタおよび戻り値へのポインタなどの暗黙の引数などの明示的なポインタ型または暗黙のポインタ型の両方を含む)を付けて呼び出される関数は、コンパイラがその関数のコピーを生成し、コピー内のポインタ・パラメータが呼び出し内の対応する引数のコンテキスト情報を含むようにプログラム・パーティショニング・ツール21によって処理される。このプロセスは、以下でさらに詳しく説明される。
【0117】
値変数の代わりにポインタ変数をとる関数の一例が、図10に示されている。関数another_multiplyは、図8の例の場合のように、2つの値引数の代わりに、2つのポインタ引数をとる。」このような場合、関数変換は、関数を呼び出すために引数のどのような組み合わせを使用するかに応じて、元の関数の複数の変換を生成することがある。一般に、2つのポインタ引数aおよびbがあれば、変数aとbの両方が共有メモリ11内のロケーションを指す、変数aとbの両方がアクセラレータ・コア8、9、10のローカルのメモリ内のロケーションを指す、変数aが共有メモリ11を指し、変数bがアクセラレータ・コア8、9、10のローカルのメモリを指す、および変数bが共有メモリ11を指し、変数aがアクセラレータ・コア8、9、10のローカルのメモリを指す、の4つの可能性がある。そのため、使い方に応じて、関数の最大4つまでのバージョンが出力されうる。出現しないと(関数が呼び出される方法に基づき)判定されうるパラメータの組み合わせは、無視または回避されうる、つまり、関数のそれぞれの呼び出しへの引数の分析によって決定されるように、複製が要求によって駆動されうる。同じアプローチが、参照型のパラメータに適用されうる。関数の複製は、複製されたコードが、特定のアクセラレータ・コア8、9、10のローカルのメモリとは反対に、共有メモリ11を参照するように決定された引数へのアクセスのため、メモリ・リードおよびライトの代わりにDMA転送を生成することを引き起こす。
【0118】
次に、参照パラメータをとる関数が変換されうる例が、図11に示されている疑似コードを参照しつつ説明される。
【0119】
図11の行1から4は、関数funcを定義している。関数funcは、2つの整数参照パラメータをとり、第1のパラメータによって参照されている整数値に第2のパラメータによって参照されている整数値を乗じた結果を返す。funcは、整数参照をパラメータとしてとるので、これは、関数funcが作用する参照によって受け渡される実際の整数変数であり、これらの整数変数のコピーではない(例えば図8のコードの場合のように)。つまり、funcが呼び出されるときに、受け渡された変数が格納されるメモリ内のロケーションにアクセスする必要がある。
【0120】
主関数(行5から16)において、アクセラレーション・セクションは、行9でaccelerationsectionマーカーで定義される。アクセラレーション・セクション・マーカーは、主関数のコードを2つのテキスト・レベル、つまり、アクセラレーション・セクション内のコードとアクセラレーション・セクションの外側のコードとに分割する。アクセラレーション・セクションの外側のコードは、ホスト・コア7によって処理されるべきであるが、アクセラレーション・セクションの内側のコードは、例えば、アクセラレータ・コア8によって処理されるべきである。
【0121】
アクセラレーション・セクションの外側において、行7で、整数変数aが定義され、値2を割り当てられる。整数aは、アクセラレーション・セクションの外側で定義されるので、共有メモリ11内に格納される。
【0122】
アクセラレーション・セクション内では、行11で、整数変数bが定義され、値3を割り当てられる。整数bは、アクセラレーション・セクション内で定義されるので、アクセラレータ・コア8のローカル・メモリ12内に格納される。
【0123】
アクセラレーション・セクション内では、関数funcは、3度呼び出され、呼び出されるたび毎に、変数aおよびbの異なる組み合わせをパラメータとして受け渡される。
【0124】
行12で、funcが呼び出され、第1のパラメータとして変数a、および第2のパラメータとして変数bを受け渡される。行12のコメント(//によって表される)は、関数funcがこの場合にどのように変換されるかを示している。関数は、第1のパラメータの前にマーカー_outerが付けられるように変換される。マーカー_outerは、第1のパラメータがアクセラレーション・セクションの外側で定義されている整数への参照、つまり、共有メモリ11内に格納されることを示す。第2のパラメータは、整数bが関数funcへの呼び出しと同じコンテキスト、つまり、アクセラレーション・セクションのコンテキスト内で定義されるので無変化である。
【0125】
行13で、funcが呼び出され、第1のパラメータとして変数b、および第2のパラメータとして変数aを受け渡される。行13のコメントは、関数funcがこの場合にどのように変換されるかを示している。関数は、第2のパラメータの前にマーカー_outerが付けられるように変換される。第1のパラメータは、整数bが関数funcへの呼び出しと同じコンテキスト、つまり、アクセラレーション・セクションのコンテキスト内にあるので無変化である。
【0126】
行14で、funcが呼び出され、変数bをその第1および第2の引数として受け渡される。行14のコメントは、この場合に、第1および第2のパラメータの両方が、整数bが関数funcへの呼び出しと同じコンテキスト内にあるため無変化であることを示している。
【0127】
行8で、アクセラレーション・セクションの外側において、関数funcが呼び出され、変数aをその第1および第2の引数として受け渡される。この場合、関数funcは、アクセラレーション・セッションの外側で呼び出されるため、パラメータへの変換は不要である。
【0128】
前記の例から、アクセラレーション・セクション・レベルが1つである(つまり、入れ子になったアクセラレーション・セクション・レベルがない)プログラムでは、データ・アイテムは、アクセラレーション・セクション(レベル1)の内側で、またはホスト・レベル(レベル0)で定義されうることがわかる。示されているように、2つのポインタ型パラメータを持つ関数では、関数が呼び出されうるポインタ型引数の4つの異なる組み合わせ、つまり、(レベル0,レベル0)、(レベル0,レベル1)、(レベル1,レベル0)、(レベル1,レベル1)を取り扱うために最大4つまでのコピーが必要であり、それぞれの組は関数に受け渡される引数のアクセラレーション・セクション・コンテキスト・レベルを示す。
【0129】
別の例が、図12に示されている。findMin関数は、そのポインタ・パラメータintListを通じてfindMinに受け渡される整数値のリストで最小の整数値を返す。
【0130】
図12の主関数のアクセラレーション・セクション内で、関数findMinは、最初に、図12のソース・コード内でグローバル変数として宣言されている共有メモリ11内に保持されている配列arrayOflntegersを付けて呼び出される。したがって、プログラム・パーティショニング・ツール21は、外部ポインタ(つまり、共有メモリ11へのポインタ)をその引数として受け付けるfindMinの変換された複製バージョンを作成する。型推論がない場合、コンパイラは、共有メモリ11をターゲットとする外部ポインタ(intList+1)を内部ポインタp(findMin関数内で宣言されている)に割り当てようと試みる入力プログラムを拒絶し、したがって、メソッド複製の試みは失敗することになる。型推論がある場合、forループ内の外部ポインタへのpの初期化は、変数pを_outer限定子と自動的に関連付けることによって有効にされる。したがって、外側限定子_outer限定子の自動伝搬が与えられた場合、ソース・コードへの大幅な変更を実行する必要はない。メソッドの本体内の明示的な_outer限定子の追加があれば、プログラマーがfindMinのオーバーロードを生成し、そのパラメータとして与えられるローカル・ポインタ・パラメータの場合(関数findMinが配列IocalArrayOflntegersを付けて呼び出されるときに生じるような)を取り扱う必要がある。対照的に、_outer限定子の推論は、プログラム・パーティショニング・ツールが必要に応じて適切なオーバーロードを生成することを可能にする。
【0131】
アクセラレーション・セクションの外側で宣言されたポインタは、常に、ホストの共有メモリ11内のデータを指している。このようなポインタは、_outer限定子を自動的に与えられる。内部ポインタと外部ポインタとの間の割り当てを許可しないことで、ホスト/アクセラレータ境界をまたがる、有益なある程度の型検査が行われる。例えば、アクセラレーション・セクション内で、内部ポインタを外部ポインタに(またはその逆に)割り当てると、その結果、コンパイル時エラーが発生する。この強い型検査は、行われないと一方のメモリ(例えば、共有メモリ11)内のロケーションへのポインタが他方のメモリ(例えば、アクセラレータ・コア8、9、10のメモリ12、13、14のうちの1つのメモリ)内のロケーションに設定されている場合に生じるであろう混乱を防ぐ。とは言っても、一方のメモリ内の特定のメモリ・ロケーションの内容を異なるメモリ内のロケーションに割り当てることが可能でなければならない。これは、図13を見ると最もよくわかる。ここで、float型のグローバル変数xは、行1で宣言されている。主関数(行2から13)のアクセラレーション・セクション内で、float型の値へのポインタpは、行6で_outer限定子とともに定義され、ポインタは共有メモリ11内の値を参照する。ポインタpは、変数xを格納するメモリ・ロケーションを指すように初期化される。
【0132】
行7で、さらなる変数が定義される。変数aは、限定子を持たず、したがって、アクセラレーション・セクションの内部変数である。変数aは、変数pによって示されているロケーション、つまり、共有メモリ11内のロケーションに格納されている値を割り当てられる。この割り当てを達成するために、共有メモリ11からの値が、ダイレクト・メモリ・アクセスによって読み出される。
【0133】
行8で、値1.0が、ポインタpによって示されるロケーションに格納される。ポインタpが共有メモリを指しているとすると、割り当ては、ダイレクト・メモリ・アクセスを使用して共有メモリ11にデータを書き込むことを伴う。
【0134】
類似のオペレーションが、行9および10に見られる。行9で、float型の変数が定義され、値xに初期化される。xが共有メモリ11内に格納されているとすると、このコマンドは、ダイレクト・メモリ・アクセスを使用する。同様に、変数xが値bに設定されている場合、リダイレクト・メモリ・アクセスのライト・コマンドが使用される。
【0135】
行11の命令は、ポインタpが変数aのアドレスを指すようにしようとする。変数a(行7で宣言されている)は内部変数であり、したがって行11で試みられた割り当ては不正であることが思い出される。したがって、行11の命令は、プログラム・パーティショニング・ツール21によってエラーとして識別される。
【0136】
メソッド複製を大きな例に適用する場合、いくつかの場合において_outer限定子が自動的に適用されるように型システムを設計すると都合がよい。_outerがプログラマーによって省かれ自動的に適用されうる2つのコンテキストが、初期化とキャストとにある。つまり、宣言およびキャストにおいて_outer限定子を使用する必要はないということである。これは、プログラマーによって必要とされる手作業のソース・コード注釈作成の量が低減されるため、既存のソース・コードが本明細書で説明されているメソッド内で使用されるように修正されている場合に特に有用である。
【0137】
初期化の場合を最初に考えると、図14に示されているソース・コードのフラグメンツを参照しつつ一例が提示されている。ここで、ポインタ変数xは、アクセラレーション・セクションの外側にあると宣言される。アクセラレーション・セクション内では、ポインタ変数zが宣言される。既定では、ポインタzは内部ポインタとなるが、ここでは、_outer限定子は、ポインタ変数zが共有メモリを指すことを示すために明示的に使用されることがわかる。したがって、ポインタzは、ポインタxに有効になるように割り当てられうる。
【0138】
ポインタ変数z2は、_outer限定子なしで宣言される。しかし、その宣言は、ポインタxへの初期化を含む。ポインタxが外部ポインタであるとすると、プログラム・パーティショニング・ツール21によって、ポインタz2は外部ポインタでもあることが推論され、またそれに応じて作成されうる。
【0139】
次に、キャストに基づく一例が、図15を参照しつつ説明される。ここで、型T1のグローバル・ポインタ変数gが宣言されている。主関数のアクセラレーション・セクション内で、外部ポインタ変数であることが明示的に示される型T2のポインタ変数varが宣言される。ポインタ変数varは、型T2となるようにキャストされる、グローバル・ポインタ変数gの値を割り当てられている。キャストがアクセラレーション・セクション内にあるとすれば、その結果、既定により、内部ポインタが作成される。しかし、キャストされている値(つまり、g)は外部ポインタであるため、キャスト・オペレーションの結果は、外部ポインタであると自動的に推論される。
【0140】
図16は、さらなる一例を示している。ここで、関数reinterpretIntにパラメータとして受け渡された、整数値へのポインタiは、flot型の値へのポインタとなるようにキャストされ、キャスト・オペレーションの結果によって示されるアドレスに格納されている値が、この関数によって返される。ここで、キャスト・オペレーションによって生成されたポインタは、ポインタiが内部ポインタであるか外部ポインタであるかに応じて内部ポインタまたは外部ポインタであると判定される。
【0141】
上で示されている内部および外部限定子は、メモリ空間の、レベル0とレベル1の二元分類を表している。構文は、任意の数のレベルへのポインタ型の表現が可能になるようになされている。ポインタ型は、declspec(_setmemorylevel(level))などの構成体を使用して宣言されるものとしてよく、ただし、levelは例えば、ローカル・ポインタには値1、外部ポインタには値0を有することができるアクセラレーション・セクション・ブロック・レベルである。2以上のレベルに対する値は、入れ子になったアクセラレーション・セクションを示す。したがって、限定子_declspec(_setmemorylevel_(0))は_outerと同等であることがわかる。declspecの使用は、アクセラレータ・ローカル・ポインタ型がローカル・ポインタ型を持つ構造体メンバを明示的に宣言するために構造体宣言の内側で有用な場合があるアクセラレーション・セクション・ブロックの外側で宣言されることを可能にする。
【0142】
C++、Java、またはC#などのオブジェクト指向プログラミング言語でソフトウェアを書くことが望ましい場合が多い。例えば、図17の疑似コードにおいて、オブジェクト型(多くのオブジェクト指向言語ではクラスと呼ばれる)が名前MyObjectで定義される。getIncrementedFieldと呼ばれるメソッドが、MyObjectのデータ・アイテムfieldを読み出し、その値をインクリメントし、インクリメントされた値を返すMyObjectについて定義されている。
【0143】
特定のプロセッサ・コアに対してプライベートであるデータおよびプロセッサ・コア間で共有されるデータを考慮するようにオブジェクト指向プログラミング言語で書かれているソフトウェアを適応させる場合、プライベートであるオブジェクトおよび共有されているオブジェクトに対してそれぞれのメソッドを実装することが必要である。図17に示されている例では、これは、メソッドが作用するオブジェクトがプライベートであるか、または共有されているかを示す指定子とともに、getIncrementedField()メソッドを2回またはそれ以上の回数だけ書くことを必要とする場合がある。例えば、図17の疑似コードは、プログラム・パーティショニング・ツール21によって図18に示されている疑似コードを生成するように修正されうる。この方法で、MyObjectのインスタンスがアクセラレーション・セクション内でインスタンス化される場合、_private指定子を含むメソッドが使用されるが、MyObjectのインスタンスがアクセラレーション・セクションの外側でインスタンス化される場合、_shared指定子を含むメソッドが使用される。
【0144】
本発明の実施形態が、C++またはC#などのプログラミング言語で書かれているコンピュータ・プログラムを処理するように実装される場合、new、new[]、delete、delete[]演算子のアクセラレーション・セクション・バージョンは、アウター・クオリファイド・バージョンでオーバーロードされうる。これは、開発者が共有メモリに関連付けられているヒート・データからアクセラレータ・コアのローカルのメモリに関連付けられているヒープ・データを別々に管理することを可能にする。
【0145】
オーバーロードの解決は、共有メモリに関連付けられているdelete演算子のあるバージョンが_outerで限定されたポインタ上で呼び出されることを保証することができる。newの外部バージョンが呼び出される場合、_outer修飾子がnewキーワードの後に自動的に付加され、これにより、共有メモリ内に関連するオブジェクトを作成することになる。
【0146】
いくつかの場合において、new演算子の正しいバージョンが演算子に与えられるパラメータとより具体的にはそれらのパラメータが内部パラメータであるか外部パラメータであるかとに基づき推論されうるので、new演算子への呼び出しがnew演算子の外部バージョンを明示的に呼び出す必要はない。
【0147】
いくつかの場合において、両方の関数シグネチャが戻り型の点でのみ異なるので既定のアクセラレーション・セクションのnew演算子は既定のアクセラレーション・セクションの外部new演算子でオーバーロードされえないことを意味するオーバーロード規則が適用されうる。
【0148】
オブジェクト指向クラスに関する上述の問題は、型定義、例えば、structにも当てはまる。既定では、型定義内で定義されたポインタ、例えばC流の言語のtypedefステートメントで定義されたポインタは、共有メモリ11への外部ポインタである。このことは、そのような型定義が、ホスト・コア7とアクセラレータ・コア8、9、10の両方で実行されるコードによって使用できることを保証する。とは言っても、内部ポインタを有する型の定義を可能にすることは有益であり、したがって、そのような型はアクセラレータ・コア8、9、10のうちの1つのアクセラレータ・コア上で実行されるときにより効率的に使用されうる。内部ポインタの使用を有効にするために、型定義が複製され、これにより、外部ポインタを使用するバージョンと内部ポインタを使用するバージョンを備えることができる。型定義のそのような複製の結果、関数が複製され、これにより、外部ポインタを使用する型定義と内部ポインタを使用する型定義の両方で動作しうる、特定の関数のバージョンを構成することができることは理解されるであろう。
【0149】
関数ポインタまたは仮想メソッドでは、システムのユーザーは、複製されるべき一組の関数内に特定の関数が含まれなければならないことを指定する必要がある場合がある。代替的に、プログラム・パーティショニング・ツール21は、全体的なプログラム分析を使用してこの一組の関数を決定することができる。ビルド・ツール23は、システム内のそれぞれのプロセッサ・コアに対して正しいコンパイラ22およびリンカーを呼び出し、それぞれのアクセラレーション・セクションまたはデータ・オブジェクトに対する正しいメモリ・アクセス・セマンティクスに対し正しいランタイム・システムをリンクする。
【0150】
変換された関数を含む関数集合への参照としてプレースホルダ・システムを使用してリンク時まで複製されるべき一組の関数の指定を遅延させることが可能である。プレースホルダ・シンボルが表す一組の関数が、別のロケーションで定義され、別のコンパイル単位(つまり、コードの別々にコンパイルされたブロック)内に置かれる可能性がある。リンク時に、複製されるべき最終的な一組の関数が、他のコンパイル単位からの定義による指定に含まれるプレースホルダ・シンボルを解決することによってビルドされる。プレースホルダ・シンボルが複数回定義される場合、その最終的な一組の関数は、これらの定義の合併集合となりうる。プレースホルダ・シンボルが関数集合内に指定されているが、どのコンパイル単位にも定義されていない場合、ビルド・ツールは該当するエラーを発生させる。
【0151】
ビルド・ツール23は、関数が、最後のコンパイル以降に修正されている場合にのみ再コンパイルされるように保証することができ、これにより、修正後にプログラムを再コンパイルするのに要する時間を短縮する。
【0152】
関数が変換された後、関数は、他の同等の呼び出しサイト(例えば、同じコンテキスト・レベル内の同じ関数への呼び出し)から呼び出されるために利用可能である。したがって、すでに変換されている関数は、可能ならば、関数の不要な再変換を回避するために使用される。関数変換ツールは、内部ストア内にこれらのすでに変換されている関数を格納する必要がある。
【0153】
上述のメソッドが適用されるコンピュータ・プログラムは、複数のソース・コード・ファイル(コンパイル単位と称される)として出現することがあり、またこれらのファイルのそれぞれは個別に処理されうる。したがって、第1のソース・コード・ファイル内のアクセラレーション・セクションの内側で呼び出される関数は、異なる第2のソース・コード・ファイルにおいて定義されうる。関数が第2のソース・コード・ファイル内のアクセラレーション・セクション内から呼び出されない場合、プログラム・パーティショニング・ツールは、第2のソース・コード・ファイルを処理するときに、特定のアクセラレータ・コアに対して関数がコンパイルされなければならないと判定することができない。この結果、アクセラレータ・セクション内から関数の呼び出しが試みられるとリンク・エラーが発生しうる。これを回避するために、関数属性_duplicateが、必要ならば関数の複製を明示的にトリガーするために使用される。つまり、関数は、適切なアクセラレータ・コアに対してあるバージョンの関数がコンパイルされることを保証するために複製属性で限定されうるということである。
【0154】
複製属性は、コンパイラが複製を生成する関数シグネチャを指定するオプションの引数を有する。_duplicateへのパラメータがない場合、元の関数のシグネチャに含まれうるポインタおよび参照の型は、アクセラレーション・セクションの複製関数におけるローカル・ポインタ/参照型となり、上で説明されているように、ときには、内部変数と外部変数の組み合わせを使用して演算可能な特定の関数のバージョンを備えることが有益である。
【0155】
図19は、高水準の、関数の明示的関数複製を使用してプログラムのコンパイルのためのアルゴリズムを示す流れ図である。以下の説明では、「コンパイル単位」という用語は、個別に処理されたソース・コードを示すために使用される。
【0156】
ステップS1で、コンパイルされるべき一組のコンパイル単位内のコンパイル単位が選択される。ステップS2で、選択されたコンパイル単位内の関数が選択される。ステップS3で、選択された関数が、例えば図5に示されている関数speedyFunctionなどのアクセラレーション関数であるかどうかが判定される。選択された関数がアクセラレーション関数ではないと判定された場合、処理はステップS4に進み、そこで、選択された関数がどれかのアクセラレーション・セクションを含むかどうかが判定される。ステップS4で、選択された関数が1つまたは複数のアクセラレーション・セクションを含むと判定された場合、処理はステップS5に進み、そこで、選択された関数内のアクセラレーション・セクションが選択される。
【0157】
処理はステップS5からステップS6に進み、そこで、選択されたアクセラレーション・セクション内のコードによって呼び出される関数に対して呼び出しグラフが構築される。次いで、処理はステップS7に進み、そこで、呼び出しグラフ内に指示されている関数のそれぞれが、アクセラレーション・セクションが関連付けられているアクセラレータ・コア8、9、10上で実行されるようにコンパイルされる。ステップS7から、処理はステップS8へ進み、そこで、アクセラレーション・セクションの本体が適切なアクセラレータ・コア8、9、10上で実行されるようにコンパイルされる。
【0158】
次いで、処理はステップS9に進み、そこで、選択されたアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションであるかどうかが判定される。選択されたアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションではないと判定された場合、処理はステップS5に戻り、選択された関数内の次のアクセラレーション・セクションが選択される。
【0159】
その一方で、ステップS9で、選択されたアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションであると判定された場合、処理はステップS10に進み、そこで、選択された関数内の残りのコード(つまり、アクセラレーション・セクション内にないコード)が、ホスト・プロセッサ7上で実行されるようにコンパイルされる。
【0160】
ステップS10から処理がステップS11に進み、そこで、選択された関数が現在選択されているコンパイル単位内の最後の関数であるかどうかが判定される。選択された関数が現在選択されているコンパイル単位内の最後の関数ではないと判定された場合、処理はステップS2に戻り、現在選択されているコンパイル単位内の次の関数が選択される。
【0161】
その一方で、ステップS11で、選択された関数が現在選択されているコンパイル単位内の最後の関数であると判定された場合、処理はステップS12に進み、そこで、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であるかどうかが判定される。現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位でないと判定された場合、処理はステップS1に戻り、コンパイルされるべき次のコンパイル単位が選択される。その一方で、ステップS12において、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であると判定された場合、処理はステップS13で終了する。
【0162】
ステップS3で、選択された関数がアクセラレーション関数であると判定された場合、処理はステップS14に進み、そこで、選択された関数がアクセラレータ・コア8、9、10のうちの適切な1つのアクセラレータ・コア上で実行されるようにコンパイルされる。処理はステップS14からステップS11に進む。
【0163】
ステップS4で、選択された関数がどのアクセラレーション関数も含まないと判定された場合、処理はステップS15に進み、そこで、選択された関数がホスト・プロセッサ7上で実行されるようにコンパイルされる。処理はステップS15からステップS16に進み、そこで、選択された関数が例えば上述の_duplicate修飾子を使用して関数複製に関して明示的に注釈を入れられるかどうかが判定される。選択された関数が複製に関して注釈を入れられないと判定された場合、処理はステップS16からステップS11に進む。その一方で、ステップS16で、関数が複製に関して注釈を入れられると判定された場合、処理はステップS17に進み、選択された関数がアクセラレータ・プロセッサ上で実行されるようにコンパイルされる。処理はステップS17からステップS11に進む。
【0164】
図19を参照しつつ上で説明されているメソッドでは、関数がアクセラレーション・セクションを有せず、それ自体アクセラレーション関数でないと判定された場合にのみ_duplicate修飾子を使用することは理解されるであろう。関数がアクセラレーション関数である場合に複製修飾子を使用するために説明されているメソッドに修正を加えることができることは理解されるであろうが、代替的アクセラレータ・コア上で実行されるように関数をコンパイルすることによって関数を複製することが望ましい。
【0165】
上で図19を参照しつつ説明されている処理は、コンパイル・プロセスにおけるコンパイル単位の独立性を取り扱い、アクセラレータ・プロセッサ上で実行されなければならないコードのセクションがアクセラレータ・プロセッサ上で実行されるように正しく変換されることを保証する。コンパイル単位の独立したコンパイルが行われるとした場合、複製は、複製修飾子を使用する注釈を介したプログラマーの明示的な命令を除き翻訳単位の境界をまたがない。
【0166】
複製について関数に注釈を入れる必要性を回避する複製のアプローチは、コンパイラが、特定のコンパイル単位のコンパイル時に、未解決の複製関数、つまり、本体が現在のコンパイル単位内にない複製を必要とする関数を識別し、非ローカル関数の必要な複製を生成するために依存関係を再コンパイルすることができる場合に達成される。図20は、異なるコンパイル単位内の関数を識別し、再コンパイルするために実行される処理を示す流れ図である。
【0167】
ステップS25で、コンパイルされるべき一組のコンパイル単位内のコンパイル単位が選択される。ステップS26で、選択されたコンパイル単位内の関数が選択される。ステップS27で、選択された関数がアクセラレーション関数であるかどうかが判定される。選択された関数がアクセラレーション関数ではないと判定された場合、処理はステップS28に進み、そこで、選択された関数がどれかのアクセラレーション・セクションを含むかどうかが判定される。ステップS28で、選択された関数が1つまたは複数のアクセラレーション・セクションを含むと判定された場合、処理はステップS29に進み、そこで、選択された関数内の第1のアクセラレーション・セクションが選択される。
【0168】
処理はステップS29からステップS30に進み、そこで、選択されたアクセラレーション・セクション内のコードによって呼び出される関数に対して呼び出しグラフが構築される。次いで、処理はステップS31に進み、そこで、ステップS31で作成された呼び出しグラフ内の関数が選択される。次いで、処理はステップS32に進み、そこで、ステップS31で選択された関数が現在のコンパイル単位の一部であるかどうかが判定される。ステップS31のグラフで選択された関数が現在のコンパイル単位の一部であると判定された場合、処理はステップS33に進み、そこで、ステップS31で選択された関数がアクセラレータ・コア8、9、10のうちの適切な1つのアクセラレータ・コアに対してにコンパイルされる。処理はステップS33からステップS34に進み、そこで、選択された関数が呼び出しグラフ内の最後の関数であるかどうかが判定される。選択された関数が呼び出しグラフ内の最後の関数ではないと判定された場合、処理はステップS31に戻り、呼び出しグラフ内の次の関数が選択される。
【0169】
ステップS32で、呼び出しグラフから選択された関数が、現在のコンパイル単位内にないと判定された場合、処理はステップS35に進み、そこで、ステップS31で選択された関数を含むコンパイル単位が決定され選択される。処理はステップS35からステップS36に進み、そこで、ステップS31で選択された関数がステップS35で選択されたコンパイル単位内から選択される。次いで、処理はステップS37に進み、ステップS31で選択された関数がアクセラレーション・プロセッサ8、9、10上で実行されるようにコンパイルされる。処理はステップS37からステップS34に進む。
【0170】
ステップS34で、ステップS31で選択された関数が呼び出しグラフ内の最後の関数であると判定された場合、処理はステップS38に進み、そこで、選択されたアクセラレーション・セクションの本体がアクセラレータ・コア8、9、10のうちの適切な1つのアクセラレータ・コア上で実行されるようにコンパイルされる。
【0171】
次いで、処理はステップS38からステップS39に進み、そこで、現在選択されているアクセラレーション・セクション(ステップS29で選択された)が現在選択されている関数(ステップS26で選択された)内の最後のアクセラレーション・セクションであるかどうかが判定される。現在選択されているアクセラレーション・セクションが現在選択されている関数内の最後のアクセラレーション・セクションではないと判定された場合、処理はステップS29に戻り、次のアクセラレーション・セクションが選択される。その一方で、ステップS39で、現在のアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションであると判定された場合、処理はステップS40に進み、そこで、選択された関数内の残りのコード(つまり、アクセラレーション・セクション内にないコード)が、ホスト・プロセッサ7上で実行されるようにコンパイルされる。
【0172】
ステップS40から処理がステップS41に進み、そこで、選択された関数が現在選択されているコンパイル単位内の最後の関数であるかどうかが判定される。選択された関数が現在選択されているコンパイル単位内の最後の関数ではないと判定された場合、処理はステップS26に進み、現在選択されているコンパイル単位内の次の関数が選択される。
【0173】
その一方で、ステップS41で、選択された関数が現在選択されているコンパイル単位内の最後の関数であると判定された場合、処理はステップS42に進み、そこで、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であるかどうかが判定される。現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位でないと判定された場合、処理はステップS25に進み、コンパイルされるべき次のコンパイル単位が選択される。その一方で、ステップS42において、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であると判定された場合、処理はステップS43で終了する。
【0174】
ステップS27で、選択された関数がアクセラレーション関数であると判定された場合、処理はステップS44に進み、そこで、選択された関数がアクセラレータ・プロセッサ8、9、10上で実行されるようにコンパイルされる。処理はステップS44からステップS41に進む。
【0175】
ステップS28で、選択された関数がどのアクセラレーション関数も含まないと判定された場合、処理はステップS45に進み、そこで、選択された関数がホスト・プロセッサ7上で実行されるようにコンパイルされる。処理はステップS45からステップS41に進む。
【0176】
処理されているが、変換されてはいないプログラム・ソース全体の中の関数のすべてをディスクに保存することによって、関数は、必要に応じて、ただ単に単一のコンパイル単位ではなく、プログラム全体にわたって変換されうる。すでに変換されている関数およびその元ソースのストアを維持することによって、前のコンパイルで変換されていなかった、または前のコンパイル以降に変化した関数のみを変換することが可能である。
【0177】
関数がアクセラレーション・セクションから呼び出されるが、呼び出される関数のソース・コードが利用可能でない場合、関数は呼び出される関数がコンパイルされたコンテキストにおいて実行される必要がある。例えば、関数がレベル0(ホスト・レベル)についてコンパイルされ、アクセラレーション・セクション・レベル1から呼び出された場合、呼び出される関数への呼び出しは、ホスト・コア7を介してディスパッチされうる。このメカニズムは、さらに多くのアクセラレーション・セクションを生成するために使用され、これにより、アクセラレータ・コアの利用がなおいっそう改善し、ひいては並列性が向上し、消費電力がさらに低減しうる。つまり、呼び出される関数が特定のアクセラレータ・コアについてのみコンパイルされる場合、その関数は、そのアクセラレータ・コア上で、アクセラレータ・コアのうちの別の1つのアクセラレータ・コア上で実行されるコードから実行させられうる。これは、呼び出しに対する引数が関連するプロセッサ・コアへのメッセージ・パッシング・システムを介して送信される遠隔呼び出しを使用して達成されうる。
【0178】
Cell BEプロセッサなどのプロセッサにおいて、コスト・プロセス・コアが通常のメモリ・アクセス・セマンティクスを有し、アクセラレータ・プロセッサ・コアがローカル・メモリを有し、共有メモリへのDMAアクセスを行える場合、どのアクセラレーション・セクションであってもその外部にあるコードは、システムを通じて受け渡され予想通りに動作しなければならない。アクセラレーション・セクションの内側にあるコードは、アクセラレータ・コア上で実行されるように変換される関数に変換されなければならない。アクセラレータ・コア上でコードの実行を開始するために、アクセラレーション・セクションを含む関数は、変換された関数の呼び出しグラフ全体をアクセラレータ・コア上にロードするランタイム関数を呼び出し、アクセラレーション・セクションの本体を表す変換された関数を呼び出すためにアクセラレータ・プロセッサ上で関数呼び出しを発行しなければならない。これを達成するために、ビルド・ツール23は、変換される関数の呼び出しグラフを必要に応じてアクセラレータ・コア上にコピーするようになされたコードを備える。
【0179】
アクセラレーション・セクション内では、DMAなどのアクセラレータ特有の機能が使用されうる。このような機能は、型付けされていない、したがって、比較的安全でない(プログラミングの意味で)可能性があるが、プログラマーには高い性能をもたらしうる。ソース・コード・プリプロセッサは、アクセラレーション・セクション内のコードを分析することができ、DMAなどの機能がより効果的に使用されることを可能にするプログラム・コードへの手動または自動化された変更を提案するアドバイスをプログラマーに提供する。
【0180】
自動化された変更の場合、特定のデータ・アクセス・セマンティクス(例えば、ソフトウェア・キャッシング)を使用して実行されたときに不効率であるホスト・メモリ内のデータへのアクセス・パターンが検出される。そのような一アクセス・パターンは、外部ポインタ算術演算およびそのポインタ算術演算によって指示されるメモリ・ロケーションでのアクセスを使用して、ホスト・メモリ内の配列からアイテムのシーケンスを読み出すことを伴いうる。このような場合、命令のシーケンスが生成され、ポインタ算術演算およびデリファレンス・アクセスを型安全で効率的なDMAアクセスで置き換えるように入力ソース・コードを修正するようになされたツールに与えられるようにできる。
【0181】
DMA機能が使用される際に用いられる型安全なインターフェイスを構成するためにC++テンプレート・クラスが使用される。演算子オーバーロードは、コード内の外部ポインタの代わりに、適切な型パラメータでパラメータ化されている、このクラスのインスタンスを使用することを可能にする。アクセス・パターンに応じて、異なるC++テンプレートがインスタンス化されうる。このようなテンプレートは、オンデマンドでリードもしくはライトを実行するか、またはホスト・メモリからの外部配列をアクセラレータ・メモリ内にキャッシュすることができる。
【0182】
効率を改善するために使用されうる自動化されたコード修正の別の例は、アクセラレーション・セクション・ブロックのパラメータ・リストにローカル変数を追加することを伴う。
【0183】
上で説明されている型の自動化されたソース・コード修正は、都合のよいどの方法でも実装されうることは理解されるであろう。例えば、コンピュータ・プログラムは、入力として、元のソース・コードおよびソース・コード・プリプロセッサによって生成された命令のシーケンスを受け取ることができる。次いで、このようなコンピュータ・プログラムは、修正されたソース・コードを出力する。そのような修正を実行するようになされたコンピュータ・プログラムは、既存のソース・コード開発環境へのプラグインを使って都合よく形成されうる。
【0184】
図21は、本発明の一実施形態によって処理されたコードが実行されうるプロセッサ配置構成を示している。ホスト処理ユニット30は、ホスト・プロセッサ・コア31とホスト・メモリ32とを備える。ローカル・メモリ34を有するアクセラレータ・プロセッサ33は、外部バス35によってホスト処理ユニット30に接続される。アクセラレータ・コア33は、DMAコマンドを使用してホスト・メモリ32内に格納されているデータにアクセスすることができる。これを行うために、ホスト・プロセッサ・コア31は、最初に、ホスト・メモリ32内のデータ・バッファ内にデータを用意し、データ・バッファの内容はアクセラレータ・プロセッサ33によってアクセス可能である。
【0185】
このような配置構成を都合よく可能にするために、2つの入れ子になったアクセラレーション・セクションが、図22のコードに示されていうように使用されうる。ここで、コード40は、アクセラレーション・セクションの外側にあり、ホスト・プロセッサ・コア31上で実行される。第1のレベルのアクセラレーション・セクション41内のコードは、アクセラレータ・プロセッサ33からアクセス可能なデータ・バッファ内にデータをコピーするようになされている。第2のレベルのアクセラレーション・セクション42内のコードは、アクセラレータ・プロセッサ33上で実行され、ローカル・メモリ34内のデータにアクセスする内部変数を使用する。
【0186】
次に図23を参照すると、コード40がホスト・メモリ32にアクセスすることが分かる。第1のレベルのアクセラレーション・セクション41内のコードは、DMAを使用してアクセラレータ・プロセッサ33からアクセス可能なデータ・バッファを備えるホスト・メモリ32の領域43にアクセスする。第2レベルのアクセラレーション・セクション内のコードは、ローカル・メモリ34を使用する。
【0187】
図22のコードをさらに詳しく見ると、行4において、ホスト・メモリ32に格納される変数が宣言されることがわかる。行7において、第1のレベルのアクセラレーション・セクション41内で、行4で宣言された変数の値に初期化される変数が宣言されていることがわかる。行7の宣言が第1のレベルのアクセラレーション・セクション内にあるとすれば、宣言された変数は、ホスト・メモリ32の領域43内に格納される。
【0188】
第2のレベルのアクセラレーション・セクション42内では、行8でさらなる変数が宣言される。ここで、その変数は、第2のレベルのアクセラレーション・セクション内にあるため、ローカル・メモリ34内に作成される。作成された変数は、行7で作成された変数を使用して(つまり、ホスト・メモリ32の領域43からのデータを使って)初期化される。
【0189】
行11では、行7で作成された変数が行10で初期化された変数の値に等しくなるように設定される。このようにして、データはホスト・メモリ32の領域43に書き込まれる、つまり、データはDMAを使用してホスト・メモリに書き戻される。
【0190】
いくつかの実施態様では、コンパイラ22は、従来のコンパイラである。したがって、本明細書で説明されているメソッドは、そのような従来のコンパイラを使用してコンパイルすることができるコードを備える。このことを念頭に置くと、プログラム・データのサイズ、順序、アライメント、パディング、およびバイト順を含むメモリ内のデータの配置構成が重要なものとなりうる。
【0191】
本発明の実施形態を使用して処理されるソース・コードは、標準ライブラリ関数を使用することができる。ソース・コードがプロセッサ・コアのうちのどれか1つのプロセッサ・コア上で実行されうるとすると、そのようなライブラリ関数がそれぞれのプロセッサ・コア上での実行に利用可能にされることが好ましい。
【0192】
したがって、本発明の実施形態は、コンパイル時にプログラムの型に対するデータ・レイアウトの特性に関するアサーションを生成することができる。これらのアサーションは、集成体型のサイズおよびアライメント、ならびにコンポーネントのオフセットに対する静的アサーションを表す。C++のプログラム・テキストの形態をとることができる。これらのアサーションをプログラム・テキストに組み込み、従来のコンパイラを使ってコンパイルすることで、相互運用性が保証される。
【0193】
前記の説明では、アクセラレーション・セクション内の特定のコードが特定のプロセッサ・コア上で実行されることを引き起こすためにアクセラレーション・セクションがソース・コード内でどのように指定できるかを説明した。アクセラレーション・セクションが適切に取り扱われるようにするために、ソース・コードはいくつかの基本的制約条件を満たしていなければならない。例えば、ソース・コードは、ローカル・ジャンプ(例えば、goto)およびアクセラレーション・セクション境界をまたぐロング・ジャンプ・コマンドを含むことはできない。このような制約条件は、ソース・コード前処理ツール20によって強制されうる。
【0194】
前記の説明では、システムのさまざまなコンポーネント間のタスクの分離について説明しているが、上述のタスクは都合のよい任意の方法でシステムのさまざまなコンポーネント間で分離されうることは理解されるであろう。例えば、ソース・コード・プリプロセッサ20は、構文および型に関する検査を実行するものとして説明されているが、そのような検査は、代わりに、プログラム・パーティショニング・ツール21によっても実行されうる。
【0195】
前記の説明では、複数のプロセッサ・コア上でソース・コードを実行させるために特定の構成体をそのソース・コードにどのように適用できるかを説明している。入力として修正されたソース・コードをとり、説明されている構成体を取り除くプリプロセッサが用意され、これにより、ソース・コードが実行のため都合よく処理されうる。このようにして、ソース・コードの可搬性が維持される。
【0196】
本発明のさまざまな特徴が、C++風の疑似コードを参照しつつ説明されているが、本明細書で説明されている方法は、好適な任意のプログラミング言語適用されうることは理解されるであろう。したがって、前記の説明では関数への参照がなされているが、関数という用語は、オブジェクト指向の意味でのメソッドの類似の構成体、プロシージャ、およびサブルーチンを包含することが意図されていることは理解されるであろう。
【0197】
本明細書で取りあげた例では特定の修飾子およびキーワードが使用されているが、本発明の実施形態は、好適な任意の修飾子およびキーワードを使用して実装されうることも理解されるであろう。
【0198】
前記の説明においてプロセッサ・コアへの参照がなされている場合、説明されているメソッドは、コードが複数の個別のプロセッサにまたがって実行され、コードの異なる部分がプロセッサのうちの異なる1つのプロセッサによって実行される場合に使用するのに適していることは理解されるであろう。
【特許請求の範囲】
【請求項1】
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法であって、
前記処理要素のうちの特定の1つの処理要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別するステップと、
前記コンピュータ・コードの前記少なくとも1つの第1の部分に関係する前記コンピュータ・コードの少なくとも1つのさらなる部分を識別するステップと、
前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの特定の1つの処理要素によって実行されることを引き起こすステップとを含む方法。
【請求項2】
前記処理要素のそれぞれは、各型を有し、
前記処理要素のうちの特定の1つの要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別するステップは、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分が実行されるべき特定の型の処理要素を識別するステップを含み、
前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの前記特定の1つの処理要素によって実行されることを引き起こすステップは、前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記特定の型を有する前記処理要素のうちの1つの処理要素によって実行されることを引き起こすステップを含む請求項1に記載の方法。
【請求項3】
複数の前記処理要素は、前記特定の型を有し、
前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記特定の型を有する前記処理要素のうちの1つの処理要素によって実行されることを引き起こすステップは、前記特定の型を有する前記複数の処理要素のうちの1つの処理要素を選択するステップをさらに含む請求項2に記載の方法。
【請求項4】
前記コンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別するステップは、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分が前記処理要素のうちの前記特定の1つの処理要素によって実行されるべきであることを示す少なくとも1つのプログラム構成体を識別するステップを含む請求項1から3のいずれか1項に記載の方法。
【請求項5】
前記コンピュータ・プログラム・コードの前記さらなる部分は、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分において参照される請求項1から4のいずれか1項に記載の方法。
【請求項6】
前記コンピュータ・プログラム・コードの前記さらなる部分は、関数であり、前記関数は、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分から呼び出される請求項5に記載の方法。
【請求項7】
前記関数は、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分から間接的に呼び出される請求項6に記載の方法。
【請求項8】
前記コンピュータ・プログラム・コードの前記さらなる部分への前記参照は、仮想関数への呼び出しであり、前記コンピュータ・プログラム・コードの前記さらなる部分は、前記仮想関数の一実装である請求項7に記載の方法。
【請求項9】
前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分は、前記関数への参照を受け取り、前記参照を受け取ったことに応答して前記関数を呼び出すようになされている請求項7に記載の方法。
【請求項10】
前記引き起こすステップは、前記処理要素のうちの特定の1つの処理要素に対して前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分をコンパイルするステップを含む請求項1から9のいずれか1項に記載の方法。
【請求項11】
複数の前記処理要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも1つの第2の部分を識別するステップと、
前記コンピュータ・プログラム・コードの前記第2の部分が前記複数の前記処理要素によって実行されることを引き起こすステップをさらに含む請求項1から10のいずれか1項に記載の方法。
【請求項12】
前記コンピュータ・プログラム・コードは、前記コンピュータ・プログラム・コードの前記第2の部分への第1および第2の参照を含み、前記コンピュータ・プログラム・コードの前記第2の部分が前記複数の前記処理要素によって実行されることを引き起こすステップは、前記コンピュータ・プログラム・コードの前記第2の部分が前記第1の参照への応答として第1の処理要素上で、また前記第2の参照への応答として第2の処理要素上で実行されることを引き起こすステップを含む請求項11に記載の方法。
【請求項13】
前記第1の処理要素は、処理要素が前記第1の参照を実行することに基づいて決定され、前記第2の処理要素は、処理要素が前記第2の参照を実行することに基づいて決定される請求項12に記載の方法。
【請求項14】
前記複数の処理要素は、複数の記憶域内に格納されているデータにアクセスし、
前記引き起こすステップは、前記複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分を修正するステップを含む請求項1から13のいずれか1項に記載の方法。
【請求項15】
前記コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを含み、前記修正するステップは、前記コンテキスト・レベルに基づき少なくとも1つのメモリ・アクセス・オペレーションを修正するステップを含む請求項14に記載の方法。
【請求項16】
少なくとも1つのメモリ・アクセス・オペレーションを前記修正するステップは、前記メモリ・アクセス・オペレーションに関連付けられているデータ・アイテムが宣言され、前記メモリ・アクセス・オペレーションが実行される相対的なコンテキスト・レベルに基づく請求項15に記載の方法。
【請求項17】
それぞれのコンテキスト・レベルは、関連付けられている記憶域を有し、前記修正するステップは、第2のコンテキスト・レベルに関連付けられている記憶域内のデータにアクセスする第1のコンテキスト・レベルにおけるメモリ・アクセス・オペレーションを修正するステップを含み、前記第2のコンテキスト・レベルは前記第1のコンテキスト・レベルと明確に区別される請求項16に記載の方法。
【請求項18】
前記修正するステップは、前記第2のコンテキスト・レベルに関連付けられているソフトウェア実装キャッシュにアクセスするように前記第1のコンテキスト・レベルにおける前記メモリ・アクセス・オペレーションを修正するステップを含む請求項17に記載の方法。
【請求項19】
前記修正するステップは、前記メモリ・アクセス・オペレーションがソフトウェア・トランザクション・メモリ技術を使用して実行されるように前記メモリ・アクセス・オペレーションを修正するステップを含む請求項17に記載の方法。
【請求項20】
前記修正するステップは、前記メモリ・アクセス・オペレーションがコンピュータ・ネットワーク上のデータ転送を使用して実行されるように前記メモリ・アクセス・オペレーションを修正するステップを含む請求項17に記載の方法。
【請求項21】
特定のコンテキスト・レベルに関連付けられている記憶空間については、その記憶空間内に格納されているデータは、自動メモリ管理を受ける請求項16または17に記載の方法。
【請求項22】
前記自動メモリ管理は、ガーベジ・コレクションを含む請求項21に記載の方法。
【請求項23】
前記修正するステップは、前記第2の異なるコンテキスト・レベルに関連付けられている前記記憶域の識別子を前記メモリ・アクセス・オペレーションに追加するステップを含む請求項17またはこれに従属する請求項に記載の方法。
【請求項24】
前記コンピュータ・プログラムの前記さらなる部分は、少なくとも2回、前記コンピュータ・プログラム・コードにおいて参照され、それぞれの参照は各メモリ・アクセス・オペレーションを含み、
前記方法は、第1の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第1の修正を作成するステップと、第2の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第2の修正を作成するステップとをさらに含む請求項1から23のいずれか1項に記載の方法。
【請求項25】
前記複数の処理要素は、複数の記憶域内に格納されているデータにアクセスし、前記第1のメモリ・アクセス・オペレーションは、第1の記憶域内のデータにアクセスし、前記第2のメモリ・アクセス・オペレーションは、第2の異なる記憶域内のデータにアクセスする請求項24に記載の方法。
【請求項26】
前記コンピュータ・プログラム・コードの前記さらなる部分の前記第1の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への前記第1の参照を処理するステップと、
前記コンピュータ・プログラム・コードの前記さらなる部分の前記第2の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への前記第2の参照を処理するステップとをさらに含む請求項24または25に記載の方法。
【請求項27】
前記コンピュータ・プログラム・コードの前記第1の部分およびさらなる部分のコピーを作成するステップをさらに含み、
前記引き起こすステップは、前記複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第1の部分の前記コピーおよび前記コンピュータ・プログラム・コードの前記さらなる部分の前記コピーを修正するステップを含む請求項1から26のいずれか1項に記載の方法。
【請求項28】
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法であって、前記コンピュータ・プログラム・コードは、複数のデータ・アイテムを参照し、少なくとも1つのデータ・アイテムが特定の処理要素のローカルにあるメモリ内に格納され、少なくとも別のデータ・アイテムが複数の処理要素間で共有されるメモリ内に格納され、
前記データ・アイテムのうちの第1のデータ・アイテムへの参照を含む前記コンピュータ・プログラム・コードの第1の部分を処理するステップと、
前記第1のデータ・アイテムが格納されているメモリを決定するステップと、
前記決定されたメモリを示すように前記コンピュータ・プログラム・コードを修正するステップとを含む方法。
【請求項29】
前記コンピュータ・プログラム・コードの前記第1の部分は、第1の処理要素上で実行されるべきであり、前記決定するステップは、前記第1のデータ・アイテムが前記第1の処理要上で実行されるものとして前記コンピュータ・プログラム・コードの一部において宣言されているかどうかを判定するステップを含む請求項28に記載の方法。
【請求項30】
前記コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを定義し、前記第1のデータ・アイテムが格納されるメモリを決定するステップは、前記第1のデータ・アイテムが宣言されるコンテキスト・レベルを決定するステップを含む請求項28または29に記載の方法。
【請求項31】
前記修正するステップは、前記コンピュータ・プログラム・コードの前記第1の部分が前記第1のデータ・アイテムが宣言されているコンテキスト・レベルと異なるコンテキスト・レベルで出現する場合、ただしその場合に限り実行される請求項30に記載の方法。
【請求項32】
複数のデータ・アイテムへの前記参照は、静的ポインタまたは動的ポインタである請求項28から31のいずれか1項に記載の方法。
【請求項33】
前記修正するステップが、
前記第1のデータ・アイテムへの前記参照の複製を作成するステップと、
前記決定されたメモリを示すように前記複製を修正するステップとを含む請求項30または32に記載の方法。
【請求項34】
前記決定されたメモリを示すように前記複製を前記修正するステップは、前記決定されたメモリに関連付けられている前記コンテキスト・レベルを示すように前記複製を修正するステップを含む請求項33に記載の方法。
【請求項35】
前記決定されたメモリに関連付けられている前記コンテキスト・レベルの指示は、前記コンピュータ・プログラム・コードの前記第1の部分が出現するコンテキスト・レベルの指示である請求項34に記載の方法。
【請求項36】
前記複数のデータ・アイテム内の少なくとも1つのデータ・アイテムは、関数である請求項28から35のいずれか1項に記載の方法。
【請求項37】
複数のメモリを備えるシステム内で実行されるべきコンピュータ・プログラム・コードの構文上の正しさを判定するための方法であって、
第1のポインタ・データ・アイテムを第2のポインタ・データ・アイテムの値に割り当てる第1のステートメントを識別するステップと、
前記第1および第2のポインタ・データ・アイテムがそれぞれ共通メモリ内のメモリ・ロケーションを識別するかどうかを判定するステップと、
前記第1および第2のポインタ・データ・アイテムが共通メモリ内のメモリ・ロケーションを識別しないと判定された場合に、エラーを示すステップとを含む方法。
【請求項38】
コンピュータ・プログラム・コードが複数の処理要素にまたがって実行されることを引き起こすように前記コンピュータ・プログラム・コードを処理するための方法であって、
前記コンピュータ・コードの前記部分が特定の処理要素上で実行されなければならないことを示すように前記コンピュータ・プログラム・コードの少なくとも1つの部分に修飾子をアタッチするステップを含む方法。
【請求項39】
前記処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、単一の処理要素上で実行されるようになされる請求項38に記載の方法。
【請求項40】
前記処理要素のそれぞれは、各型を有し、前記処理要素の少なくとも2つは、異なる型を有し、
前記処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、それぞれ同じ型を有する複数の処理要素にまたがって実行されるようになされる請求項38に記載の方法。
【請求項41】
前記コンピュータ・プログラム・コードは、単一の処理要素上で実行されることが意図されている少なくとも1つの制御の流れを定義し、前記修飾子は、前記単一の制御の流れの一部が別の処理要素上で実行されることを引き起こす請求項39に記載の方法。
【請求項42】
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法であって、
前記コンピュータ・プログラム・コードの一組の部分が前記処理要素のうちの特定の1つの処理要素によって実行されるように修正されることを指示するステップを含む方法。
【請求項43】
前記一組の部分は、前記指示に基づきリンク時に識別される請求項42に記載の方法。
【請求項44】
前記処理要素は、プロセッサである請求項1から43のいずれか1項に記載の方法。
【請求項45】
前記処理要素は、マルチ・コア・プロセッサのプロセッサ・コアである請求項1から43のいずれか1項に記載の方法。
【請求項46】
コンピュータ・プログラム・コードを複数の記憶空間を備える環境内で実行するのに適したコードにするための方法であって、前記コンピュータ・プログラム・コードは、前記記憶空間のうちの1つの記憶空間への参照を含む少なくとも1つの型定義を備え、
前記記憶空間のうちの前記1つの記憶空間への前記参照を前記記憶空間のうちの別の1つの記憶空間への参照と置き換えることによって前記型定義のコピーを作成するステップを含む方法。
【請求項47】
前記型定義は、struct型、union型、またはクラスのうちの1つを定義する請求項46に記載の方法。
【請求項48】
コンピュータが請求項1から47のいずれか1項に記載の方法を実行することを引き起こすようになされたコンピュータ可読命令を備えるコンピュータ・プログラム。
【請求項49】
請求項48に記載のコンピュータ・プログラムを収めるコンピュータ可読媒体。
【請求項1】
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法であって、
前記処理要素のうちの特定の1つの処理要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別するステップと、
前記コンピュータ・コードの前記少なくとも1つの第1の部分に関係する前記コンピュータ・コードの少なくとも1つのさらなる部分を識別するステップと、
前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの特定の1つの処理要素によって実行されることを引き起こすステップとを含む方法。
【請求項2】
前記処理要素のそれぞれは、各型を有し、
前記処理要素のうちの特定の1つの要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別するステップは、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分が実行されるべき特定の型の処理要素を識別するステップを含み、
前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの前記特定の1つの処理要素によって実行されることを引き起こすステップは、前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記特定の型を有する前記処理要素のうちの1つの処理要素によって実行されることを引き起こすステップを含む請求項1に記載の方法。
【請求項3】
複数の前記処理要素は、前記特定の型を有し、
前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記特定の型を有する前記処理要素のうちの1つの処理要素によって実行されることを引き起こすステップは、前記特定の型を有する前記複数の処理要素のうちの1つの処理要素を選択するステップをさらに含む請求項2に記載の方法。
【請求項4】
前記コンピュータ・プログラム・コードの少なくとも1つの第1の部分を識別するステップは、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分が前記処理要素のうちの前記特定の1つの処理要素によって実行されるべきであることを示す少なくとも1つのプログラム構成体を識別するステップを含む請求項1から3のいずれか1項に記載の方法。
【請求項5】
前記コンピュータ・プログラム・コードの前記さらなる部分は、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分において参照される請求項1から4のいずれか1項に記載の方法。
【請求項6】
前記コンピュータ・プログラム・コードの前記さらなる部分は、関数であり、前記関数は、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分から呼び出される請求項5に記載の方法。
【請求項7】
前記関数は、前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分から間接的に呼び出される請求項6に記載の方法。
【請求項8】
前記コンピュータ・プログラム・コードの前記さらなる部分への前記参照は、仮想関数への呼び出しであり、前記コンピュータ・プログラム・コードの前記さらなる部分は、前記仮想関数の一実装である請求項7に記載の方法。
【請求項9】
前記コンピュータ・プログラム・コードの前記少なくとも1つの第1の部分は、前記関数への参照を受け取り、前記参照を受け取ったことに応答して前記関数を呼び出すようになされている請求項7に記載の方法。
【請求項10】
前記引き起こすステップは、前記処理要素のうちの特定の1つの処理要素に対して前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分をコンパイルするステップを含む請求項1から9のいずれか1項に記載の方法。
【請求項11】
複数の前記処理要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも1つの第2の部分を識別するステップと、
前記コンピュータ・プログラム・コードの前記第2の部分が前記複数の前記処理要素によって実行されることを引き起こすステップをさらに含む請求項1から10のいずれか1項に記載の方法。
【請求項12】
前記コンピュータ・プログラム・コードは、前記コンピュータ・プログラム・コードの前記第2の部分への第1および第2の参照を含み、前記コンピュータ・プログラム・コードの前記第2の部分が前記複数の前記処理要素によって実行されることを引き起こすステップは、前記コンピュータ・プログラム・コードの前記第2の部分が前記第1の参照への応答として第1の処理要素上で、また前記第2の参照への応答として第2の処理要素上で実行されることを引き起こすステップを含む請求項11に記載の方法。
【請求項13】
前記第1の処理要素は、処理要素が前記第1の参照を実行することに基づいて決定され、前記第2の処理要素は、処理要素が前記第2の参照を実行することに基づいて決定される請求項12に記載の方法。
【請求項14】
前記複数の処理要素は、複数の記憶域内に格納されているデータにアクセスし、
前記引き起こすステップは、前記複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第1の部分および前記コンピュータ・プログラム・コードの前記さらなる部分を修正するステップを含む請求項1から13のいずれか1項に記載の方法。
【請求項15】
前記コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを含み、前記修正するステップは、前記コンテキスト・レベルに基づき少なくとも1つのメモリ・アクセス・オペレーションを修正するステップを含む請求項14に記載の方法。
【請求項16】
少なくとも1つのメモリ・アクセス・オペレーションを前記修正するステップは、前記メモリ・アクセス・オペレーションに関連付けられているデータ・アイテムが宣言され、前記メモリ・アクセス・オペレーションが実行される相対的なコンテキスト・レベルに基づく請求項15に記載の方法。
【請求項17】
それぞれのコンテキスト・レベルは、関連付けられている記憶域を有し、前記修正するステップは、第2のコンテキスト・レベルに関連付けられている記憶域内のデータにアクセスする第1のコンテキスト・レベルにおけるメモリ・アクセス・オペレーションを修正するステップを含み、前記第2のコンテキスト・レベルは前記第1のコンテキスト・レベルと明確に区別される請求項16に記載の方法。
【請求項18】
前記修正するステップは、前記第2のコンテキスト・レベルに関連付けられているソフトウェア実装キャッシュにアクセスするように前記第1のコンテキスト・レベルにおける前記メモリ・アクセス・オペレーションを修正するステップを含む請求項17に記載の方法。
【請求項19】
前記修正するステップは、前記メモリ・アクセス・オペレーションがソフトウェア・トランザクション・メモリ技術を使用して実行されるように前記メモリ・アクセス・オペレーションを修正するステップを含む請求項17に記載の方法。
【請求項20】
前記修正するステップは、前記メモリ・アクセス・オペレーションがコンピュータ・ネットワーク上のデータ転送を使用して実行されるように前記メモリ・アクセス・オペレーションを修正するステップを含む請求項17に記載の方法。
【請求項21】
特定のコンテキスト・レベルに関連付けられている記憶空間については、その記憶空間内に格納されているデータは、自動メモリ管理を受ける請求項16または17に記載の方法。
【請求項22】
前記自動メモリ管理は、ガーベジ・コレクションを含む請求項21に記載の方法。
【請求項23】
前記修正するステップは、前記第2の異なるコンテキスト・レベルに関連付けられている前記記憶域の識別子を前記メモリ・アクセス・オペレーションに追加するステップを含む請求項17またはこれに従属する請求項に記載の方法。
【請求項24】
前記コンピュータ・プログラムの前記さらなる部分は、少なくとも2回、前記コンピュータ・プログラム・コードにおいて参照され、それぞれの参照は各メモリ・アクセス・オペレーションを含み、
前記方法は、第1の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第1の修正を作成するステップと、第2の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第2の修正を作成するステップとをさらに含む請求項1から23のいずれか1項に記載の方法。
【請求項25】
前記複数の処理要素は、複数の記憶域内に格納されているデータにアクセスし、前記第1のメモリ・アクセス・オペレーションは、第1の記憶域内のデータにアクセスし、前記第2のメモリ・アクセス・オペレーションは、第2の異なる記憶域内のデータにアクセスする請求項24に記載の方法。
【請求項26】
前記コンピュータ・プログラム・コードの前記さらなる部分の前記第1の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への前記第1の参照を処理するステップと、
前記コンピュータ・プログラム・コードの前記さらなる部分の前記第2の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への前記第2の参照を処理するステップとをさらに含む請求項24または25に記載の方法。
【請求項27】
前記コンピュータ・プログラム・コードの前記第1の部分およびさらなる部分のコピーを作成するステップをさらに含み、
前記引き起こすステップは、前記複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第1の部分の前記コピーおよび前記コンピュータ・プログラム・コードの前記さらなる部分の前記コピーを修正するステップを含む請求項1から26のいずれか1項に記載の方法。
【請求項28】
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法であって、前記コンピュータ・プログラム・コードは、複数のデータ・アイテムを参照し、少なくとも1つのデータ・アイテムが特定の処理要素のローカルにあるメモリ内に格納され、少なくとも別のデータ・アイテムが複数の処理要素間で共有されるメモリ内に格納され、
前記データ・アイテムのうちの第1のデータ・アイテムへの参照を含む前記コンピュータ・プログラム・コードの第1の部分を処理するステップと、
前記第1のデータ・アイテムが格納されているメモリを決定するステップと、
前記決定されたメモリを示すように前記コンピュータ・プログラム・コードを修正するステップとを含む方法。
【請求項29】
前記コンピュータ・プログラム・コードの前記第1の部分は、第1の処理要素上で実行されるべきであり、前記決定するステップは、前記第1のデータ・アイテムが前記第1の処理要上で実行されるものとして前記コンピュータ・プログラム・コードの一部において宣言されているかどうかを判定するステップを含む請求項28に記載の方法。
【請求項30】
前記コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを定義し、前記第1のデータ・アイテムが格納されるメモリを決定するステップは、前記第1のデータ・アイテムが宣言されるコンテキスト・レベルを決定するステップを含む請求項28または29に記載の方法。
【請求項31】
前記修正するステップは、前記コンピュータ・プログラム・コードの前記第1の部分が前記第1のデータ・アイテムが宣言されているコンテキスト・レベルと異なるコンテキスト・レベルで出現する場合、ただしその場合に限り実行される請求項30に記載の方法。
【請求項32】
複数のデータ・アイテムへの前記参照は、静的ポインタまたは動的ポインタである請求項28から31のいずれか1項に記載の方法。
【請求項33】
前記修正するステップが、
前記第1のデータ・アイテムへの前記参照の複製を作成するステップと、
前記決定されたメモリを示すように前記複製を修正するステップとを含む請求項30または32に記載の方法。
【請求項34】
前記決定されたメモリを示すように前記複製を前記修正するステップは、前記決定されたメモリに関連付けられている前記コンテキスト・レベルを示すように前記複製を修正するステップを含む請求項33に記載の方法。
【請求項35】
前記決定されたメモリに関連付けられている前記コンテキスト・レベルの指示は、前記コンピュータ・プログラム・コードの前記第1の部分が出現するコンテキスト・レベルの指示である請求項34に記載の方法。
【請求項36】
前記複数のデータ・アイテム内の少なくとも1つのデータ・アイテムは、関数である請求項28から35のいずれか1項に記載の方法。
【請求項37】
複数のメモリを備えるシステム内で実行されるべきコンピュータ・プログラム・コードの構文上の正しさを判定するための方法であって、
第1のポインタ・データ・アイテムを第2のポインタ・データ・アイテムの値に割り当てる第1のステートメントを識別するステップと、
前記第1および第2のポインタ・データ・アイテムがそれぞれ共通メモリ内のメモリ・ロケーションを識別するかどうかを判定するステップと、
前記第1および第2のポインタ・データ・アイテムが共通メモリ内のメモリ・ロケーションを識別しないと判定された場合に、エラーを示すステップとを含む方法。
【請求項38】
コンピュータ・プログラム・コードが複数の処理要素にまたがって実行されることを引き起こすように前記コンピュータ・プログラム・コードを処理するための方法であって、
前記コンピュータ・コードの前記部分が特定の処理要素上で実行されなければならないことを示すように前記コンピュータ・プログラム・コードの少なくとも1つの部分に修飾子をアタッチするステップを含む方法。
【請求項39】
前記処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、単一の処理要素上で実行されるようになされる請求項38に記載の方法。
【請求項40】
前記処理要素のそれぞれは、各型を有し、前記処理要素の少なくとも2つは、異なる型を有し、
前記処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、それぞれ同じ型を有する複数の処理要素にまたがって実行されるようになされる請求項38に記載の方法。
【請求項41】
前記コンピュータ・プログラム・コードは、単一の処理要素上で実行されることが意図されている少なくとも1つの制御の流れを定義し、前記修飾子は、前記単一の制御の流れの一部が別の処理要素上で実行されることを引き起こす請求項39に記載の方法。
【請求項42】
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法であって、
前記コンピュータ・プログラム・コードの一組の部分が前記処理要素のうちの特定の1つの処理要素によって実行されるように修正されることを指示するステップを含む方法。
【請求項43】
前記一組の部分は、前記指示に基づきリンク時に識別される請求項42に記載の方法。
【請求項44】
前記処理要素は、プロセッサである請求項1から43のいずれか1項に記載の方法。
【請求項45】
前記処理要素は、マルチ・コア・プロセッサのプロセッサ・コアである請求項1から43のいずれか1項に記載の方法。
【請求項46】
コンピュータ・プログラム・コードを複数の記憶空間を備える環境内で実行するのに適したコードにするための方法であって、前記コンピュータ・プログラム・コードは、前記記憶空間のうちの1つの記憶空間への参照を含む少なくとも1つの型定義を備え、
前記記憶空間のうちの前記1つの記憶空間への前記参照を前記記憶空間のうちの別の1つの記憶空間への参照と置き換えることによって前記型定義のコピーを作成するステップを含む方法。
【請求項47】
前記型定義は、struct型、union型、またはクラスのうちの1つを定義する請求項46に記載の方法。
【請求項48】
コンピュータが請求項1から47のいずれか1項に記載の方法を実行することを引き起こすようになされたコンピュータ可読命令を備えるコンピュータ・プログラム。
【請求項49】
請求項48に記載のコンピュータ・プログラムを収めるコンピュータ可読媒体。
【図1】
【図2】
【図3A】
【図3B】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図2】
【図3A】
【図3B】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【公表番号】特表2012−530995(P2012−530995A)
【公表日】平成24年12月6日(2012.12.6)
【国際特許分類】
【出願番号】特願2012−516839(P2012−516839)
【出願日】平成22年6月11日(2010.6.11)
【国際出願番号】PCT/GB2010/001145
【国際公開番号】WO2010/149949
【国際公開日】平成22年12月29日(2010.12.29)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
【出願人】(511312230)コードプレイ、ソフトウェア、リミテッド (1)
【氏名又は名称原語表記】CODEPLAY SOFTWARE LIMITED
【Fターム(参考)】
【公表日】平成24年12月6日(2012.12.6)
【国際特許分類】
【出願日】平成22年6月11日(2010.6.11)
【国際出願番号】PCT/GB2010/001145
【国際公開番号】WO2010/149949
【国際公開日】平成22年12月29日(2010.12.29)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
【出願人】(511312230)コードプレイ、ソフトウェア、リミテッド (1)
【氏名又は名称原語表記】CODEPLAY SOFTWARE LIMITED
【Fターム(参考)】
[ Back to top ]