(57)【特許請求の範囲】
【請求項１】
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法であって、
前記処理要素のうちの特定の１つの処理要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも１つの第１の部分を識別するステップと、
前記コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分に関係する前記コンピュータ・プログラム・コードの少なくとも１つのさらなる部分を識別するステップと、
前記コンピュータ・プログラム・コードの前記第１の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの特定の１つの処理要素によって実行されることを引き起こすステップとをコンピュータに実行させ、
前記コンピュータ・プログラム・コードの前記さらなる部分は、少なくとも２回、前記コンピュータ・プログラム・コードにおいて参照され、それぞれの参照は各メモリ・アクセス・オペレーションを含み、
前記方法は、第１の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第１の修正を自動的に作成するステップと、第２の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第２の修正を自動的に作成するステップとを前記コンピュータにさらに実行させる、方法。
【請求項２】
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法であって、
前記処理要素のうちの特定の１つの処理要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも１つの第１の部分を識別するステップと、
前記コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分に関係する前記コンピュータ・プログラム・コードの少なくとも１つのさらなる部分を識別するステップと、
前記コンピュータ・プログラム・コードの前記第１の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの特定の１つの処理要素によって実行されることを引き起こすステップとをコンピュータに実行させ、
前記複数の処理要素は、複数の記憶域内に格納されているデータにアクセスし、  前記引き起こすステップは、前記複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第１の部分および前記コンピュータ・プログラム・コードの前記さらなる部分を自動的に修正するステップを含む、方法。
【請求項３】
前記処理要素のそれぞれは、各型を有し、
前記処理要素のうちの特定の１つの要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも１つの第１の部分を識別するステップは、前記コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分が実行されるべき特定の型の処理要素を識別するステップを含み、
前記コンピュータ・プログラム・コードの前記第１の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの前記特定の１つの処理要素によって実行されることを引き起こすステップは、前記コンピュータ・プログラム・コードの前記第１の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記特定の型を有する前記処理要素のうちの１つの処理要素によって実行されることを引き起こすステップを含む請求項１または２に記載の方法。
【請求項４】
複数の前記処理要素は、前記特定の型を有し、
前記コンピュータ・プログラム・コードの前記第１の部分および前記コンピュータ・プログラム・コードの前記さらなる部分が前記特定の型を有する前記処理要素のうちの１つの処理要素によって実行されることを引き起こすステップは、前記特定の型を有する前記複数の処理要素のうちの１つの処理要素を選択するステップをさらに含む請求項３に記載の方法。
【請求項５】
前記コンピュータ・プログラム・コードの少なくとも１つの第１の部分を識別するステップは、前記コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分が前記処理要素のうちの前記特定の１つの処理要素によって実行されるべきであることを示す少なくとも１つのプログラム構成体を識別するステップを含む請求項１から４のいずれか１項に記載の方法。
【請求項６】
前記コンピュータ・プログラム・コードの前記さらなる部分は、前記コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分において参照される請求項１から５のいずれか１項に記載の方法。
【請求項７】
前記コンピュータ・プログラム・コードの前記さらなる部分は、関数であり、前記関数は、前記コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分から呼び出される請求項６に記載の方法。
【請求項８】
前記関数は、前記コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分から間接的に呼び出される請求項７に記載の方法。
【請求項９】
前記コンピュータ・プログラム・コードの前記さらなる部分への前記参照は、仮想関数への呼び出しであり、前記コンピュータ・プログラム・コードの前記さらなる部分は、前記仮想関数の一実装である請求項８に記載の方法。
【請求項１０】
前記コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分は、前記関数への参照を受け取り、前記参照を受け取ったことに応答して前記関数を呼び出すようになされている請求項９に記載の方法。
【請求項１１】
前記引き起こすステップは、前記処理要素のうちの特定の１つの処理要素に対して前記コンピュータ・プログラム・コードの前記第１の部分および前記コンピュータ・プログラム・コードの前記さらなる部分をコンパイルするステップを含む請求項１から１０のいずれか１項に記載の方法。
【請求項１２】
複数の前記処理要素によって実行されるべき前記コンピュータ・プログラム・コードの少なくとも１つの第２の部分を識別するステップと、
前記コンピュータ・プログラム・コードの前記第２の部分が前記複数の前記処理要素によって実行されることを引き起こすステップをさらに含む請求項１から１１のいずれか１項に記載の方法。
【請求項１３】
前記コンピュータ・プログラム・コードは、前記コンピュータ・プログラム・コードの前記第２の部分への第１および第２の参照を含み、前記コンピュータ・プログラム・コードの前記第２の部分が前記複数の前記処理要素によって実行されることを引き起こすステップは、前記コンピュータ・プログラム・コードの前記第２の部分が前記第１の参照への応答として第１の処理要素上で、また前記第２の参照への応答として第２の処理要素上で実行されることを引き起こすステップを含む請求項１２に記載の方法。
【請求項１４】
前記第１の処理要素は、処理要素が前記第１の参照を実行することに基づいて決定され、前記第２の処理要素は、処理要素が前記第２の参照を実行することに基づいて決定される請求項１３に記載の方法。
【請求項１５】
前記複数の処理要素は、複数の記憶域内に格納されているデータにアクセスし、
前記引き起こすステップは、前記複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第１の部分および前記コンピュータ・プログラム・コードの前記さらなる部分を修正するステップを含む請求項１から１４のいずれか１項に記載の方法。
【請求項１６】
前記コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを含み、前記修正するステップは、前記コンテキスト・レベルに基づき少なくとも１つのメモリ・アクセス・オペレーションを修正するステップを含む請求項１５に記載の方法。
【請求項１７】
少なくとも１つのメモリ・アクセス・オペレーションを前記修正するステップは、前記メモリ・アクセス・オペレーションに関連付けられているデータ・アイテムが宣言され、前記メモリ・アクセス・オペレーションが実行される相対的なコンテキスト・レベルに基づく請求項１６に記載の方法。
【請求項１８】
それぞれのコンテキスト・レベルは、関連付けられている記憶域を有し、前記修正するステップは、第２のコンテキスト・レベルに関連付けられている記憶域内のデータにアクセスする第１のコンテキスト・レベルにおけるメモリ・アクセス・オペレーションを修正するステップを含み、前記第２のコンテキスト・レベルは前記第１のコンテキスト・レベルと明確に区別される請求項１７に記載の方法。
【請求項１９】
前記修正するステップは、前記第２のコンテキスト・レベルに関連付けられているソフトウェア実装キャッシュにアクセスするように前記第１のコンテキスト・レベルにおける前記メモリ・アクセス・オペレーションを修正するステップを含む請求項１８に記載の方法。
【請求項２０】
前記修正するステップは、前記メモリ・アクセス・オペレーションがソフトウェア・トランザクション・メモリ技術を使用して実行されるように前記メモリ・アクセス・オペレーションを修正するステップを含む請求項１８に記載の方法。
【請求項２１】
前記修正するステップは、前記メモリ・アクセス・オペレーションがコンピュータ・ネットワーク上のデータ転送を使用して実行されるように前記メモリ・アクセス・オペレーションを修正するステップを含む請求項１８に記載の方法。
【請求項２２】
特定のコンテキスト・レベルに関連付けられている記憶空間については、その記憶空間内に格納されているデータは、自動メモリ管理を受ける請求項１７または１８に記載の方法。
【請求項２３】
前記自動メモリ管理は、ガーベジ・コレクションを含む請求項２２に記載の方法。
【請求項２４】
前記修正するステップは、前記第２の異なるコンテキスト・レベルに関連付けられている前記記憶域の識別子を前記メモリ・アクセス・オペレーションに追加するステップを含む請求項１８ないし２１のいずれか１項に記載の方法。
【請求項２５】
前記コンピュータ・プログラム・コードの前記さらなる部分は、少なくとも２回、前記コンピュータ・プログラム・コードにおいて参照され、それぞれの参照は各メモリ・アクセス・オペレーションを含み、
前記方法は、第１の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第１の修正を作成するステップと、第２の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第２の修正を作成するステップとをさらに前記コンピュータに実行させる請求項２から２４のいずれか１項に記載の方法。
【請求項２６】
前記複数の処理要素は、複数の記憶域内に格納されているデータにアクセスし、前記第１のメモリ・アクセス・オペレーションは、第１の記憶域内のデータにアクセスし、前記第２のメモリ・アクセス・オペレーションは、第２の異なる記憶域内のデータにアクセスする請求項２５に記載の方法。
【請求項２７】
前記コンピュータ・プログラム・コードの前記さらなる部分の前記第１の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への前記第１の参照を処理するステップと、
前記コンピュータ・プログラム・コードの前記さらなる部分の前記第２の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への前記第２の参照を処理するステップとをさらに含む請求項２５または２６に記載の方法。
【請求項２８】
前記コンピュータ・プログラム・コードの前記第１の部分およびさらなる部分のコピーを作成するステップをさらに含み、
前記引き起こすステップは、前記複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第１の部分の前記コピーおよび前記コンピュータ・プログラム・コードの前記さらなる部分の前記コピーを修正するステップを含む請求項２に記載の方法。
【請求項２９】
コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理するための方法であって、前記コンピュータ・プログラム・コードは、複数のデータ・アイテムを参照し、少なくとも１つのデータ・アイテムが特定の処理要素のローカルにあるメモリ内に格納され、少なくとも別のデータ・アイテムが複数の処理要素間で共有されるメモリ内に格納され、
前記データ・アイテムのうちの第１のデータ・アイテムへの参照を含む前記コンピュータ・プログラム・コードの第１の部分を処理するステップと、
前記第１のデータ・アイテムが格納されているメモリを決定するステップと、
前記決定されたメモリを示すように前記コンピュータ・プログラム・コードを修正するステップとをコンピュータに実行させる方法。
【請求項３０】
前記コンピュータ・プログラム・コードの前記第１の部分は、第１の処理要素上で実行されるべきであり、前記決定するステップは、前記第１のデータ・アイテムが前記第１の処理要素上で実行されるものとして前記コンピュータ・プログラム・コードの一部において宣言されているかどうかを判定するステップを含む請求項２９に記載の方法。
【請求項３１】
前記コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを定義し、前記第１のデータ・アイテムが格納されるメモリを決定するステップは、前記第１のデータ・アイテムが宣言されるコンテキスト・レベルを決定するステップを含む請求項２９または３０に記載の方法。
【請求項３２】
前記修正するステップは、前記コンピュータ・プログラム・コードの前記第１の部分が前記第１のデータ・アイテムが宣言されているコンテキスト・レベルと異なるコンテキスト・レベルで出現する場合、ただしその場合に限り実行される請求項３１に記載の方法。
【請求項３３】
複数のデータ・アイテムへの前記参照は、静的ポインタまたは動的ポインタである請求項２９から３２のいずれか１項に記載の方法。
【請求項３４】
前記修正するステップが、
前記第１のデータ・アイテムへの前記参照の複製を作成するステップと、
前記決定されたメモリを示すように前記複製を修正するステップとを含む請求項３１に記載の方法。
【請求項３５】
前記決定されたメモリを示すように前記複製を前記修正するステップは、前記決定されたメモリに関連付けられている前記コンテキスト・レベルを示すように前記複製を修正するステップを含む請求項３４に記載の方法。
【請求項３６】
前記決定されたメモリに関連付けられている前記コンテキスト・レベルの指示は、前記コンピュータ・プログラム・コードの前記第１の部分が出現するコンテキスト・レベルの指示である請求項３５に記載の方法。
【請求項３７】
前記複数のデータ・アイテム内の少なくとも１つのデータ・アイテムは、関数である請求項２９から３６のいずれか１項に記載の方法。
【請求項３８】
コンピュータ・プログラム・コードを複数の記憶空間を備える環境内で実行するのに適したコードにするための方法であって、前記コンピュータ・プログラム・コードは、前記記憶空間のうちの１つの記憶空間への参照を含む少なくとも１つの型定義を備え、
前記記憶空間のうちの前記１つの記憶空間への前記参照を前記記憶空間のうちの別の１つの記憶空間への参照と置き換えることによって前記型定義のコピーを作成するステップをコンピュータに実行させる方法。
【請求項３９】
前記型定義は、ｓｔｒｕｃｔ型、ｕｎｉｏｎ型、またはクラスのうちの１つを定義する請求項３８に記載の方法。
【請求項４０】
コンピュータが請求項１から３９のいずれか１項に記載の方法を実行することを引き起こすようになされたコンピュータ可読命令を備えるコンピュータ・プログラム。
【請求項４１】
請求項４０に記載のコンピュータ・プログラムを収めるコンピュータ可読記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ・プログラム・コードを処理するための方法に関するものであり、より具体的には複数の処理要素上で実行するためのコンピュータ・プログラムを処理するための方法に関するものである。
【背景技術】
【０００２】
コンピュータは、一般的に、ユーザーによって要求されたタスクを実行できるように組み合わせて動作する複数の相互作用するコンポーネントを備える。１つのコンポーネントは、中央演算処理装置（ＣＰＵ）であり、命令を実行し、コンピュータ内の他のコンポーネントにそれらのコンポーネントの指定された機能を実行させる役割を持つ。
【０００３】
コンピュータは、現在では、ビジネス環境とレジャー環境とにおけるさまざまな異なるアプリケーションに広く使用されており、コンピュータの処理能力に課される要求は、高まる一方である。例えば、いくつかのビジネス・アプリケーションでは、増大している多数の複雑な情報を迅速に処理する必要性がある。レジャーアプリケーションでは、コンピュータは、娯楽目的に使用され、コンピュータ・グラフィックスの高度化に対するユーザーの期待が高まるにつれ、ユーザーの期待に応えるコンピュータ・グラフィックスを生成するために処理性能が向上することが要求される。
【０００４】
一般に、単一のＣＰＵを備えるコンピュータは、どのクロック・サイクルでも命令を１つしか実行できない。このことは、不可避的に、与えられた期間において実行されうる命令の数を制限することによってプロセッサの性能を制約する要因となる。このことを念頭に置き、一般にマルチ・コア・プロセッサと称される、複数のプロセッサ・コアを持つＣＰＵが、コンピュータにおいて使用されてきた。マルチ・コア・プロセッサ内のそれぞれの処理コアは命令を同時に実行することができるので、複数の命令がどの時点においても実行され、このため、プロセッサの性能を改善することができる。
【０００５】
したがって、マルチ・コア・プロセッサは、複数のプロセッサ・コアを使用してアプリケーションの命令を並列処理する能力を備えている。アプリケーションは、それぞれが独立したプロセッサ・コア上で実行されうる多数の個別に処理可能なタスク（しばしばスレッドと称される）に分割されうる。
【０００６】
単一のアプリケーションに対して並列処理を活用するには、アプリケーションがスレッドを利用して複数のプロセッサ・コアを使用するように意図的に設計される必要がある。
【０００７】
複数のプロセッサ・コアを使用するようにアプリケーションを設計することは、一般的には、複雑で困難なタスクであると考えられている。大まかに言うと、複数のプロセッサ・コアを使用するようにアプリケーションを設計する作業の複雑さおよび困難さは、使用されるプロセッサ・コアの個数とともに増大する。複数のスレッドを伴うプログラムを設計する場合には、複数のスレッドによって使用されうるデータを管理し、特定のスレッドがこれらのスレッドが依存する他のスレッドの前に実行されないことを保証することが必要になる。
【０００８】
既存のプログラムでは、この問題は、複数のプロセッサ・コアを使用するようにアプリケーションを書き換え、プログラムの完全性が維持されることを保証する必要があることでいっそう悪化する。
【発明の概要】
【発明が解決しようとする課題】
【０００９】
本発明の目的は、上述の問題のうちの１つまたは複数を取り除くか、または軽減することである。
【課題を解決するための手段】
【００１０】
本発明の第１の態様によれば、コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理する方法が提供される。この方法は、前記処理要素のうちの特定の１つの処理要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも１つの第１の部分を識別することと、コンピュータ・コードの前記少なくとも１つの第１の部分に関係するコンピュータ・コードの少なくとも１つのさらなる部分を識別することと、コンピュータ・プログラム・コードの前記第１の部分およびコンピュータ・プログラム・コードの前記さらなる部分が前記処理要素のうちの特定の１つの処理要素によって実行されることを引き起こすこととを含む。
【００１１】
このような点で、コンピュータ・プログラム・コードの第１の部分が、特定の処理要素によって実行されるべきであると識別された場合、本発明の第１の態様の方法は、関係するコンピュータ・プログラム・コードも特定の処理要素によって実行されることを保証するために使用されうる。
【００１２】
処理要素のそれぞれは、各型を有するものとしてよく、前記処理要素のうちの特定の１つの要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも１つの第１の部分を識別することは、コンピュータ・プログラム・コードの少なくとも１つの第１の部分が実行されるべき特定の型の処理要素を識別することを含むものとしてよい。コンピュータ・プログラム・コードの第１の部分およびコンピュータ・プログラム・コードのさらなる部分が処理要素のうちの特定の１つの処理要素によって実行されることを引き起こすことは、コンピュータ・プログラム・コードの第１の部分およびコンピュータ・プログラム・コードのさらなる部分が特定の型を有する処理要素のうちの１つの処理要素によって実行されることを引き起こすことを含むことができる。
【００１３】
複数の処理要素は、コンピュータ・プログラム・コードの第１の部分およびコンピュータ・プログラム・コードのさらなる部分が実行されるべき特定の型の処理要素であるものとしてよく、またコンピュータ・プログラム・コードの第１の部分およびコンピュータ・プログラム・コードのさらなる部分が特定の型を有する複数の処理要素のうちの１つの処理要素によって実行されることを引き起こすことは、特定の型を有する複数の処理要素のうちの１つの処理要素を選択することをさらに含むことができる。
【００１４】
コンピュータ・プログラム・コードの少なくとも１つの第１の部分を識別することは、コンピュータ・プログラム・コードの少なくとも１つの第１の部分が前記処理要素のうちの前記特定の１つの処理要素によって実行されるべきであることを示す少なくとも１つのプログラム構成体を識別することを含むことができる。つまり、この識別は、プログラマーによってコンピュータ・プログラム・コード内に挿入されたマーカーに基づくものとしてよい。これらのマーカーは、既存のコンピュータ・プログラム・コードに都合よく追加され、これにより、コンピュータ・プログラム・コードの特定の部分が特定の処理要素上で実行されなければならないことを示すように既存のコンピュータ・プログラム・コードを修正するための手段を実現することができる。
【００１５】
コンピュータ・プログラム・コードの前記さらなる部分は、コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分において参照されうる。例えば、コンピュータ・プログラム・コードのさらなる部分は関数であってよく、前記関数は、コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分から呼び出されるものとしてよい。
【００１６】
関数は、コンピュータ・プログラム・コードの前記少なくとも１つの第１の部分から間接的に呼び出されるものとしてよい。例えば、コンピュータ・プログラム・コードの少なくとも１つの第１の部分内のコンピュータ・プログラム・コードのさらなる部分への参照は、コンピュータ・プログラム・コードのさらなる部分が仮想関数の特定の実装である、その仮想関数への呼び出しであってもよい。代替的に、コンピュータ・プログラム・コードの第１の部分は、関数への参照を受け取り、前記参照を受け取ったことに応答して前記関数を呼び出すようになされるものとしてもよい。例えば、コンピュータ・プログラム・コードの第１の部分は、関数への関数ポインタを受け取り、関数ポインタを受け取ったことに応答して関数を呼び出すようになされるものとしてもよい。
【００１７】
第１のコンピュータ・プログラム・コードおよびさらなるコンピュータ・プログラム・コードが複数の処理要素のうちの特定の１つの処理要素によって実行されることを引き起こすことは、複数の処理要素のうちの特定の１つの処理要素に対してコンピュータ・プログラム・コードの前記第１の部分およびコンピュータ・プログラム・コードの前記さらなる部分をコンパイルすることを含むことができる。例えば、複数の処理要素のうちの異なる複数の処理要素が、異なる命令セットを有していてもよく、したがって、その引き起こすことは、コンピュータ・プログラム・コードがコンパイルされるべきターゲット命令セットを選択することを含むことができる。
【００１８】
この方法は、複数の前記処理要素によって実行されるべきコンピュータ・プログラム・コードの少なくとも１つの第２の部分を識別することと、コンピュータ・プログラム・コードの前記第２の部分が前記複数の前記処理要素によって実行されることを引き起こすことをさらに含むことができる。
【００１９】
コンピュータ・プログラム・コードは、コンピュータ・プログラム・コードの第２の部分への第１および第２の参照を含むことができ、コンピュータ・プログラム・コードの前記第２の部分が前記複数の前記処理要素によって実行されることを引き起こすことは、前記コンピュータ・プログラム・コードの前記第２の部分が前記第１の参照への応答として第１の処理要素によって、また前記第２の参照への応答として第２の処理要素によって実行されることを引き起こすことを含むことができる。第１の処理要素は、処理要素が第１の参照を実行することに基づいて決定され、第２の処理要素は、処理要素が第２の参照を実行することに基づいて決定されうる。
【００２０】
複数の処理要素が、複数の記憶域、例えば複数のメモリ内に格納されているデータにアクセスすることができる。前記引き起こすことは、複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの前記第１の部分および前記コンピュータ・プログラム・コードの前記さらなる部分を修正することを含むことができる。
【００２１】
コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを含むものとしてよく、前記修正することは、前記コンテキスト・レベルに基づき少なくとも１つのメモリ・アクセス・オペレーションを修正することを含むことができる。例えば、少なくとも１つのメモリ・アクセス・オペレーションは、メモリ・アクセス・オペレーションに関連付けられているデータ・アイテムが宣言され、メモリ・アクセス・オペレーションが実行される相対的なコンテキスト・レベルに基づき修正されうる。データ・アイテムの例は、変数および定数である。一般に、変数およびデータ・アイテムという用語は、本明細書では交換可能に使用され、メモリ・ロケーションに格納されている任意のデータを指す。
【００２２】
それぞれのコンテキスト・レベルは、関連付けられている記憶域を有することができ、前記修正することは、第２のコンテキスト・レベルに関連付けられている記憶域内のデータにアクセスする第１のコンテキスト・レベルにおけるメモリ・アクセス・オペレーションを修正することを含むことができ、第２のコンテキスト・レベルは第１のコンテキスト・レベルと明確に区別される。前記修正することは、第２のコンテキスト・レベルに関連付けられている記憶域の識別子をメモリ・アクセス・オペレーションに追加することを含むことができる。
【００２３】
修正することは、第２のコンテキスト・レベルに関連付けられているソフトウェア実装キャッシュにアクセスするように第１のコンテキスト・レベルにおけるメモリ・アクセス・オペレーションを修正することを含むことができる。
【００２４】
修正することは、メモリ・アクセス・オペレーションがソフトウェア・トランザクション・メモリ（software transactional memory）（ＳＴＭ）技術を使用して実行されるようにメモリ・アクセス・オペレーションを修正することを含むことができる。
【００２５】
修正することは、メモリ・アクセス・オペレーションがコンピュータ・ネットワーク上でデータ転送を使用して実行されるようにメモリ・アクセス・オペレーションを修正することを含むことができる。例えば、特定のコンテキスト・レベルに関連付けられている記憶空間は、リモートに配置されてもよく、特定のコンテキスト・レベルに関連付けられている記憶装置レベルへのアクセスは、ネットワーク上で実行されうる。
【００２６】
特定のコンテキスト・レベルに関連付けられている記憶空間については、その記憶空間内に格納されているデータは、ガーベジ・コレクションなどの、自動メモリ管理を受けるものとしてよい。ガーベジ・コレクション・システムは、メモリ空間のどれかの中に割り当てられた記憶域を回収するように動作可能であるものとしてよく、そこでは、データへのポインタまたは参照は、どのようなコンテキスト・レベルにおいても保持されないと決定される。特定のコンテキスト・レベルに関連付けられているメモリ空間のうちの１つのメモリ空間は、ガーベジ・コレクションで回収されるメモリ空間として処理されてもよく、そこでは、そのコンテキスト・レベルにおけるすべてのメモリ参照は、ガーベジ・コレクションの目的のために追跡される。コンテキスト・レベル内のポインタによる到達が可能でないデータを格納するガーベジ・コレクションで回収されるメモリ空間内のどのロケーションも、他のデータを格納するために使用できるように割り当てられたデータ・プールから解放することに利用可能にされうる。
【００２７】
前記コンピュータ・プログラムの前記さらなる部分は、少なくとも２回、前記コンピュータ・プログラム・コードにおいて参照され、それぞれの参照は各メモリ・アクセス・オペレーションを含むことができる。この方法は、第１の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第１の修正を作成することと、第２の各メモリ・アクセス・オペレーションに基づき前記コンピュータ・プログラム・コードの前記さらなる部分の第２の修正を作成することとをさらに含むことができる。
【００２８】
第１のメモリ・アクセス・オペレーションは、第１の記憶域内のデータにアクセスすることができ、第２のメモリ・アクセス・オペレーションは、第２の異なる記憶域内のデータにアクセスすることができる。
【００２９】
この方法は、前記コンピュータ・プログラム・コードの前記さらなる部分の第１の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への第１の参照を処理することと、前記コンピュータ・プログラム・コードの前記さらなる部分の第２の修正への参照を追加するように前記コンピュータ・プログラム・コードの前記さらなる部分への第２の参照を処理することとをさらに含むことができる。
【００３０】
この方法は、前記コンピュータ・プログラム・コードの前記第１の部分および前記さらなる部分のコピーを作成することをさらに含むことができ、前記引き起こすことは、複数の記憶域内のデータにアクセスするように前記コンピュータ・プログラム・コードの第１の部分のコピーおよびコンピュータ・プログラム・コードのさらなる部分のコピーを修正することを含む。
【００３１】
本発明の第２の態様によれば、コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理する方法が提供され、コンピュータ・プログラム・コードは、複数のデータ・アイテムを参照し、少なくとも１つのデータ・アイテムが特定の処理要素のローカルにあるメモリ内に格納され、少なくとも別のデータ・アイテムが複数の処理要素間で共有されるメモリ内に格納される。この方法は、前記データ・アイテムのうちの第１のデータ・アイテムへの参照を含むコンピュータ・プログラム・コードの第１の部分を処理することと、前記第１のデータ・アイテムが格納されているメモリを決定することと、決定されたメモリを示すようにコンピュータ・プログラム・コードを修正することとを含む。
【００３２】
このような点で、コンピュータ・プログラム・コードは、複数の異なるメモリへのコンピュータ・プログラム内の参照が適切なメモリを識別するように正しく処理されることを保証するように修正されうる。
【００３３】
コンピュータ・プログラム・コードの前記第１の部分は、第１の処理要素上で実行され、前記決定することは、第１のデータ・アイテムが第１の処理要上で実行されるものとしてコンピュータ・プログラム・コードの一部において宣言されているかどうかを判定することを含むことができる。
【００３４】
コンピュータ・プログラム・コードは、複数のコンテキスト・レベルを定義することができ、前記第１のデータ・アイテムが格納されるメモリを決定することは、前記第１のデータ・アイテムが宣言されるコンテキスト・レベルを決定すること含むことができる。修正することは、前記コンピュータ・プログラム・コードの前記第１の部分が第１のデータ・アイテムが宣言されているコンテキスト・レベルと異なるコンテキスト・レベルで出現する場合、ただしその場合に限り実行されうる。
【００３５】
複数のデータ・アイテムへのそれぞれの各参照は、静的ポインタであるか、または動的ポインタのいずれかであってよい。特定の参照が静的ポインタであるか、または動的ポインタであるかは、決定されたメモリを示すようにコンピュータ・プログラム・コードの修正をもたらしうる。例えば、参照が静的ポインタである場合、ポインタの型が修正され、参照が動的ポインタである場合、ポインタの値が修正されうる。
【００３６】
修正は、第１のデータ・アイテムへの参照の複製を作成することと、決定されたメモリを示すように複製を修正することとを含むことができる。
【００３７】
決定されたメモリを示すように複製を修正することは、決定されたメモリに関連付けられているコンテキスト・レベルを示すように複製を修正することを含むことができる。前記決定されたメモリに関連付けられているコンテキスト・レベルの指示は、コンピュータ・プログラム・コードの第１の部分が出現するコンテキスト・レベルの指示であってよい。例えば、修正することは、第１のコンピュータ・プログラム・コードが出現するコンテキスト・レベルが第１のデータ・アイテムが宣言されるコンテキスト・レベルのうちのコンテキスト・レベルの外部にあることを示すように適切なキーワードを参照に追加すること含むことができる。
【００３８】
複数のデータ・アイテム内の少なくとも１つのデータ・アイテムは、関数であってもよい。したがって、データ・アイテムへの参照は、関数への参照とすることができる。関数への参照の例は、関数ポインタ、仮想メソッド、およびメンバ関数ポインタを含む。
【００３９】
本発明の第３の態様によれば、複数のメモリを備えるシステム内で実行されるべきコンピュータ・プログラム・コードの構文上の、および／またはセマンティクス上の正しさを判定するための方法が提供され、この方法は、第１のポインタ・データ・アイテムを第２のポインタ・データ・アイテムの値に割り当てる第１の命令を識別することと、前記第１および第２のポインタ・データ・アイテムがそれぞれ共通メモリ内のメモリ・ロケーションを識別するかどうかを判定することと、前記第１および第２のポインタ・データ・アイテムが共通メモリ内のメモリ・ロケーションを識別しないと判定された場合に、エラーを示すこととを含む。
【００４０】
本発明の第４の態様によれば、コンピュータ・プログラム・コードが複数の処理要素にまたがって実行されることを引き起こすようにコンピュータ・プログラム・コードを処理する方法が提供される。この方法は、コンピュータ・コードの少なくとも１つの部分が特定の処理要素上で実行されなければならないことを示すようにコンピュータ・プログラム・コードの少なくとも１つの部分に修飾子をアタッチすることを含む。
【００４１】
処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、単一の処理要素上で実行されるようになされうる。コンピュータ・プログラム・コードは、単一の処理要素上で実行されることが意図されている少なくとも１つの制御の流れを定義することができ、前記修飾子は、単一の制御の流れの一部が別の処理要素上で実行されることを引き起こしうる。
【００４２】
処理要素のそれぞれは、各型を有するものとしてよく、それらの処理要素の少なくとも２つは、異なる型を有する。処理されたコンピュータ・プログラム・コードは、前記修飾子のアタッチ前に、それぞれ同じ型を有する複数の処理要素にまたがって実行されるようになされうる。例えば、コンピュータ・プログラム・コードは、修飾子のアタッチ前に、ホモジニアス・マルチ・コアプロセッサ上で実行されるようになされるものとしてよく、修飾子のアタッチは、コンピュータ・プログラム・コードがヘテロジニアス・マルチ・コアプロセッサ上で実行されることを引き起こしうる。
【００４３】
処理要素は、マルチ・コア・プロセッサのプロセッサもしくはプロセッシング・コアとすることができる。
【００４４】
本発明の第５の態様によれば、コンピュータ・プログラム・コードの異なる部分が複数の通信処理要素のうちの異なる処理要素によって実行されることを可能にするようにコンピュータ・プログラム・コードを処理する方法が提供され、この方法は、前記コンピュータ・プログラム・コードの一組の部分が異なる処理要素によって実行されることを指示することを含む。この一組の部分は、その指示に基づきリンク時に決定されうる。コンピュータ・プログラム・コードのその一組の部分は、一組の関数であってもよい。コンピュータ・プログラム・コードの一組の部分の指示は、一組の関数を含むロケーションを示すプレースホルダを含んでいてもよい。次いで、プレースホルダによって示される実際の一組の関数を見つけるためにプレースホルダがリンク時に調べられ、その一組の関数が異なる処理要素によって実行されるように修正されうる。
【００４５】
本発明の第６の態様によれば、コンピュータ・プログラム・コードを複数の記憶空間を備える環境内で実行するのに適したコードにするための方法が提供され、コンピュータ・プログラム・コードは、前記記憶空間のうちの１つの記憶空間への参照を含む少なくとも１つの型定義を備え、この方法は、前記記憶空間のうちの前記１つの記憶空間への前記参照を前記記憶空間のうちの別の１つの記憶空間への参照と置き換えることによって前記型定義のコピーを作成することを含む。
【００４６】
この型定義は、ｓｔｒｕｃｔ型、ｕｎｉｏｎ型、またはクラスのうちの１つを定義することができる。
【００４７】
本発明の態様は、都合のよいどの方法でも実装されうることは理解されるであろう。例えば、本発明は、有形のキャリア媒体（例えば、ディスク）または無形のキャリア媒体（例えば、通信信号）であってもよい適切なキャリア媒体上で搬送されうる適切なコンピュータ・プログラムによって実装されるものとしてよい。本発明の態様は、本発明を実施するようになされているコンピュータ・プログラムを実行するプログラム可能コンピュータの形態をとりうる好適な装置を使用して実装されるものとしてもよい。
【００４８】
本発明の一態様を参照しつつ説明されている本発明の特徴が、本発明の他の態様内に含まれるものとしてよいこともさらに理解されるであろう。
【００４９】
次に、例えば添付図面を参照しつつ、本発明の実施形態が説明される。
【図面の簡単な説明】
【００５０】
【図１】マルチ・コア・プロセッサを備えるコンピュータのコンポーネントを示す略図である。
【図２】図１のマルチ・コア・プロセッサをさらに詳しく示す略図である。
【図３Ａ】プログラム・コードがマルチ・コア・プロセッサ上で実行されることを可能にするプログラム・コードの処理の概要を示す略図である。
【図３Ｂ】本発明の一実施形態による処理の概要を示す略図である。
【図４】本発明の一実施形態によりアクセラレーション・セクションとアクセラレーション関数を定義するように行われる修正を示すプログラム・コードの例を示す図である。
【図５】本発明の一実施形態によりアクセラレーション・セクションとアクセラレーション関数を定義するように行われる修正を示すプログラム・コードの例を示す図である。
【図６】本発明の一実施形態によりアクセラレーション・セクションとアクセラレーション関数を定義するように行われる修正を示すプログラム・コードの例を示す図である。
【図７】本発明の一実施形態による、アクセラレーション・セクションの内側のデータ・アクセスを示すプログラム・コードの一例を示す図である。
【図８】本発明の一実施形態による、処理によって変換されない関数を示すプログラム・コードの一例を示す図である。
【図９】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図１０】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図１１】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図１２】本発明の一実施形態による、処理によって変換される関数を示すプログラム・コードの例を示す図である。
【図１３】本発明の一実施形態によるデータ・アクセスを示すプログラム・コードの一例である。
【図１４】ポインタの初期化を示すプログラム・コードの一例を示す図である。
【図１５】ポインタのキャストを示すプログラム・コードの一例を示す図である。
【図１６】ポインタのキャストを示すプログラム・コードの一例を示す図である。
【図１７】オブジェクト指向クラスを示すプログラム・コードの一例を示す図である。
【図１８】本発明の一実施形態により処理される図１７のプログラム・コードを示す図である。
【図１９】本発明の実施形態によるプログラム・コード内に関数の複製を生成するためのそのプログラム・コードの処理を示す流れ図である。
【図２０】本発明の実施形態によるプログラム・コード内に関数の複製を生成するためのそのプログラム・コードの処理を示す流れ図である。
【図２１】共有メモリを有するホスト処理ユニットとバスによってホスト処理ユニットに接続されているアクセラレータ・プロセッシング・コアとを備えるコンピュータのコンポーネントを示す略図である。
【図２２】図２１に示されているコンポーネント上で実行されるように処理されうるプログラム・コードの一例を示す図である。
【図２３】図２２のプログラム・コードと図２１のコンポーネントとの間の関係を示す略図である。
【発明を実施するための形態】
【００５１】
図１は、コンピュータ装置の略図である。コンピュータ装置は、ＲＡＭ  ２の形態をとる揮発性メモリに格納されている命令を読み出して実行するようになされているプロセッサ１を備える。ＲＡＭ  ２は、コンピュータによって実行されるプログラム、さらにはプログラムによって使用されるデータを構成する両方の命令を格納する。コンピュータ装置は、ハード・ディスク・ドライブ３の形態の不揮発性メモリをさらに備える。コンピュータ装置は、適切な入力／出力デバイスとの通信を可能にするＩ／Ｏインターフェイス４および有線または無線手段によってコンピュータ・ネットワークとの通信を可能にするようになされたネットワーク・インターフェイス５も備える。上述のコンポーネントは、通信バス６によって１つに接続される。
【００５２】
本明細書で説明されている開発は、図２を参照しつつ説明されている型のマルチ・コア・プロセッサであるプロセッサ１によるコンピュータ・プログラムの実行に関係する。図２は、１つのホスト・コア７と３つのアクセラレータ・コア８、９、１０とを備えるマルチ・コア・プロセッサの概略を示している。マルチ・コア・プロセッサは、ホスト・コア７だけでなく、アクセラレータ・コア８、９、１０のそれぞれによってアクセス可能である共有メモリ１１をさらに備える。それに加えて、アクセラレータ・コア８、９、１０のそれぞれは、各ローカルの「スクラッチ・パッド」メモリ１２、１３、１４を有する。ホスト・コア７は、主制御処理ユニットであるが、アクセラレータ・コア８、９、１０は、実行プログラムによって指定された特定の機能でホスト・コア７を支援するように割り当てられた処理ユニットである。共有メモリ１１は、ホスト・コア７によって直接アクセスされうるが、アクセラレータ・コア８、９、１０のそれぞれは、ダイレクト・メモリ・アクセス（ＤＭＡ）を通じて共有メモリ１１にアクセスすることができる。アクセラレータ・コアは、共有メモリ１１内の任意のロケーションにランダムにアクセスすることができるものとしてよい。しかし、共有メモリ１１へのアクセラレータ・コアのアクセスには、付加的な制約もありうる。例えば、リード・オペレーションおよびライト・オペレーションは、最小または最大のデータ・サイズに制約され、読み出されるか、または書き込まれるデータのサイズは、特定の倍数のバイト数（例えば、４、８、１２、１６）に制約され、アクセスされるデータは、メモリ１１内でアライメントを揃えられうる（例えば、アクセラレータ・コア８、９、１０は、２のべき乗の偶数倍数であるアドレスに格納されているデータにのみアクセスすることができるものとしてよい）。
【００５３】
つまり、共有メモリへのアクセラレータ・コアのアクセスは、メモリへのホスト・コアのアクセスと異なるような仕方で制約されうる。
【００５４】
ホスト・コア７およびアクセラレータ・コア８、９、１０のそれぞれは同一ものであってもよく、この場合、プロセッサ１はホモジニアス・マルチ・コア・プロセッサと称される。代替的に、マルチ・コア・プロセッサ１は、ヘテロジニアス・マルチ・コア・プロセッサであってもよく、その場合、コア７、８、９、１０は互いに異なり、例えば、アクセラレータ・コア８、９、１０のそれぞれは、各異なる機能を備えていてもよい。例えば、ヘテロジニアス・マルチ・コア・プロセッサは、１つの汎用ホスト・コアと物理エンジン、シナジスティックプロセッシングエレメント、またはグラフィカル・プロセッシング・ユニット（ＧＰＵ）などの多数の専用アクセラレータ・コアとを備えることができる。ヘテロジニアス・マルチ・コア・プロセッサ内の異なるアクセラレータ・コアは、異なる命令セットを使用することができ、異なるサイズのローカル・メモリ１２、１３、１４を有することができ、異なる性能特性を有することができる。
【００５５】
多くのコンピュータ・プログラムは、順次実行を意図して書かれ、また書かれてきた。このようなプログラムは、上述の、図２に示されている型のマルチ・コア・プロセッサによって実現される並列処理機能を利用することは容易にはできない。マルチ・コア・プロセッサによって実現される並列処理を活用するように、順次定義されたコンピュータ・プログラムを処理するためのシステムの概要が、図３Ａおよび３Ｂを参照しつつ説明されている。
【００５６】
ごく一般的な言い方をすると、本発明の実施形態は、コンピュータ・プログラム・コードが、処理されたコードの異なる部分が異なるプロセッサ・コア上で実行されるように処理されることを可能にするものである。プロセスの概要は、図３Ｂに提示されている。
【００５７】
ブロック１５で、特定のプロセッサ上で実行されなければならないソース・コードの少なくとも１つの指示を含むようにソース・コードに注釈が入れられる。この注釈は、人間のプログラマーによる手作業で行うことができる。ブロック１６で、処理されたソース・コードの一部分が、注釈に基づいてプロセッサ・コアに割り当てられる。ブロック１７で、ソース・コードのさまざまな部分が複製され、ソース・コードのこれらの複製された部分が複数のプロセッサ・コア上で実行されることを可能にする。ソース・コードの一部分の複製は、以下に詳しく説明されるが、大まかに言えば、例えば、プロセッサ、プロセッサ・コア、および／またはコンピュータ・ネットワーク・ノードであってもよい、複数の実行ユニット上で実行するためのソース・コードの処理部分に関するものである。この複製は、異なるバージョンの特定のコードが異なるメモリ内に格納されているデータにアクセスするために生成される必要があるとすれば、複製された（または処理された）コードが共有メモリ１１とアクセラレータ・コア８、９、１０のローカルにあるメモリ１２、１３、１４のうちの１つのメモリの両方に格納されているデータを処理することも可能にする。これは、複製されるソース・コードが、異なる引数を付けてソース・コードの異なる部分から呼び出される関数を含む場合であることが多い。
【００５８】
コードのさまざまな他の部分は、ブロック１８で処理され、そのコードとマルチ・コア・プロセッサの実行との互換性を保証する、例えば、共有メモリをターゲットとするポインタとアクセラレータ・コア８、９、１０のうちの１つのアクセラレータ・コアのローカルにあるメモリ１２、１３、１４のうちの１つのメモリをターゲットとするポインタとの間の整合性を保証する。
【００５９】
上述の処理を実行すると、それぞれのプロセッサ・コアに対するソース・コードが、ブロック１９で、そのプロセッサ・コアに適したコンパイラによるコンパイルのために作成される。
【００６０】
次に、図３Ｂを参照すると、ソース・コード・プリプロセッサ２０は、マルチ・コア・プロセッサ１の特定のコア７、８、９、１０上で処理および実行を行うようにコンパイルされなければならないソース・コードのセクションを識別し、共有メモリ１１内に、またはアクセラレーション・コア８、９、１０のうちの１つのアクセラレーション・コアのメモリ１２、１３、１４内に置かれなければならないデータを識別するようにユーザーによって修正されている、Ｃ、Ｃ＋＋、Ｃ＃、またはＪａｖａなどの、プログラミング言語で書かれたソース・コードを受け取る。
【００６１】
ソース・コード・プリプロセッサ２０は、関数および変数をプログラム・パーティショニング・ツール２１に出力する。ソース・コード・プリプロセッサ２０から出力される関数および変数の形態は、例えば、ソース・プログラムの字句、抽象構文木、または高水準コンパイラ中間表現のリストとすることも可能である。ソース・コード・プリプロセッサ２０の出力は、どのソース・コードが特定のプロセッサ・コアによって処理のマークを明示的に付けられているかを示す情報、および特定のデータがプロセッサ・コア間で共有されているか、またはアクセラレータ・コアのうちの１つのアクセラレータ・コアに特有のものであるかの任意の明示的な指示を表す情報を含む。表現は、ＲＡＭ  ２内に格納されうるか、またはプログラム全体の表現がプログラム・パーティショニング・ツール２１に利用可能になるようにハード・ディスク・ドライブ３に保存されうる。ソース・コード・プリプロセッサ２０からの出力は、高水準中間表現と称される。
【００６２】
標準の前処理タスク（ＣおよびＣ＋＋では、＃ｉｎｃｌｕｄｅおよび＃ｄｅｆｉｎｅステートメントの処理など）に加えて、プリプロセッサ２０は、構文および型検査を供給される修正済みソース・コードに対して実行し、構文に関して、またセマンティクスに関して誤りのあるソース・コードを拒絶することができる。
【００６３】
プログラム・パーティショニング・ツール２１は、特定のプロセッサ・コア上で実行されるように指定されている任意のソース・コードのセクションがそのプロセッサ・コア上で確かに実行されることを保証する。同様に、プログラム・パーティショニング・ツール２１は、ソース・コードがデータがコア間で共有されるか、またはコアのうちの特定の１つのコアによってアクセスされるべきであることを指定している場合に、データが指定されているとおりに確かに処理されることを保証する。
【００６４】
プログラム・パーティショニング・ツール２１は、プロセッサ・コア７、８、９、１０のそれぞれについて各プログラム・コードおよびデータを出力する。これを行う際に、プログラム・パーティショニング・ツール２１は、元のソース・コードにさまざまな修正を加えて、実行および格納が望み通りに取り扱われることを保証する。これらの修正の性質については、以下でさらに詳しく説明される。プログラム・パーティショニング・ツール２１は、プログラム・コードおよびデータをＣなどの人間が読めるプログラミング言語で出力することができる。代替的に、プログラム・パーティショニング・ツール２１は、コードおよびデータをコンパイラ中間表現で出力することができる。コードおよびデータは、それぞれのプロセッサ・コア７、８、９、１０について複数のコンパイラ２２に出力される。２つのコンパイラ２２ａ、２２ｂが図３に示されており、第１のコンパイラ２２ａはホスト・コア７に特有のプログラム・コードを受け取るが、第２のコンパイラ２２ｂはアクセラレータ・コア８、９、１０のうちの特定の１つのアクセラレータ・コアに対するプログラム・コードを受け取る。
【００６５】
コンパイラ２２は、プログラム・パーティショニング・ツール２１の出力をプロセッサ・コア７、８、９、１０のそれぞれについて実行可能コードに変換する。プログラム・パーティショニング・ツール２１は、関数のリストをビルド・ツール２３にさらに出力する。ビルド・ツール２３は、以下でさらに詳しく説明されているようにそれぞれのプロセッサ・コア７、８、９、１０について呼び出しスタックを分析する。
【００６６】
ソース・コード・プリプロセッサ２０が、特定のプロセッサ・コア上に特定のコードが実装されなければならないことを示すように修正されている高水準言語コンピュータ・プログラム・コードを受け取ることが上では示されている。そこで、このような修正が、以下でさらに詳しく説明される。ソース・コードに対して行われる修正は、ソース・コードが書かれているプログラミング言語に新しい概念を持ち込むようになされる。特に、ソース・コードに対する修正は、アクセラレーション・セクション（アクセラレーション・セクション内のコードが特定のプロセッサ上で実行されなければならないことを示す）、およびそれぞれについて以下でさらに詳しく説明されているコンテキスト指示（データが格納されなければならないメモリを示す）を導入するように使用されうる。
【００６７】
アクセラレーション・セクションは、アクセラレータ・コア８、９、１０のうちの１つのアクセラレータ・コア上で実行されるように指定されているコードの一セクションである。アクセラレーション・セクションは、アクセラレータ・コア上で実行されなければならないコードを示すようにキーワードを使用して示される。例えば、プログラマーは、関数内に、キーワードの後のコード（例えば、中括弧で囲まれている）がアクセラレータ・コア上で実行されなければならず、コードは複数のプロセッサ・コアを有するプロセッサ上で実行されるべきであることを示すために注釈「ａｃｃｅｌｅｒａｔｉｏｎｓｅｃｔｉｏｎ」を挿入する。利用可能なアクセラレーション・セクションには複数の型があってもよく（それぞれ関連するキーワードを有する）、これにより、プログラマーはソース・コードの特定のセクションがアクセラレータ・コア８、９、１０のうちの特定の１つのアクセラレータ・コア上で実行されなければならないことを示すことが可能になる。注釈「ａｃｃｅｌｅｒａｔｉｏｎｓｅｃｔｉｏｎ」は、例としてのみ与えられており、適したものであればどのような注釈でも使用可能であることは理解されるであろう。特定の構文を使用すべきであるとする要求条件はないことも理解されるであろう。
【００６８】
図４のコード例は、注釈＿ａｃｃｅｌｅｒａｔｉｏｎｓｅｃｔｉｏｎ＿によって識別されるアクセラレーション・セクション・コード・ブロックを含む関数ｅｘＦｕｎｃを定義する。アクセラレーション・セクション・コード・ブロック内のどのコードも、アクセラレータ・プロセッサ、例えばアクセラレータ・コア８上で実行されなければならないが、アクセラレーション・セクション・コード・ブロックの外のコードは、ホスト・プロセッサ２上で実行されなければならない。
【００６９】
代替的に、図５に示されているように、関数全体が、キーワードをその定義に追加することによってアクセラレータ・コアのうちの１つのアクセラレータ・コアにより実行されるものとしてマークを付けられるものとしてよい。
【００７０】
図５のコードは、ｓｐｅｅｄｙＦｕｎｃｔｉｏｎと呼ばれる関数を定義し、マーカー＿ａｃｃｅｌｅｒａｔｅｄｆｕｎｃｔｉｏｎ＿をその定義内に含め、ｓｐｅｅｄｙＦｕｎｃｔｉｏｎ関数がアクセラレータ・コア８、９、１０のうちの１つのアクセラレータ・コア上で実行されなければならないことを示す。同様にして、マーカー＿ｕｎａｃｃｅｌｅｒａｔｅｄｆｕｎｃｔｉｏｎ＿が、特定の関数がアクセラレータ・コアのうちの１つのアクセラレータ・コア上で実行されてはならないが、その代わりにホスト・コア７上で実行されなければならないことを示すために使用されうる。
【００７１】
関数のオーバーロードをサポートするプログラミング言語では、図５に示されている型の関数宣言は、＿ａｃｃｅｌｅｒａｔｅｄｆｕｎｃｔｉｏｎ＿マーカーを持たないが、他の点では同じシグネチャを有する、関数宣言と明確に区別できるものであるとしてよい。アクセラレーション・セクションの内側から関数を呼び出すことは、関数のマーク付きバージョンが呼び出されることを引き起こすが、アクセラレーション・セクションの外側から呼び出すと、その結果、＿ａｃｃｅｌｅｒａｔｅｄｆｕｎｃｔｉｏｎ＿マーカーなしで関数を呼び出すことになる。従来の関数のオーバーロードは、２つの関数定義が同じ名前を有するが、異なる関数シグネチャ（例えば、異なる数および／または型のパラメータ、または異なるポインタ修飾子（暗黙のポインタを含む））を有する場合に生じるが、ここでは、「オーバーロード」は、同じ関数シグネチャを有するが、関数が実行されなければならないプロセッサ・コアに関する異なる指示を有する２つの定義からも生じることがわかる。オーバーロードの解決は、例えば、ホスト・プログラミング言語の規則に従って実行されうるが、これらの規則によって解決できないあいまいさが生じる場合、関数は、プロセッサ・コアの指示に基づき選択されうる。
【００７２】
特定のアクセラレーション・セクション内において、そのアクセラレーション・セクション内で呼び出された特定の名前付き関数は、それ自体、特定のアクセラレータ・コア上で実行されなければならないと指定することもさらに可能である。一例が、図６に示されている。ここで、コードは、関数ａ、ｂ、およびｃがアクセラレーション・セクション内の他のコードと同じアクセラレータ・コア上で実行されなければならないことを示す。関数ａ、ｂ、およびｃがアクセラレータ・コア上で実行されることを可能にするために、プログラム・パーティショニング・ツールは、以下でさらに詳しく説明されるようにアクセラレータ・プロセッサ上で実行されるように変換された関数ａ、ｂ、およびｃの複製を作成する。
【００７３】
より詳しくは、図６のコードは、関数ポインタを引数としてとる関数ｆを定義する。関数ｆ内に定義されたアクセラレーション・セクション内のコードは、関数ｆへの引数として与えられた関数を呼び出す。上記のように、アクセラレーション・セクションは、＿ａｃｃｅｌｅｒａｔｉｏｎｓｅｃｔｉｏｎ＿マーカーを使用してマークされ、アクセラレーション・セクションの内側のコードがアクセラレータ・コア上で実行されることを示す。しかし、ここでは、＿ａｃｃｅｌｅｒａｔｉｏｎｓｅｃｔｉｏｎ＿マーカーは、関数ａ、ｂ、ｃのどれかがアクセラレーション・セクション内のコードによって呼び出される場合、これらはアクセラレーション・セクション内のコードと同じアクセラレータ・コア上で実行されなければならないことをさらに指定する。したがって、関数ａ、ｂ、ｃのうちの１つが関数ｆに与えられた引数によって指示される場合、受け渡された関数が、アクセラレーション・セクション内の他のコードと同じアクセラレータ・コア上で実行される。
【００７４】
アクセラレーション・セクションは、アクセラレーション・セクションが別の（子）アクセラレーション・セクションを囲むことができるように入れ子にされうる。それぞれのアクセラレーション・セクションは、データ・アイテムがアクセスされ、関数が呼び出される、コンテキスト・レベルを定義する。それぞれのコンテキストは、レベル・インデックスなどの割り当てられた識別子によって識別されうる。例えば、外側レベル・コンテキストにはレベル・インデックス０を割り当てることができ、外側コンテキスト・レベルは主コンテキスト・レベルであり、外側コンテキスト・レベル内のコードは、ホスト・コア７によって処理される。第１のアクセラレーション・セクションは、第２のコンテキスト・レベルを定義し、これにコンテキスト・レベル・インデックス１を割り当てることが可能である。第１のアクセラレーション・セクション内のさらなるアクセラレーション・セクションは、第３のコンテキスト・レベルを定義し、これにコンテキスト・レベル・インデックス２を割り当てることが可能であり、これ以降同様に割り当てることが可能である。それぞれのコンテキスト・レベルは、アクセラレータ・コア８、９、１０のうちの異なる各１つのアクセラレータ・コアによる処理および実行のためのソース・コードを含むことができる。
【００７５】
先行する記述は、アクセラレータ・コア８、９、１０のうちの特定の１つのアクセラレータ・コア上での実行に関してコードのセクションをコードがどのように識別することができるかを説明している。次に、データ・アクセスがどのように取り扱われなければならないかを示すために使用される方法が説明される。
【００７６】
メモリ・アクセス・セマンティクスが、メモリ・アクセスが処理されなければならない方法を定義する。多くのシステムにおいて、データ・アイテムがＲＡＭから読み出されるときにはデータ・アイテムがローカル・メモリ（例えば、レジスタもしくはオンチップ・キャッシュ）にコピーされること、およびデータ・アイテムが書き込まれるときにはＲＡＭに書き込まれることを指定する単一のメモリ・アクセス・セマンティクスがある。しかし、並列システムおよびマルチ・コア・プロセッサでは、さらなるメモリ・アクセス・セマンティクスを導入してメモリ・アクセスが処理されなければならない異なる方法を指定することが望ましい場合がある。
【００７７】
コンピュータ・プログラムが複数のプロセッサ・コアにまたがって実行される場合、特定のプロセッサ・コア上で実行されるコードに対してプライベートのものであるデータと複数のプロセッサ・コア上で実行されるコード間で共有されるデータとが区別されうる。したがって、マルチ・コア・プロセッサ上で実行されることが意図されているコンピュータ・プログラム・コードでは、ソース・コードにおいて、それぞれのデータ・アクセス・オペレーションについて、アクセスされるデータがプライベートであるかまたは共有であるかを指定することが有用である。
【００７８】
例えば、プログラミング言語は、プライベート・データおよび共有データを表すために限定子を備えていることがある。変数は、プライベート限定子および共有限定子を使って注釈を付けられ、それらの変数が共有であるかプライベートであるかを示し、ポインタ型も、これらのポインタがプライベートまたは共有データを指し示すかどうかを指定するように限定することもできる。例えば、プログラマーは、変数が
＿ｓｈａｒｅｄ＿  ｉｎｔ  ｓｈａｒｅｄＶａｒｉａｂｌｅ；
＿ｐｒｉｖａｔｅ  ｉｎｔ  ｐｒｉｖａｔｅＶａｒｉａｂｌｅ；
のように共有またはプライベート・メモリ内に格納されなければならないことを指示することができる。
【００７９】
ただし、変数ｓｈａｒｅｄＶａｒｉａｂｌｅは、複数のプロセッサ・コア上で実行されているプログラム・コードの間で共有され、変数ｐｒｉｖａｔｅＶａｒｉａｂｌｅは、特定の１つのプロセッサ・コアに対してプライベートである。
【００８０】
同様に、ポインタは、
＿ｓｈａｒｅｄ＿  ｉｎｔ  ＊ｓｈａｒｅｄＤａｔａＰｏｉｎｔｅｒ；
＿ｐｒｉｖａｔｅ＿  ｉｎｔ  ＊ｐｒｉｖａｔｅＤａｔａＰｏｉｎｔｅｒ；
のように共有またはプライベート・メモリを指しているものとしてマークされうる。
【００８１】
ここで、整数ポインタｓｈａｒｅｄＤａｔａＰｏｉｎｔｅｒは共有メモリを指しているが、整数ポインタ変数ｐｒｉｖａｔｅＤａｔａＰｏｉｎｔｅｒは特定の１つのプロセッサ・コアに対してプライベートであるメモリを指している。
【００８２】
データ・アイテムは、異なるアクセラレーション・セクション・コンテキスト・レベルにおいて宣言され、コンテキスト・レベルにまたがってアクセスされうる。上記からの仮説的表記を使用して、一例が図７に示されている。
【００８３】
図７のコード例は、整数データ・アイテムｏｕｔｅｒｖａｌが宣言され、整数データ・アイテムｏｕｔｅｒｖａｌに値２が割り当てられている関数ｆを定義する。ｏｕｔｅｒｖａｌが、ホスト・コンテキスト・レベルｌｅｖｅｌ  ０（つまり、アクセラレーション・セクションの外側）で宣言されるので、変数ｏｕｔｅｒｖａｌは、共有メモリ１１内に格納される。関数ｆ内のアクセラレーション・セクション内において、第２の整数データ・アイテムｉｎｎｅｒｖａｌが宣言され、第２の整数データ・アイテムｉｎｎｅｒｖａｌに値４が割り当てられる。ｉｎｎｅｒｖａｌは第１のアクセラレーション・セクション・コンテキスト・レベル内で宣言されるので、データ・アイテムｉｎｎｅｒｖａｌは、アクセラレーション・セクションが関係するアクセラレータ・プロセッサのローカル・メモリ内に格納される。例えば、アクセラレーション・セクションがアクセラレータ・コア８に関係する場合、データ・アイテムｉｎｎｅｒｖａｌは、アクセラレータ・コア８のローカル・メモリ１２に格納される。
【００８４】
データ・アイテムｏｕｔｅｒｖａｌは、アクセラレーション・セクションの内側のコードからアクセスされる。データ・アイテムが定義されているコンテキスト・レベルと異なるコンテキスト・レベルでデータ・アイテムにアクセスすることは、そのデータ・アイテムの、そのデータ・アイテムが宣言されているコンテキストからそのデータ・アイテムが必要とされるコンテキスト内への転送を引き起こす。このような転送は、アクセラレーション・セクションのコードを実行する、アクセラレータ・コア８から共有メモリ１１へのダイレクト・メモリ・アクセス（ＤＭＡ）要求を用いて遂行されるものとしてよい。
【００８５】
それに加えて、ポインタ変数が特定のアクセラレーション・セクションのコンテキスト内にあることも理解されるであろう。
【００８６】
静的ポインタ型では、プログラム・パーティショニング・ツール２１が、どのコンテキスト・レベルにポインタ・ターゲットが配置されているか、またポインタが生成されるコンテキスト・レベル（つまり、ポインタ変数が宣言されているコンテキスト・レベル）を記述する情報をポインタ型（例えば、データ・アイテムのアドレスをとるとき）にアタッチする。次いで、コンパイラ２２が、適切なデータ転送命令を生成することができる。
【００８７】
動的ポインタ型では、コンテキスト・レベル情報はポインタ型にアタッチされず、ポインタの値にアタッチされる。次いで、ポインタの値が、実行時に検査され、どのようなコンテンツ情報がアタッチされているかに応じて、適切なデータ転送が実行される。例えば、範囲０−０ｘ０ＦＦＦ内のメモリ・アドレスは共有メモリ１１に割り当てられ、範囲０ｘ１０００−０ｘ１ＦＦＦ内のアドレスはアクセラレータ・コアのうちの１つのアクセラレータ・コアのローカル・メモリに割り当てられるということが可能であるが、ただし、それぞれのプロセッサ・コアは異なるアドレス空間に割り当てられる。代替的に、コンテキスト・レベル情報（例えば、フラグの形態の）が、ポインタ値にアタッチされうる（例えば、コンテキスト・レベル情報をポインタ値の一部として表すことによって、またはポインタ値とコンテキスト・レベル情報とからなる構造体としてポインタを実装することによって）。
【００８８】
アクセラレーション・セクションが入れ子になっている場合、データ・アイテムは、複数のコンテキスト・レベルにまたがってアクセスされてもよい。データが複数のコンテキスト・レベルにまたがってアクセスされる場合、データ・アイテムは、データ・アイテムが宣言されているテキスト・レベルに関連付けられているメモリからデータ・アイテムが必要とされるコンテキスト・レベルに直接転送されてもよく、ただし、そのような転送がハードウェアによってサポートされている場合に限る。代替的に、要求されたデータ・アイテムは、カスケード転送を使用して、一方のコンテキスト・レベルから次のコンテキスト・レベルへ、一時バッファを使用して転送されるものとしてよい。
【００８９】
異なるコンテキスト・レベルで宣言されている変数は、異なるメモリ・アクセス・セマンティクスを介してアクセスされうる。例えば、データは、アクセラレーション・セクションの外部の既定のメモリ・アクセス・セマンティクスを使用してアクセスされることもあるが、アクセラレーション・セクション内から共有メモリ１１内に格納されているデータにアクセスする場合にはソフトウェア・キャッシングが使用されるものとしてよい。つまり、共有メモリ１１に格納されているデータの一部のキャッシュが保持され、アクセラレーション・セクション内のコードによって、そこからデータが読み込まれ、そこへデータが書き込まれうる。特定のアクセラレーション・セクションに対してプライベートであるデータは、既定のメモリ・アクセス・セマンティクスを使用してそのアクセラレーション・セクション内でアクセスされうる。
【００９０】
ソフトウェア・キャッシングの使用は、アクセラレータ・コアがダイレクト・メモリ・アクセス技術またはメッセージ・パッシングを使用して共有メモリにアクセスすることしかできないときに有利な場合がある。
【００９１】
ソフトウェア・キャッシングは、プログラムがホスト・コア７上で実行されるときにプログラムがデータにアクセスする方法と似た方法でアクセラレータ・コア上で実行されるときにプログラムが共有メモリ内のデータにアクセスすることを可能にすることができる。それに加えて、われわれの以前の特許出願（国際特許出願公開第２００７／０８５８５５号）で説明されているように、メモリへのライトは、アクセラレーション・セクションの終わりまで遅延させることができ、これにより、コンパイラがアクセラレーション・セクション内の並列処理を最大化することを可能にする。
【００９２】
使用されうる別のメモリ・アクセス・セマンティクスは、ソフトウェアで実装されたトランザクション・メモリに基づく。ここで、共有データへのすべてのリードが追跡され、共有メモリへのすべてのライトがキューに置かれる。ライトは、リードおよびライトの正しい順序が保持されている場合にのみ共有メモリに適用される。
【００９３】
使用されうる別のメモリ・アクセス・セマンティクスは、ガーベジ・コレクション・システムに基づく。ここで、特定のコンテキスト・レベル（特定のコンテキスト・レベルが与えられたメモリ空間に関連付けられている）内のすべてのポインタは、追跡可能であるものとして指定されてよく、したがって、そのコンテキスト・レベルに関連付けられているメモリ空間がガーベジ・コレクションを施される。ガーベジ・コレクション・システムは、追跡可能なポインタのそれぞれを辿って、メモリ空間内のどのデータ要素がポインタによってメモリ空間に到達可能であるか、およびメモリ空間内のどのデータ要素がポインタによって到達可能でないかを判定することができる。到達可能でないすべてのデータ要素は、解放され、空きメモリ・プールに戻すことができる。
【００９４】
アクセラレーション・セクションが同期的にまたは非同期的に実行されなければならないことを指示するためにさらなる修飾子が指定されうる。
【００９５】
アクセラレーション・セクションの内側で使用されるすべてのコードは、そのアクセラレーション・セクションのコンテキスト・レベルに関連付けられているアクセラレータ・コアに対して適しているコンパイラ２２によって自動的に（さらなる注釈を必要とすることなく）コンパイルされる。したがって、アクセラレーション・セクション内にそのルートを有する呼び出しグラフ全体が、アクセラレーション・セクションから（直接的にまたは間接的に）呼び出されるすべての関数を識別するために、そのアクセラレーション・セクションのコンテキスト・レベルについて処理される。異なるコンテキスト・レベルが潜在的に異なる命令セットを持つ異なるアクセラレータ・プロセッサ上にマッピングされうるので、異なるコンテキスト・レベルから呼び出される関数は、この関数が使用されるコンテキスト・レベルに関連付けられているそれぞれのアクセラレータ・コアについてコンパイルされる。
【００９６】
上述の型のポインタ修飾子は、プログラマーがポインタ宣言において特定のポインタのターゲットを指定することを可能にする。これらの修飾子は、場合によっては、例えば、アクセラレーション・セクションに対して関数を処理することで異なるアクセラレーション・セクション情報を有するポインタ型の間に変換の不一致が生じるときに必要になることがある。このような変換の不一致は、以下でさらに詳しく説明される。注釈を最低限度に留めるために、プログラム・パーティショニング・ツール２１は、多くの場合、注釈が付けられていない値およびポインタの型に対するコンテキスト・レベル情報を推論することができる。例えば、ポインタのコンテキスト・レベルは、そのポインタが初期化されて指す変数のコンテキスト・レベルから推論され、関数の戻り値のコンテキスト・レベルは、関数の「ｒｅｔｕｒｎ」ステートメントに含まれる値から推論されうる。
【００９７】
特定のコードが特定のプロセッサ・コア上で実行されなければならないことをプログラマーが指示することを可能にすること、およびデータ・アクセス・セマンティクスが指定されることを可能にすることは、プロセッサ・コアのメモリ・アクセス・セマンティクスおよび選択が場合によってはコンピュータ・プログラムにおいて優先する特定の状況により推論されうるけれども、多くの場合において、どのようなことが生じるべきかをプログラマー側で指定することができることが好ましいので有益である。したがって、プログラム・パーティショニング・ツール２１は、特定のプロセッサ・コアによって、また特定のメモリ・アクセス・セマンティクスを有するデータ・アクセス・オペレーションにより、またソース・コード内に指定されたプロセッサ・コアまたはメモリ・アクセス・セマンティクスを有していない関数およびデータ・アクセス・オペレーションにより、実行されるべきソース・コードにおいて指定されている両方の関数をとる。
【００９８】
次に説明されるが、プログラム・パーティショニング・ツール２１は、どのプロセッサ・コアに対してどの関数がコンパイルされなければならないか、またどのデータ・アクセス・オペレーションでどのデータ・アクセス・セマンティクスが適用されなければならないかを決定するために一連の規則を適用する。確かに、上に示されているように、特定の関数が異なるコンテキストから呼び出されうるので、特定の関数が複数のプロセッサ・コア上で実行されるように、また複数のメモリ・アクセス・セマンティクスとともに、コンパイラされることが必要になる場合がある。
【００９９】
例えば、プログラム内のあるポイントにおいて、関数ｆが、既定のデータ・アクセス・セマンティクスを有し、ホスト・コア７上で実行されるべき関数から呼び出される場合、およびプログラム内の別のポイントにおいて、関数ｆが、アクセラレーション・データ・アクセス・セマンティクスを持つアクセラレーション・セクションから呼び出される場合、プログラム・パーティショニング・ツール２１は、関数ｆの２つの変換されたバージョンを生成し、第１のバージョンは既定のデータ・アクセス・セマンティクスを持つポスト・コア７に対してコンパイルされ、第２のバージョンはアクセラレータ・コア、例えば、アクセラレーション・データ・アクセス・セマンティクスを持つアクセラレータ・コア８に対してコンパイルされうる。正しいメモリ・アクセス・セマンティクスを維持するために、一組の規則がポインタおよび参照の型に適用される。関数を変換するためにプログラム・パーティショニング・ツール２１によって実行される処理について、以下でさらに詳しく説明される。
【０１００】
データが正しくアクセスされることを保証するために、いくつかの実施形態では、プログラム・パーティショニング・ツール２１は、それぞれの異なる種類のデータ・アクセス・セマンティクスを使用してデータを読み出し、書き込むための異なるマクロを含む、一連のＣマクロを出力する。異なるＣマクロは、それぞれの与えられたデータ・アクセス・セマンティクスに対して正しいリードおよびライト・オペレーションを実行するように定義されるものとすることが可能である。
【０１０１】
それぞれの関数について、プログラム・パーティショニング・ツール２１は、呼び出しサイト（つまり、関数が呼び出されるプログラム・コード内のコンテキスト）および呼び出される関数の高水準中間表現（ソース・コード・プリプロセッサ２０によって生成される）を下記の基準に従って調べる。
【０１０２】
高水準中間表現において、関数が指定メモリ・アクセス・セマンティクスを持たないポインタ型パラメータを有する場合、および関数が呼び出されるときにポインタ引数を受け渡される場合に、変換された関数内の対応するパラメータは、呼び出しサイトで受け渡される関数引数と同じメモリ・アクセス・セマンティクスを有する。例えば、ポインタ型パラメータをとる関数が共有ポインタを受け渡される場合、変換された関数は共有ポインタ・パラメータをとる。
【０１０３】
高水準中間表現において、関数がメモリ・アクセス・セマンティクスが指定されていない参照型パラメータを有する場合、および呼び出しサイトで参照型引数を受け渡される場合に、変換された関数の対応するパラメータは、呼び出しサイトで受け渡される参照と同じメモリ・アクセス・セマンティクスを有する。例えば、参照型パラメータをとる関数が特定のプロセッサ・コアに対してプライベートであるメモリへの参照とともに呼び出される場合、変換された関数はプライベート参照パラメータをとる。
【０１０４】
変換されるべき関数内の変数が、明示的なメモリ・アクセス・セマンティクスが指定されていないポインタ型であると宣言されている場合、および変数がポインタ値に初期化される場合、変数は、初期化値のメモリ・アクセス・セマンティクスとともに生成される。複数のメモリ・セマンティクスが初期化値に適用される可能性があれば初期化時に変数にアタッチされるメモリ・アクセス・セマンティクスはない。例えば、ポインタが定数値に初期化され、その定数値が異なるメモリ領域内で有効なアドレスである場合、その値が特定のメモリへのアドレスでない限りメモリ・アクセス・セマンティクスはその変数にアタッチされないか、または定数の型（ポインタ型にアタッチされた情報）が特定のメモリ・セマンティクスを強制する。
【０１０５】
明示的なメモリ・アクセス・セマンティクスを持たないポインタが関数内で宣言され、変数がプライベート値を指すように初期化される場合、ポインタ変数はプライベート・ポインタに変換される。同様に、ポインタ変数がアクセラレーション・セクション内で宣言され、共有変数を指すように割り当てられた場合、ポインタは外側のポインタに変換される。
【０１０６】
メモリ・アクセス・セマンティクスが指定されていないポインタ型変数が、変換されるべき関数内でアクセスされるが、変換されるべき関数の外で宣言され、その関数が呼び出される前に割り当てられることも、アクセスされることもない場合、および変換されるべき関数内で、その変数がポインタ値を代入されている場合、割り当てられたポインタ値のメモリ・アクセス・セマンティクスを有する変数の複製が作成される。
【０１０７】
メモリ・アクセス・セマンティクスが指定されていないポインタ型変数が変換されるべき関数の参照パラメータへの引数として受け渡される場合、変換された関数の変数と参照パラメータ型の両方が、その変換された関数の内側の変数の、もしあれば、初期化からメモリ・アクセス・セマンティクスを受け取る。
【０１０８】
変換されるべき関数内の変数が、メモリ・アクセス・セマンティクスが指定されていない参照型であると宣言されている場合、および変数がメモリ内の特定のデータ・アイテムを参照するように初期化される場合、変数は、初期化データ・アイテムのメモリ・アクセス・セマンティクスとともに生成される（例えば、参照がプライベート・データへの参照である場合、その参照はプライベートにされる）。
【０１０９】
関数がｒｅｔｕｒｎステートメントを含み、関数がメモリ・アクセス・セマンティクスが指定されていないポインタまたは参照を返す場合、変換された関数は、メモリ・アクセス・セマンティクスが返される値によって決定される戻り型を有する。
【０１１０】
関数変換の終わりにメモリ・アクセス・セマンティクスが指定されていないまま続くポインタ型については、既定のメモリ・アクセス・セマンティクスが選択されなければならない。この既定のセマンティクスは、システムの実装者によって決定されうる。
【０１１１】
次いで、一方のメモリ・アクセス・セマンティクスを持つポインタまたは参照から他方のメモリ・アクセス・セマンティクスを持つポインタまたは参照へのどのような変換も未定義または予想外の挙動を引き起こさないことを確認するために変換された関数が型検査される。例えば、一方のメモリ・アクセス・セマンティクスから他方のメモリ・アクセス・セマンティクスへのポインタの変換は、デスティネーション・メモリ・アクセス・セマンティクスがソース・メモリ・アクセス・セマンティクスのスーパーセットでない限り、不正になるものとしてよい。
【０１１２】
上述の型の変換の後、変換された関数は最適化され（必要な場合）、コンパイラ２２のうち１つのコンパイラに与えられるべきターゲット・コンパイラ可読中間表現にコンパイルされる。
【０１１３】
（必要ならば）必要な変換は、さまざまな例を参照しつつ次に説明されるように処理されている特定の関数の性質に依存する。以下の説明では、アクセラレーション・セクション内で、限定子「＿ｏｕｔｅｒ」は、変数が共有メモリ１１内に格納されることを示し、限定子「＿ｉｎｎｅｒ」は、変数がアクセラレーション・セクションが関係するアクセラレータ・コアのローカル・メモリ内に格納されることを示す。以下の説明で使用される限定子は、単に説明的なものにすぎず、適切な限定子があればそれが使用されうることは理解されるであろう。
【０１１４】
図８は、一対の値を引数としてとり、結果を返す、単純関数である、ｍｕｌｔｉｐｌｙを示している。関数ｍｕｌｔｉｐｌｙは大域的環境への依存性を有していないことがわかる。したがって、関数ｍｕｌｔｉｐｌｙは、変換が要求されることなく関数が実行されるべきそれぞれのプロセッサ・コアに対しコンパイルされうる。
【０１１５】
少し複雑な事例が、図９の例に示されている。ここで、関数ｎｅｗ＿ｍｕｌｔｉｐｌｙは、単一のパラメータをとり、関数に受け渡される値にグローバル変数ｂの値を乗じる。ここで、関数ｎｅｗ＿ｍｕｌｔｉｐｌｙは、グローバル変数ｂへの参照がＤＭＡを使用してアクセスされる共有メモリ１１内に格納されている変数ｂへの参照で置き換えられた関数ｎｅｗ＿ｍｕｌｔｉｐｌｙの複製を作成するように変換される。このような変換は、関数ｎｅｗ＿ｍｕｌｔｉｐｌｙがホスト・コア７およびアクセラレータ・コア８、９、１０のそれぞれの上で実行されることを可能にし、元の関数ｎｅｗ＿ｍｕｌｔｉｐｌｙはホスト・コア７上で実行され、変換された複製はアクセラレータ・コア８、９、１０上で実行される。
【０１１６】
アクセラレーション・セクションの内側のポインタ引数（Ｃ＋＋における参照、ＰａｓｃａｌにおけるＶＡＲパラメータ、「ｔｈｉｓ」ポインタおよび戻り値へのポインタなどの暗黙の引数などの明示的なポインタ型または暗黙のポインタ型の両方を含む）を付けて呼び出される関数は、コンパイラがその関数のコピーを生成し、コピー内のポインタ・パラメータが呼び出し内の対応する引数のコンテキスト情報を含むようにプログラム・パーティショニング・ツール２１によって処理される。このプロセスは、以下でさらに詳しく説明される。
【０１１７】
値変数の代わりにポインタ変数をとる関数の一例が、図１０に示されている。関数ａｎｏｔｈｅｒ＿ｍｕｌｔｉｐｌｙは、図８の例の場合のように、２つの値引数の代わりに、２つのポインタ引数をとる。」このような場合、関数変換は、関数を呼び出すために引数のどのような組み合わせを使用するかに応じて、元の関数の複数の変換を生成することがある。一般に、２つのポインタ引数ａおよびｂがあれば、変数ａとｂの両方が共有メモリ１１内のロケーションを指す、変数ａとｂの両方がアクセラレータ・コア８、９、１０のローカルのメモリ内のロケーションを指す、変数ａが共有メモリ１１を指し、変数ｂがアクセラレータ・コア８、９、１０のローカルのメモリを指す、および変数ｂが共有メモリ１１を指し、変数ａがアクセラレータ・コア８、９、１０のローカルのメモリを指す、の４つの可能性がある。そのため、使い方に応じて、関数の最大４つまでのバージョンが出力されうる。出現しないと（関数が呼び出される方法に基づき）判定されうるパラメータの組み合わせは、無視または回避されうる、つまり、関数のそれぞれの呼び出しへの引数の分析によって決定されるように、複製が要求によって駆動されうる。同じアプローチが、参照型のパラメータに適用されうる。関数の複製は、複製されたコードが、特定のアクセラレータ・コア８、９、１０のローカルのメモリとは反対に、共有メモリ１１を参照するように決定された引数へのアクセスのため、メモリ・リードおよびライトの代わりにＤＭＡ転送を生成することを引き起こす。
【０１１８】
次に、参照パラメータをとる関数が変換されうる例が、図１１に示されている疑似コードを参照しつつ説明される。
【０１１９】
図１１の行１から４は、関数ｆｕｎｃを定義している。関数ｆｕｎｃは、２つの整数参照パラメータをとり、第１のパラメータによって参照されている整数値に第２のパラメータによって参照されている整数値を乗じた結果を返す。ｆｕｎｃは、整数参照をパラメータとしてとるので、これは、関数ｆｕｎｃが作用する参照によって受け渡される実際の整数変数であり、これらの整数変数のコピーではない（例えば図８のコードの場合のように）。つまり、ｆｕｎｃが呼び出されるときに、受け渡された変数が格納されるメモリ内のロケーションにアクセスする必要がある。
【０１２０】
主関数（行５から１６）において、アクセラレーション・セクションは、行９でａｃｃｅｌｅｒａｔｉｏｎｓｅｃｔｉｏｎマーカーで定義される。アクセラレーション・セクション・マーカーは、主関数のコードを２つのテキスト・レベル、つまり、アクセラレーション・セクション内のコードとアクセラレーション・セクションの外側のコードとに分割する。アクセラレーション・セクションの外側のコードは、ホスト・コア７によって処理されるべきであるが、アクセラレーション・セクションの内側のコードは、例えば、アクセラレータ・コア８によって処理されるべきである。
【０１２１】
アクセラレーション・セクションの外側において、行７で、整数変数ａが定義され、値２を割り当てられる。整数ａは、アクセラレーション・セクションの外側で定義されるので、共有メモリ１１内に格納される。
【０１２２】
アクセラレーション・セクション内では、行１１で、整数変数ｂが定義され、値３を割り当てられる。整数ｂは、アクセラレーション・セクション内で定義されるので、アクセラレータ・コア８のローカル・メモリ１２内に格納される。
【０１２３】
アクセラレーション・セクション内では、関数ｆｕｎｃは、３度呼び出され、呼び出されるたび毎に、変数ａおよびｂの異なる組み合わせをパラメータとして受け渡される。
【０１２４】
行１２で、ｆｕｎｃが呼び出され、第１のパラメータとして変数ａ、および第２のパラメータとして変数ｂを受け渡される。行１２のコメント（／／によって表される）は、関数ｆｕｎｃがこの場合にどのように変換されるかを示している。関数は、第１のパラメータの前にマーカー＿ｏｕｔｅｒが付けられるように変換される。マーカー＿ｏｕｔｅｒは、第１のパラメータがアクセラレーション・セクションの外側で定義されている整数への参照、つまり、共有メモリ１１内に格納されることを示す。第２のパラメータは、整数ｂが関数ｆｕｎｃへの呼び出しと同じコンテキスト、つまり、アクセラレーション・セクションのコンテキスト内で定義されるので無変化である。
【０１２５】
行１３で、ｆｕｎｃが呼び出され、第１のパラメータとして変数ｂ、および第２のパラメータとして変数ａを受け渡される。行１３のコメントは、関数ｆｕｎｃがこの場合にどのように変換されるかを示している。関数は、第２のパラメータの前にマーカー＿ｏｕｔｅｒが付けられるように変換される。第１のパラメータは、整数ｂが関数ｆｕｎｃへの呼び出しと同じコンテキスト、つまり、アクセラレーション・セクションのコンテキスト内にあるので無変化である。
【０１２６】
行１４で、ｆｕｎｃが呼び出され、変数ｂをその第１および第２の引数として受け渡される。行１４のコメントは、この場合に、第１および第２のパラメータの両方が、整数ｂが関数ｆｕｎｃへの呼び出しと同じコンテキスト内にあるため無変化であることを示している。
【０１２７】
行８で、アクセラレーション・セクションの外側において、関数ｆｕｎｃが呼び出され、変数ａをその第１および第２の引数として受け渡される。この場合、関数ｆｕｎｃは、アクセラレーション・セッションの外側で呼び出されるため、パラメータへの変換は不要である。
【０１２８】
前記の例から、アクセラレーション・セクション・レベルが１つである（つまり、入れ子になったアクセラレーション・セクション・レベルがない）プログラムでは、データ・アイテムは、アクセラレーション・セクション（レベル１）の内側で、またはホスト・レベル（レベル０）で定義されうることがわかる。示されているように、２つのポインタ型パラメータを持つ関数では、関数が呼び出されうるポインタ型引数の４つの異なる組み合わせ、つまり、（レベル０，レベル０）、（レベル０，レベル１）、（レベル１，レベル０）、（レベル１，レベル１）を取り扱うために最大４つまでのコピーが必要であり、それぞれの組は関数に受け渡される引数のアクセラレーション・セクション・コンテキスト・レベルを示す。
【０１２９】
別の例が、図１２に示されている。ｆｉｎｄＭｉｎ関数は、そのポインタ・パラメータｉｎｔＬｉｓｔを通じてｆｉｎｄＭｉｎに受け渡される整数値のリストで最小の整数値を返す。
【０１３０】
図１２の主関数のアクセラレーション・セクション内で、関数ｆｉｎｄＭｉｎは、最初に、図１２のソース・コード内でグローバル変数として宣言されている共有メモリ１１内に保持されている配列ａｒｒａｙＯｆｌｎｔｅｇｅｒｓを付けて呼び出される。したがって、プログラム・パーティショニング・ツール２１は、外部ポインタ（つまり、共有メモリ１１へのポインタ）をその引数として受け付けるｆｉｎｄＭｉｎの変換された複製バージョンを作成する。型推論がない場合、コンパイラは、共有メモリ１１をターゲットとする外部ポインタ（ｉｎｔＬｉｓｔ＋１）を内部ポインタｐ（ｆｉｎｄＭｉｎ関数内で宣言されている）に割り当てようと試みる入力プログラムを拒絶し、したがって、メソッド複製の試みは失敗することになる。型推論がある場合、ｆｏｒループ内の外部ポインタへのｐの初期化は、変数ｐを＿ｏｕｔｅｒ限定子と自動的に関連付けることによって有効にされる。したがって、外側限定子＿ｏｕｔｅｒ限定子の自動伝搬が与えられた場合、ソース・コードへの大幅な変更を実行する必要はない。メソッドの本体内の明示的な＿ｏｕｔｅｒ限定子の追加があれば、プログラマーがｆｉｎｄＭｉｎのオーバーロードを生成し、そのパラメータとして与えられるローカル・ポインタ・パラメータの場合（関数ｆｉｎｄＭｉｎが配列ＩｏｃａｌＡｒｒａｙＯｆｌｎｔｅｇｅｒｓを付けて呼び出されるときに生じるような）を取り扱う必要がある。対照的に、＿ｏｕｔｅｒ限定子の推論は、プログラム・パーティショニング・ツールが必要に応じて適切なオーバーロードを生成することを可能にする。
【０１３１】
アクセラレーション・セクションの外側で宣言されたポインタは、常に、ホストの共有メモリ１１内のデータを指している。このようなポインタは、＿ｏｕｔｅｒ限定子を自動的に与えられる。内部ポインタと外部ポインタとの間の割り当てを許可しないことで、ホスト／アクセラレータ境界をまたがる、有益なある程度の型検査が行われる。例えば、アクセラレーション・セクション内で、内部ポインタを外部ポインタに（またはその逆に）割り当てると、その結果、コンパイル時エラーが発生する。この強い型検査は、行われないと一方のメモリ（例えば、共有メモリ１１）内のロケーションへのポインタが他方のメモリ（例えば、アクセラレータ・コア８、９、１０のメモリ１２、１３、１４のうちの１つのメモリ）内のロケーションに設定されている場合に生じるであろう混乱を防ぐ。とは言っても、一方のメモリ内の特定のメモリ・ロケーションの内容を異なるメモリ内のロケーションに割り当てることが可能でなければならない。これは、図１３を見ると最もよくわかる。ここで、ｆｌｏａｔ型のグローバル変数ｘは、行１で宣言されている。主関数（行２から１３）のアクセラレーション・セクション内で、ｆｌｏａｔ型の値へのポインタｐは、行６で＿ｏｕｔｅｒ限定子とともに定義され、ポインタは共有メモリ１１内の値を参照する。ポインタｐは、変数ｘを格納するメモリ・ロケーションを指すように初期化される。
【０１３２】
行７で、さらなる変数が定義される。変数ａは、限定子を持たず、したがって、アクセラレーション・セクションの内部変数である。変数ａは、変数ｐによって示されているロケーション、つまり、共有メモリ１１内のロケーションに格納されている値を割り当てられる。この割り当てを達成するために、共有メモリ１１からの値が、ダイレクト・メモリ・アクセスによって読み出される。
【０１３３】
行８で、値１．０が、ポインタｐによって示されるロケーションに格納される。ポインタｐが共有メモリを指しているとすると、割り当ては、ダイレクト・メモリ・アクセスを使用して共有メモリ１１にデータを書き込むことを伴う。
【０１３４】
類似のオペレーションが、行９および１０に見られる。行９で、ｆｌｏａｔ型の変数が定義され、値ｘに初期化される。ｘが共有メモリ１１内に格納されているとすると、このコマンドは、ダイレクト・メモリ・アクセスを使用する。同様に、変数ｘが値ｂに設定されている場合、リダイレクト・メモリ・アクセスのライト・コマンドが使用される。
【０１３５】
行１１の命令は、ポインタｐが変数ａのアドレスを指すようにしようとする。変数ａ（行７で宣言されている）は内部変数であり、したがって行１１で試みられた割り当ては不正であることが思い出される。したがって、行１１の命令は、プログラム・パーティショニング・ツール２１によってエラーとして識別される。
【０１３６】
メソッド複製を大きな例に適用する場合、いくつかの場合において＿ｏｕｔｅｒ限定子が自動的に適用されるように型システムを設計すると都合がよい。＿ｏｕｔｅｒがプログラマーによって省かれ自動的に適用されうる２つのコンテキストが、初期化とキャストとにある。つまり、宣言およびキャストにおいて＿ｏｕｔｅｒ限定子を使用する必要はないということである。これは、プログラマーによって必要とされる手作業のソース・コード注釈作成の量が低減されるため、既存のソース・コードが本明細書で説明されているメソッド内で使用されるように修正されている場合に特に有用である。
【０１３７】
初期化の場合を最初に考えると、図１４に示されているソース・コードのフラグメンツを参照しつつ一例が提示されている。ここで、ポインタ変数ｘは、アクセラレーション・セクションの外側にあると宣言される。アクセラレーション・セクション内では、ポインタ変数ｚが宣言される。既定では、ポインタｚは内部ポインタとなるが、ここでは、＿ｏｕｔｅｒ限定子は、ポインタ変数ｚが共有メモリを指すことを示すために明示的に使用されることがわかる。したがって、ポインタｚは、ポインタｘに有効になるように割り当てられうる。
【０１３８】
ポインタ変数ｚ２は、＿ｏｕｔｅｒ限定子なしで宣言される。しかし、その宣言は、ポインタｘへの初期化を含む。ポインタｘが外部ポインタであるとすると、プログラム・パーティショニング・ツール２１によって、ポインタｚ２は外部ポインタでもあることが推論され、またそれに応じて作成されうる。
【０１３９】
次に、キャストに基づく一例が、図１５を参照しつつ説明される。ここで、型Ｔ１のグローバル・ポインタ変数ｇが宣言されている。主関数のアクセラレーション・セクション内で、外部ポインタ変数であることが明示的に示される型Ｔ２のポインタ変数ｖａｒが宣言される。ポインタ変数ｖａｒは、型Ｔ２となるようにキャストされる、グローバル・ポインタ変数ｇの値を割り当てられている。キャストがアクセラレーション・セクション内にあるとすれば、その結果、既定により、内部ポインタが作成される。しかし、キャストされている値（つまり、ｇ）は外部ポインタであるため、キャスト・オペレーションの結果は、外部ポインタであると自動的に推論される。
【０１４０】
図１６は、さらなる一例を示している。ここで、関数ｒｅｉｎｔｅｒｐｒｅｔＩｎｔにパラメータとして受け渡された、整数値へのポインタｉは、ｆｌｏｔ型の値へのポインタとなるようにキャストされ、キャスト・オペレーションの結果によって示されるアドレスに格納されている値が、この関数によって返される。ここで、キャスト・オペレーションによって生成されたポインタは、ポインタｉが内部ポインタであるか外部ポインタであるかに応じて内部ポインタまたは外部ポインタであると判定される。
【０１４１】
上で示されている内部および外部限定子は、メモリ空間の、レベル０とレベル１の二元分類を表している。構文は、任意の数のレベルへのポインタ型の表現が可能になるようになされている。ポインタ型は、ｄｅｃｌｓｐｅｃ（＿ｓｅｔｍｅｍｏｒｙｌｅｖｅｌ（ｌｅｖｅｌ））などの構成体を使用して宣言されるものとしてよく、ただし、ｌｅｖｅｌは例えば、ローカル・ポインタには値１、外部ポインタには値０を有することができるアクセラレーション・セクション・ブロック・レベルである。２以上のレベルに対する値は、入れ子になったアクセラレーション・セクションを示す。したがって、限定子＿ｄｅｃｌｓｐｅｃ（＿ｓｅｔｍｅｍｏｒｙｌｅｖｅｌ＿（０））は＿ｏｕｔｅｒと同等であることがわかる。ｄｅｃｌｓｐｅｃの使用は、アクセラレータ・ローカル・ポインタ型がローカル・ポインタ型を持つ構造体メンバを明示的に宣言するために構造体宣言の内側で有用な場合があるアクセラレーション・セクション・ブロックの外側で宣言されることを可能にする。
【０１４２】
Ｃ＋＋、Ｊａｖａ、またはＣ＃などのオブジェクト指向プログラミング言語でソフトウェアを書くことが望ましい場合が多い。例えば、図１７の疑似コードにおいて、オブジェクト型（多くのオブジェクト指向言語ではクラスと呼ばれる）が名前ＭｙＯｂｊｅｃｔで定義される。ｇｅｔＩｎｃｒｅｍｅｎｔｅｄＦｉｅｌｄと呼ばれるメソッドが、ＭｙＯｂｊｅｃｔのデータ・アイテムｆｉｅｌｄを読み出し、その値をインクリメントし、インクリメントされた値を返すＭｙＯｂｊｅｃｔについて定義されている。
【０１４３】
特定のプロセッサ・コアに対してプライベートであるデータおよびプロセッサ・コア間で共有されるデータを考慮するようにオブジェクト指向プログラミング言語で書かれているソフトウェアを適応させる場合、プライベートであるオブジェクトおよび共有されているオブジェクトに対してそれぞれのメソッドを実装することが必要である。図１７に示されている例では、これは、メソッドが作用するオブジェクトがプライベートであるか、または共有されているかを示す指定子とともに、ｇｅｔＩｎｃｒｅｍｅｎｔｅｄＦｉｅｌｄ（）メソッドを２回またはそれ以上の回数だけ書くことを必要とする場合がある。例えば、図１７の疑似コードは、プログラム・パーティショニング・ツール２１によって図１８に示されている疑似コードを生成するように修正されうる。この方法で、ＭｙＯｂｊｅｃｔのインスタンスがアクセラレーション・セクション内でインスタンス化される場合、＿ｐｒｉｖａｔｅ指定子を含むメソッドが使用されるが、ＭｙＯｂｊｅｃｔのインスタンスがアクセラレーション・セクションの外側でインスタンス化される場合、＿ｓｈａｒｅｄ指定子を含むメソッドが使用される。
【０１４４】
本発明の実施形態が、Ｃ＋＋またはＣ＃などのプログラミング言語で書かれているコンピュータ・プログラムを処理するように実装される場合、ｎｅｗ、ｎｅｗ［］、ｄｅｌｅｔｅ、ｄｅｌｅｔｅ［］演算子のアクセラレーション・セクション・バージョンは、アウター・クオリファイド・バージョンでオーバーロードされうる。これは、開発者が共有メモリに関連付けられているヒート・データからアクセラレータ・コアのローカルのメモリに関連付けられているヒープ・データを別々に管理することを可能にする。
【０１４５】
オーバーロードの解決は、共有メモリに関連付けられているｄｅｌｅｔｅ演算子のあるバージョンが＿ｏｕｔｅｒで限定されたポインタ上で呼び出されることを保証することができる。ｎｅｗの外部バージョンが呼び出される場合、＿ｏｕｔｅｒ修飾子がｎｅｗキーワードの後に自動的に付加され、これにより、共有メモリ内に関連するオブジェクトを作成することになる。
【０１４６】
いくつかの場合において、ｎｅｗ演算子の正しいバージョンが演算子に与えられるパラメータとより具体的にはそれらのパラメータが内部パラメータであるか外部パラメータであるかとに基づき推論されうるので、ｎｅｗ演算子への呼び出しがｎｅｗ演算子の外部バージョンを明示的に呼び出す必要はない。
【０１４７】
いくつかの場合において、両方の関数シグネチャが戻り型の点でのみ異なるので既定のアクセラレーション・セクションのｎｅｗ演算子は既定のアクセラレーション・セクションの外部ｎｅｗ演算子でオーバーロードされえないことを意味するオーバーロード規則が適用されうる。
【０１４８】
オブジェクト指向クラスに関する上述の問題は、型定義、例えば、ｓｔｒｕｃｔにも当てはまる。既定では、型定義内で定義されたポインタ、例えばＣ流の言語のｔｙｐｅｄｅｆステートメントで定義されたポインタは、共有メモリ１１への外部ポインタである。このことは、そのような型定義が、ホスト・コア７とアクセラレータ・コア８、９、１０の両方で実行されるコードによって使用できることを保証する。とは言っても、内部ポインタを有する型の定義を可能にすることは有益であり、したがって、そのような型はアクセラレータ・コア８、９、１０のうちの１つのアクセラレータ・コア上で実行されるときにより効率的に使用されうる。内部ポインタの使用を有効にするために、型定義が複製され、これにより、外部ポインタを使用するバージョンと内部ポインタを使用するバージョンを備えることができる。型定義のそのような複製の結果、関数が複製され、これにより、外部ポインタを使用する型定義と内部ポインタを使用する型定義の両方で動作しうる、特定の関数のバージョンを構成することができることは理解されるであろう。
【０１４９】
関数ポインタまたは仮想メソッドでは、システムのユーザーは、複製されるべき一組の関数内に特定の関数が含まれなければならないことを指定する必要がある場合がある。代替的に、プログラム・パーティショニング・ツール２１は、全体的なプログラム分析を使用してこの一組の関数を決定することができる。ビルド・ツール２３は、システム内のそれぞれのプロセッサ・コアに対して正しいコンパイラ２２およびリンカーを呼び出し、それぞれのアクセラレーション・セクションまたはデータ・オブジェクトに対する正しいメモリ・アクセス・セマンティクスに対し正しいランタイム・システムをリンクする。
【０１５０】
変換された関数を含む関数集合への参照としてプレースホルダ・システムを使用してリンク時まで複製されるべき一組の関数の指定を遅延させることが可能である。プレースホルダ・シンボルが表す一組の関数が、別のロケーションで定義され、別のコンパイル単位（つまり、コードの別々にコンパイルされたブロック）内に置かれる可能性がある。リンク時に、複製されるべき最終的な一組の関数が、他のコンパイル単位からの定義による指定に含まれるプレースホルダ・シンボルを解決することによってビルドされる。プレースホルダ・シンボルが複数回定義される場合、その最終的な一組の関数は、これらの定義の合併集合となりうる。プレースホルダ・シンボルが関数集合内に指定されているが、どのコンパイル単位にも定義されていない場合、ビルド・ツールは該当するエラーを発生させる。
【０１５１】
ビルド・ツール２３は、関数が、最後のコンパイル以降に修正されている場合にのみ再コンパイルされるように保証することができ、これにより、修正後にプログラムを再コンパイルするのに要する時間を短縮する。
【０１５２】
関数が変換された後、関数は、他の同等の呼び出しサイト（例えば、同じコンテキスト・レベル内の同じ関数への呼び出し）から呼び出されるために利用可能である。したがって、すでに変換されている関数は、可能ならば、関数の不要な再変換を回避するために使用される。関数変換ツールは、内部ストア内にこれらのすでに変換されている関数を格納する必要がある。
【０１５３】
上述のメソッドが適用されるコンピュータ・プログラムは、複数のソース・コード・ファイル（コンパイル単位と称される）として出現することがあり、またこれらのファイルのそれぞれは個別に処理されうる。したがって、第１のソース・コード・ファイル内のアクセラレーション・セクションの内側で呼び出される関数は、異なる第２のソース・コード・ファイルにおいて定義されうる。関数が第２のソース・コード・ファイル内のアクセラレーション・セクション内から呼び出されない場合、プログラム・パーティショニング・ツールは、第２のソース・コード・ファイルを処理するときに、特定のアクセラレータ・コアに対して関数がコンパイルされなければならないと判定することができない。この結果、アクセラレータ・セクション内から関数の呼び出しが試みられるとリンク・エラーが発生しうる。これを回避するために、関数属性＿ｄｕｐｌｉｃａｔｅが、必要ならば関数の複製を明示的にトリガーするために使用される。つまり、関数は、適切なアクセラレータ・コアに対してあるバージョンの関数がコンパイルされることを保証するために複製属性で限定されうるということである。
【０１５４】
複製属性は、コンパイラが複製を生成する関数シグネチャを指定するオプションの引数を有する。＿ｄｕｐｌｉｃａｔｅへのパラメータがない場合、元の関数のシグネチャに含まれうるポインタおよび参照の型は、アクセラレーション・セクションの複製関数におけるローカル・ポインタ／参照型となり、上で説明されているように、ときには、内部変数と外部変数の組み合わせを使用して演算可能な特定の関数のバージョンを備えることが有益である。
【０１５５】
図１９は、高水準の、関数の明示的関数複製を使用してプログラムのコンパイルのためのアルゴリズムを示す流れ図である。以下の説明では、「コンパイル単位」という用語は、個別に処理されたソース・コードを示すために使用される。
【０１５６】
ステップＳ１で、コンパイルされるべき一組のコンパイル単位内のコンパイル単位が選択される。ステップＳ２で、選択されたコンパイル単位内の関数が選択される。ステップＳ３で、選択された関数が、例えば図５に示されている関数ｓｐｅｅｄｙＦｕｎｃｔｉｏｎなどのアクセラレーション関数であるかどうかが判定される。選択された関数がアクセラレーション関数ではないと判定された場合、処理はステップＳ４に進み、そこで、選択された関数がどれかのアクセラレーション・セクションを含むかどうかが判定される。ステップＳ４で、選択された関数が１つまたは複数のアクセラレーション・セクションを含むと判定された場合、処理はステップＳ５に進み、そこで、選択された関数内のアクセラレーション・セクションが選択される。
【０１５７】
処理はステップＳ５からステップＳ６に進み、そこで、選択されたアクセラレーション・セクション内のコードによって呼び出される関数に対して呼び出しグラフが構築される。次いで、処理はステップＳ７に進み、そこで、呼び出しグラフ内に指示されている関数のそれぞれが、アクセラレーション・セクションが関連付けられているアクセラレータ・コア８、９、１０上で実行されるようにコンパイルされる。ステップＳ７から、処理はステップＳ８へ進み、そこで、アクセラレーション・セクションの本体が適切なアクセラレータ・コア８、９、１０上で実行されるようにコンパイルされる。
【０１５８】
次いで、処理はステップＳ９に進み、そこで、選択されたアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションであるかどうかが判定される。選択されたアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションではないと判定された場合、処理はステップＳ５に戻り、選択された関数内の次のアクセラレーション・セクションが選択される。
【０１５９】
その一方で、ステップＳ９で、選択されたアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションであると判定された場合、処理はステップＳ１０に進み、そこで、選択された関数内の残りのコード（つまり、アクセラレーション・セクション内にないコード）が、ホスト・プロセッサ７上で実行されるようにコンパイルされる。
【０１６０】
ステップＳ１０から処理がステップＳ１１に進み、そこで、選択された関数が現在選択されているコンパイル単位内の最後の関数であるかどうかが判定される。選択された関数が現在選択されているコンパイル単位内の最後の関数ではないと判定された場合、処理はステップＳ２に戻り、現在選択されているコンパイル単位内の次の関数が選択される。
【０１６１】
その一方で、ステップＳ１１で、選択された関数が現在選択されているコンパイル単位内の最後の関数であると判定された場合、処理はステップＳ１２に進み、そこで、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であるかどうかが判定される。現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位でないと判定された場合、処理はステップＳ１に戻り、コンパイルされるべき次のコンパイル単位が選択される。その一方で、ステップＳ１２において、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であると判定された場合、処理はステップＳ１３で終了する。
【０１６２】
ステップＳ３で、選択された関数がアクセラレーション関数であると判定された場合、処理はステップＳ１４に進み、そこで、選択された関数がアクセラレータ・コア８、９、１０のうちの適切な１つのアクセラレータ・コア上で実行されるようにコンパイルされる。処理はステップＳ１４からステップＳ１１に進む。
【０１６３】
ステップＳ４で、選択された関数がどのアクセラレーション関数も含まないと判定された場合、処理はステップＳ１５に進み、そこで、選択された関数がホスト・プロセッサ７上で実行されるようにコンパイルされる。処理はステップＳ１５からステップＳ１６に進み、そこで、選択された関数が例えば上述の＿ｄｕｐｌｉｃａｔｅ修飾子を使用して関数複製に関して明示的に注釈を入れられるかどうかが判定される。選択された関数が複製に関して注釈を入れられないと判定された場合、処理はステップＳ１６からステップＳ１１に進む。その一方で、ステップＳ１６で、関数が複製に関して注釈を入れられると判定された場合、処理はステップＳ１７に進み、選択された関数がアクセラレータ・プロセッサ上で実行されるようにコンパイルされる。処理はステップＳ１７からステップＳ１１に進む。
【０１６４】
図１９を参照しつつ上で説明されているメソッドでは、関数がアクセラレーション・セクションを有せず、それ自体アクセラレーション関数でないと判定された場合にのみ＿ｄｕｐｌｉｃａｔｅ修飾子を使用することは理解されるであろう。関数がアクセラレーション関数である場合に複製修飾子を使用するために説明されているメソッドに修正を加えることができることは理解されるであろうが、代替的アクセラレータ・コア上で実行されるように関数をコンパイルすることによって関数を複製することが望ましい。
【０１６５】
上で図１９を参照しつつ説明されている処理は、コンパイル・プロセスにおけるコンパイル単位の独立性を取り扱い、アクセラレータ・プロセッサ上で実行されなければならないコードのセクションがアクセラレータ・プロセッサ上で実行されるように正しく変換されることを保証する。コンパイル単位の独立したコンパイルが行われるとした場合、複製は、複製修飾子を使用する注釈を介したプログラマーの明示的な命令を除き翻訳単位の境界をまたがない。
【０１６６】
複製について関数に注釈を入れる必要性を回避する複製のアプローチは、コンパイラが、特定のコンパイル単位のコンパイル時に、未解決の複製関数、つまり、本体が現在のコンパイル単位内にない複製を必要とする関数を識別し、非ローカル関数の必要な複製を生成するために依存関係を再コンパイルすることができる場合に達成される。図２０は、異なるコンパイル単位内の関数を識別し、再コンパイルするために実行される処理を示す流れ図である。
【０１６７】
ステップＳ２５で、コンパイルされるべき一組のコンパイル単位内のコンパイル単位が選択される。ステップＳ２６で、選択されたコンパイル単位内の関数が選択される。ステップＳ２７で、選択された関数がアクセラレーション関数であるかどうかが判定される。選択された関数がアクセラレーション関数ではないと判定された場合、処理はステップＳ２８に進み、そこで、選択された関数がどれかのアクセラレーション・セクションを含むかどうかが判定される。ステップＳ２８で、選択された関数が１つまたは複数のアクセラレーション・セクションを含むと判定された場合、処理はステップＳ２９に進み、そこで、選択された関数内の第１のアクセラレーション・セクションが選択される。
【０１６８】
処理はステップＳ２９からステップＳ３０に進み、そこで、選択されたアクセラレーション・セクション内のコードによって呼び出される関数に対して呼び出しグラフが構築される。次いで、処理はステップＳ３１に進み、そこで、ステップＳ３１で作成された呼び出しグラフ内の関数が選択される。次いで、処理はステップＳ３２に進み、そこで、ステップＳ３１で選択された関数が現在のコンパイル単位の一部であるかどうかが判定される。ステップＳ３１のグラフで選択された関数が現在のコンパイル単位の一部であると判定された場合、処理はステップＳ３３に進み、そこで、ステップＳ３１で選択された関数がアクセラレータ・コア８、９、１０のうちの適切な１つのアクセラレータ・コアに対してにコンパイルされる。処理はステップＳ３３からステップＳ３４に進み、そこで、選択された関数が呼び出しグラフ内の最後の関数であるかどうかが判定される。選択された関数が呼び出しグラフ内の最後の関数ではないと判定された場合、処理はステップＳ３１に戻り、呼び出しグラフ内の次の関数が選択される。
【０１６９】
ステップＳ３２で、呼び出しグラフから選択された関数が、現在のコンパイル単位内にないと判定された場合、処理はステップＳ３５に進み、そこで、ステップＳ３１で選択された関数を含むコンパイル単位が決定され選択される。処理はステップＳ３５からステップＳ３６に進み、そこで、ステップＳ３１で選択された関数がステップＳ３５で選択されたコンパイル単位内から選択される。次いで、処理はステップＳ３７に進み、ステップＳ３１で選択された関数がアクセラレーション・プロセッサ８、９、１０上で実行されるようにコンパイルされる。処理はステップＳ３７からステップＳ３４に進む。
【０１７０】
ステップＳ３４で、ステップＳ３１で選択された関数が呼び出しグラフ内の最後の関数であると判定された場合、処理はステップＳ３８に進み、そこで、選択されたアクセラレーション・セクションの本体がアクセラレータ・コア８、９、１０のうちの適切な１つのアクセラレータ・コア上で実行されるようにコンパイルされる。
【０１７１】
次いで、処理はステップＳ３８からステップＳ３９に進み、そこで、現在選択されているアクセラレーション・セクション（ステップＳ２９で選択された）が現在選択されている関数（ステップＳ２６で選択された）内の最後のアクセラレーション・セクションであるかどうかが判定される。現在選択されているアクセラレーション・セクションが現在選択されている関数内の最後のアクセラレーション・セクションではないと判定された場合、処理はステップＳ２９に戻り、次のアクセラレーション・セクションが選択される。その一方で、ステップＳ３９で、現在のアクセラレーション・セクションが選択された関数内の最後のアクセラレーション・セクションであると判定された場合、処理はステップＳ４０に進み、そこで、選択された関数内の残りのコード（つまり、アクセラレーション・セクション内にないコード）が、ホスト・プロセッサ７上で実行されるようにコンパイルされる。
【０１７２】
ステップＳ４０から処理がステップＳ４１に進み、そこで、選択された関数が現在選択されているコンパイル単位内の最後の関数であるかどうかが判定される。選択された関数が現在選択されているコンパイル単位内の最後の関数ではないと判定された場合、処理はステップＳ２６に進み、現在選択されているコンパイル単位内の次の関数が選択される。
【０１７３】
その一方で、ステップＳ４１で、選択された関数が現在選択されているコンパイル単位内の最後の関数であると判定された場合、処理はステップＳ４２に進み、そこで、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であるかどうかが判定される。現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位でないと判定された場合、処理はステップＳ２５に進み、コンパイルされるべき次のコンパイル単位が選択される。その一方で、ステップＳ４２において、現在選択されているコンパイル単位がコンパイルされるべき最後のコンパイル単位であると判定された場合、処理はステップＳ４３で終了する。
【０１７４】
ステップＳ２７で、選択された関数がアクセラレーション関数であると判定された場合、処理はステップＳ４４に進み、そこで、選択された関数がアクセラレータ・プロセッサ８、９、１０上で実行されるようにコンパイルされる。処理はステップＳ４４からステップＳ４１に進む。
【０１７５】
ステップＳ２８で、選択された関数がどのアクセラレーション関数も含まないと判定された場合、処理はステップＳ４５に進み、そこで、選択された関数がホスト・プロセッサ７上で実行されるようにコンパイルされる。処理はステップＳ４５からステップＳ４１に進む。
【０１７６】
処理されているが、変換されてはいないプログラム・ソース全体の中の関数のすべてをディスクに保存することによって、関数は、必要に応じて、ただ単に単一のコンパイル単位ではなく、プログラム全体にわたって変換されうる。すでに変換されている関数およびその元ソースのストアを維持することによって、前のコンパイルで変換されていなかった、または前のコンパイル以降に変化した関数のみを変換することが可能である。
【０１７７】
関数がアクセラレーション・セクションから呼び出されるが、呼び出される関数のソース・コードが利用可能でない場合、関数は呼び出される関数がコンパイルされたコンテキストにおいて実行される必要がある。例えば、関数がレベル０（ホスト・レベル）についてコンパイルされ、アクセラレーション・セクション・レベル１から呼び出された場合、呼び出される関数への呼び出しは、ホスト・コア７を介してディスパッチされうる。このメカニズムは、さらに多くのアクセラレーション・セクションを生成するために使用され、これにより、アクセラレータ・コアの利用がなおいっそう改善し、ひいては並列性が向上し、消費電力がさらに低減しうる。つまり、呼び出される関数が特定のアクセラレータ・コアについてのみコンパイルされる場合、その関数は、そのアクセラレータ・コア上で、アクセラレータ・コアのうちの別の１つのアクセラレータ・コア上で実行されるコードから実行させられうる。これは、呼び出しに対する引数が関連するプロセッサ・コアへのメッセージ・パッシング・システムを介して送信される遠隔呼び出しを使用して達成されうる。
【０１７８】
Ｃｅｌｌ  ＢＥプロセッサなどのプロセッサにおいて、コスト・プロセス・コアが通常のメモリ・アクセス・セマンティクスを有し、アクセラレータ・プロセッサ・コアがローカル・メモリを有し、共有メモリへのＤＭＡアクセスを行える場合、どのアクセラレーション・セクションであってもその外部にあるコードは、システムを通じて受け渡され予想通りに動作しなければならない。アクセラレーション・セクションの内側にあるコードは、アクセラレータ・コア上で実行されるように変換される関数に変換されなければならない。アクセラレータ・コア上でコードの実行を開始するために、アクセラレーション・セクションを含む関数は、変換された関数の呼び出しグラフ全体をアクセラレータ・コア上にロードするランタイム関数を呼び出し、アクセラレーション・セクションの本体を表す変換された関数を呼び出すためにアクセラレータ・プロセッサ上で関数呼び出しを発行しなければならない。これを達成するために、ビルド・ツール２３は、変換される関数の呼び出しグラフを必要に応じてアクセラレータ・コア上にコピーするようになされたコードを備える。
【０１７９】
アクセラレーション・セクション内では、ＤＭＡなどのアクセラレータ特有の機能が使用されうる。このような機能は、型付けされていない、したがって、比較的安全でない（プログラミングの意味で）可能性があるが、プログラマーには高い性能をもたらしうる。ソース・コード・プリプロセッサは、アクセラレーション・セクション内のコードを分析することができ、ＤＭＡなどの機能がより効果的に使用されることを可能にするプログラム・コードへの手動または自動化された変更を提案するアドバイスをプログラマーに提供する。
【０１８０】
自動化された変更の場合、特定のデータ・アクセス・セマンティクス（例えば、ソフトウェア・キャッシング）を使用して実行されたときに不効率であるホスト・メモリ内のデータへのアクセス・パターンが検出される。そのような一アクセス・パターンは、外部ポインタ算術演算およびそのポインタ算術演算によって指示されるメモリ・ロケーションでのアクセスを使用して、ホスト・メモリ内の配列からアイテムのシーケンスを読み出すことを伴いうる。このような場合、命令のシーケンスが生成され、ポインタ算術演算およびデリファレンス・アクセスを型安全で効率的なＤＭＡアクセスで置き換えるように入力ソース・コードを修正するようになされたツールに与えられるようにできる。
【０１８１】
ＤＭＡ機能が使用される際に用いられる型安全なインターフェイスを構成するためにＣ＋＋テンプレート・クラスが使用される。演算子オーバーロードは、コード内の外部ポインタの代わりに、適切な型パラメータでパラメータ化されている、このクラスのインスタンスを使用することを可能にする。アクセス・パターンに応じて、異なるＣ＋＋テンプレートがインスタンス化されうる。このようなテンプレートは、オンデマンドでリードもしくはライトを実行するか、またはホスト・メモリからの外部配列をアクセラレータ・メモリ内にキャッシュすることができる。
【０１８２】
効率を改善するために使用されうる自動化されたコード修正の別の例は、アクセラレーション・セクション・ブロックのパラメータ・リストにローカル変数を追加することを伴う。
【０１８３】
上で説明されている型の自動化されたソース・コード修正は、都合のよいどの方法でも実装されうることは理解されるであろう。例えば、コンピュータ・プログラムは、入力として、元のソース・コードおよびソース・コード・プリプロセッサによって生成された命令のシーケンスを受け取ることができる。次いで、このようなコンピュータ・プログラムは、修正されたソース・コードを出力する。そのような修正を実行するようになされたコンピュータ・プログラムは、既存のソース・コード開発環境へのプラグインを使って都合よく形成されうる。
【０１８４】
図２１は、本発明の一実施形態によって処理されたコードが実行されうるプロセッサ配置構成を示している。ホスト処理ユニット３０は、ホスト・プロセッサ・コア３１とホスト・メモリ３２とを備える。ローカル・メモリ３４を有するアクセラレータ・プロセッサ３３は、外部バス３５によってホスト処理ユニット３０に接続される。アクセラレータ・コア３３は、ＤＭＡコマンドを使用してホスト・メモリ３２内に格納されているデータにアクセスすることができる。これを行うために、ホスト・プロセッサ・コア３１は、最初に、ホスト・メモリ３２内のデータ・バッファ内にデータを用意し、データ・バッファの内容はアクセラレータ・プロセッサ３３によってアクセス可能である。
【０１８５】
このような配置構成を都合よく可能にするために、２つの入れ子になったアクセラレーション・セクションが、図２２のコードに示されていうように使用されうる。ここで、コード４０は、アクセラレーション・セクションの外側にあり、ホスト・プロセッサ・コア３１上で実行される。第１のレベルのアクセラレーション・セクション４１内のコードは、アクセラレータ・プロセッサ３３からアクセス可能なデータ・バッファ内にデータをコピーするようになされている。第２のレベルのアクセラレーション・セクション４２内のコードは、アクセラレータ・プロセッサ３３上で実行され、ローカル・メモリ３４内のデータにアクセスする内部変数を使用する。
【０１８６】
次に図２３を参照すると、コード４０がホスト・メモリ３２にアクセスすることが分かる。第１のレベルのアクセラレーション・セクション４１内のコードは、ＤＭＡを使用してアクセラレータ・プロセッサ３３からアクセス可能なデータ・バッファを備えるホスト・メモリ３２の領域４３にアクセスする。第２レベルのアクセラレーション・セクション内のコードは、ローカル・メモリ３４を使用する。
【０１８７】
図２２のコードをさらに詳しく見ると、行４において、ホスト・メモリ３２に格納される変数が宣言されることがわかる。行７において、第１のレベルのアクセラレーション・セクション４１内で、行４で宣言された変数の値に初期化される変数が宣言されていることがわかる。行７の宣言が第１のレベルのアクセラレーション・セクション内にあるとすれば、宣言された変数は、ホスト・メモリ３２の領域４３内に格納される。
【０１８８】
第２のレベルのアクセラレーション・セクション４２内では、行８でさらなる変数が宣言される。ここで、その変数は、第２のレベルのアクセラレーション・セクション内にあるため、ローカル・メモリ３４内に作成される。作成された変数は、行７で作成された変数を使用して（つまり、ホスト・メモリ３２の領域４３からのデータを使って）初期化される。
【０１８９】
行１１では、行７で作成された変数が行１０で初期化された変数の値に等しくなるように設定される。このようにして、データはホスト・メモリ３２の領域４３に書き込まれる、つまり、データはＤＭＡを使用してホスト・メモリに書き戻される。
【０１９０】
いくつかの実施態様では、コンパイラ２２は、従来のコンパイラである。したがって、本明細書で説明されているメソッドは、そのような従来のコンパイラを使用してコンパイルすることができるコードを備える。このことを念頭に置くと、プログラム・データのサイズ、順序、アライメント、パディング、およびバイト順を含むメモリ内のデータの配置構成が重要なものとなりうる。
【０１９１】
本発明の実施形態を使用して処理されるソース・コードは、標準ライブラリ関数を使用することができる。ソース・コードがプロセッサ・コアのうちのどれか１つのプロセッサ・コア上で実行されうるとすると、そのようなライブラリ関数がそれぞれのプロセッサ・コア上での実行に利用可能にされることが好ましい。
【０１９２】
したがって、本発明の実施形態は、コンパイル時にプログラムの型に対するデータ・レイアウトの特性に関するアサーションを生成することができる。これらのアサーションは、集成体型のサイズおよびアライメント、ならびにコンポーネントのオフセットに対する静的アサーションを表す。Ｃ＋＋のプログラム・テキストの形態をとることができる。これらのアサーションをプログラム・テキストに組み込み、従来のコンパイラを使ってコンパイルすることで、相互運用性が保証される。
【０１９３】
前記の説明では、アクセラレーション・セクション内の特定のコードが特定のプロセッサ・コア上で実行されることを引き起こすためにアクセラレーション・セクションがソース・コード内でどのように指定できるかを説明した。アクセラレーション・セクションが適切に取り扱われるようにするために、ソース・コードはいくつかの基本的制約条件を満たしていなければならない。例えば、ソース・コードは、ローカル・ジャンプ（例えば、ｇｏｔｏ）およびアクセラレーション・セクション境界をまたぐロング・ジャンプ・コマンドを含むことはできない。このような制約条件は、ソース・コード前処理ツール２０によって強制されうる。
【０１９４】
前記の説明では、システムのさまざまなコンポーネント間のタスクの分離について説明しているが、上述のタスクは都合のよい任意の方法でシステムのさまざまなコンポーネント間で分離されうることは理解されるであろう。例えば、ソース・コード・プリプロセッサ２０は、構文および型に関する検査を実行するものとして説明されているが、そのような検査は、代わりに、プログラム・パーティショニング・ツール２１によっても実行されうる。
【０１９５】
前記の説明では、複数のプロセッサ・コア上でソース・コードを実行させるために特定の構成体をそのソース・コードにどのように適用できるかを説明している。入力として修正されたソース・コードをとり、説明されている構成体を取り除くプリプロセッサが用意され、これにより、ソース・コードが実行のため都合よく処理されうる。このようにして、ソース・コードの可搬性が維持される。
【０１９６】
本発明のさまざまな特徴が、Ｃ＋＋風の疑似コードを参照しつつ説明されているが、本明細書で説明されている方法は、好適な任意のプログラミング言語適用されうることは理解されるであろう。したがって、前記の説明では関数への参照がなされているが、関数という用語は、オブジェクト指向の意味でのメソッドの類似の構成体、プロシージャ、およびサブルーチンを包含することが意図されていることは理解されるであろう。
【０１９７】
本明細書で取りあげた例では特定の修飾子およびキーワードが使用されているが、本発明の実施形態は、好適な任意の修飾子およびキーワードを使用して実装されうることも理解されるであろう。
【０１９８】
前記の説明においてプロセッサ・コアへの参照がなされている場合、説明されているメソッドは、コードが複数の個別のプロセッサにまたがって実行され、コードの異なる部分がプロセッサのうちの異なる１つのプロセッサによって実行される場合に使用するのに適していることは理解されるであろう。
【図１】
0005851396.tif 000002
【図２】
0005851396.tif 000003
【図３Ａ】
0005851396.tif 000004
【図３Ｂ】
0005851396.tif 000005
【図４】
0005851396.tif 000006
【図５】
0005851396.tif 000007
【図６】
0005851396.tif 000008
【図７】
0005851396.tif 000009
【図８】
0005851396.tif 000010
【図９】
0005851396.tif 000011
【図１０】
0005851396.tif 000012
【図１１】
0005851396.tif 000013
【図１２】
0005851396.tif 000014
【図１３】
0005851396.tif 000015
【図１４】
0005851396.tif 000016
【図１５】
0005851396.tif 000017
【図１６】
0005851396.tif 000018
【図１７】
0005851396.tif 000019
【図１８】
0005851396.tif 000020
【図１９】
0005851396.tif 000021
【図２０】
0005851396.tif 000022
【図２１】
0005851396.tif 000023
【図２２】
0005851396.tif 000024
【図２３】
0005851396.tif 000025