(57)【要約】  コンピュータプログラムを並列プロセッサ上で実行するためのコンピュータシステム。このシステムは、コンピュータプログラム内で並列標識を識別するためのコンパイラを有する。並列標識は、複数の並列標識の間のコードは、並列に実行され得、遅延させられた副作用とともに実行されるべきであるということを示す。また、このシステムは実行システムを有する。実行システムは、並列標識により識別されたコードを実行し、副作用の待ち行列を生成し、当該コードの実行が終了した後に副作用の待ち行列を逐次実行する機能を有する。【選択図】図７
2009524866.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータプログラム内で並列標識を識別するためのコンパイラを備え、
前記並列標識は、複数の前記並列標識の間のコード、すなわち並列領域、は遅延させられた副作用とともに実行されるべきであるということを示すことを特徴とし、
前記並列標識により識別された前記コードを実行し、副作用の待ち行列を生成し、前記コードの実行が終了した後に前記副作用の前記待ち行列を逐次実行するための実行システムをさらに備えたことを特徴とするコンピュータプログラムのための並列化システム。
【請求項２】
前記コンパイラは、複数の前記並列標識の間において、標識が付された１または２以上の分割可能オブジェクトと、統合の指示と、を識別する機能を有し、
前記分割可能オブジェクトは、並列実行のために１つの変数がどこで複数のローカル変数に分割され得るかを示し、
前記統合の指示は、前記複数のローカル変数がどのように単一の変数に統合され得るかを示すことを特徴とする請求項１記載の並列化システム。
【請求項３】
前記コンパイラは、どこで前記コードを断片に分割することが可能であるかを、複数の前記並列標識の点の間において決定する機能を有することを特徴とする請求項１または２に記載の並列化システム。
【請求項４】
前記実行システムは、コード断片を異なるプロセッサに送付する機能を有し、
それぞれのプロセッサは、共有されたもしくはローカルのメモリ空間、または両者の組合せを使用することを特徴とする請求項３記載の並列化システム。
【請求項５】
１つのプロセッサ上のコード断片の状態を作業待ち行列に保存し、
全ての入力データの用意ができている時に、前記コード断片の前記状態を別のプロセッサで再読込みするように構成されたことを特徴とする請求項３または４に記載の並列化システム。
【請求項６】
前記実行システムは、１または２以上の推測方略を用いてコード断片を推論的に実行する機能を有することを特徴とする請求項３〜５のいずれか１つに記載の並列化システム。
【請求項７】
２または３以上の並列領域が入れ子化されていることを特徴とする請求項１〜６のいずれか１つに記載の並列化システム。
【請求項８】
複数の独立した並列領域が規定されており、
これらは並列に実行され得ることを特徴とする請求項１〜７のいずれか１つに記載の並列化システム。
【請求項９】
請求項１〜８のいずれか１つに記載の並列化システムにおいて用いるためのコンパイラ。
【請求項１０】
請求項１〜８のいずれか１つに記載の並列化システムにおいて用いるように構成されたことを特徴とする実行システム。
【請求項１１】
分割及び統合の操作を実行する機能を有し、
分割の操作は、並列実行のためにどこで１つの変数が複数の変数に分割され得るかを示し、
前記統合の操作は、どこで前記複数の変数が単一の変数に統合され得るかを示すことを特徴とする請求項１０記載の実行システム。
【請求項１２】
１つのプロセッサ上のコード断片の状態を作業待ち行列に保存し、
全ての入力データの用意ができている時に、前記コード断片の前記状態を別のプロセッサで再読込みする機能を有することを特徴とする請求項１０または１１に記載の実行システム。
【請求項１３】
コンピュータプログラム内で並列標識を識別するように構成され、
前記並列標識は、複数の前記並列標識の間のコードは遅延させられた副作用とともに実行されるべきであるということを示すことを特徴とし、
前記並列標識により識別された前記コードを実行し、副作用の待ち行列を生成し、前記コードの実行が終了した後に前記副作用の前記待ち行列を逐次実行するようにさらに構成されたことを特徴とするコンピュータプログラムを実行するためのシステム。
【請求項１４】
複数の前記並列標識の間において、１または２以上の分割可能オブジェクトと、統合の指示と、を識別するように構成され、
前記分割可能オブジェクトは、並列実行のために１つの変数がどこで複数のローカル変数に分割され得るかを示し、
前記統合の指示は、前記複数のローカル変数がどのように単一の変数に統合され得るかを示すことを特徴とする請求項１３記載のシステム。
【請求項１５】
コンピュータプログラム内で並列標識を識別することを備え、
前記並列標識は、複数の前記並列標識の間のコードは遅延させられた副作用とともに実行されるべきであるということを示すことを特徴とし、
前記並列標識により識別された前記コードを実行し、副作用の待ち行列を生成し、前記コードの実行が終了した後に前記副作用の前記待ち行列を逐次実行することをさらに備えたことを特徴とするコンピュータプログラムを実行するための方法。
【請求項１６】
並列標識を有し、
前記並列標識は、複数の前記並列標識の間のコードまたは指示、すなわち並列領域、は遅延させられた副作用とともに実行されるべきであるということを示すことを特徴とする、好ましくはデータ担体またはコンピュータ可読性媒体に格納されたコンピュータプログラム。
【請求項１７】
複数の前記並列標識の間において、
標識が付された１または２以上の分割可能オブジェクトと、
統合の指示と、
を有し、
前記分割可能オブジェクトは、並列実行のために１つの変数がどこで複数のローカル変数に分割され得るかを示し、
前記統合の指示は、前記複数のローカル変数がどのように単一の変数に統合され得るかを示すことを特徴とする請求項１６記載のコンピュータプログラム。
【請求項１８】
複数の並列領域が規定されていることを特徴とする請求項１６または１７に記載のコンピュータプログラム。
【請求項１９】
１または２以上の並列領域が外側の同様の並列領域の中に入れ子化されていることを特徴とする請求項１８記載のコンピュータプログラム。
【請求項２０】
前記並列領域は、独立しており、これにより並列に実行され得ることを特徴とする請求項１９記載のコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの並列実行のためのシステム及び方法に関する。
【背景技術】
【０００２】
ＵＳ５８５２７３４には、プログラム実行を高速化するための並列コンパイラについて記載がなされている。このプログラム実行の高速化は、複数のプロセッサ上でループを分解し、これらを並列に実行することにより行われる。まず、ソースプログラムの中に、並列に実行されることになるループが設けられる。その後、このループはデータ依存について分析される。分析結果は、データ依存ベクトルの計算に用いられる。その後、ループ内で実行されたインデックスの全領域は分解され、複数のプロセッサに割り当てられる。さらに、複数のプロセッサ間でデータが移送される必要があるか否かについて決定される。配列インデックス空間に基づき、通信ベクトルが算出される。データ依存ベクトル及び通信ベクトルは「ＡＮＤ」化され、通信依存ベクトルが算出される。その後、通信依存ベクトルの値に基づいて、オペランドの通信方法及びループ実行が決定される。
【０００３】
ＵＳ５８５２７３４の実施形態及び他の公知の並列化システムには、これらはデバッグするのが非常に難しいという問題がある。これは、実際上極めて重大な障壁となっている。この問題は、公知のシステムは一般に本来非決定的であるということに起因している。これは、並列化されたアルゴリズムの幾つかの部分は最初に終了する他の部分に依存しているということを意味する。偶発的なプロセッサエラー等の様々な理由により、プログラムの部分が実行されるタイミングが乱れることがある。これにより、並列化されたアルゴリズムが機能しなくなることがある。タイミングエラーは偶発的な事象に起因し得るため、この種の問題の所在を究明することは極めて困難である。すなわち、システムの信頼性が保証され得ない。
【０００４】
また、他の公知のシステムでは、単一の共有メモリ空間が採用されている。昨今のアーキテクチャでは、実行効率を上げるために多重メモリ空間が提案されている。従って、多重ハードウェアプラットフォーム上で作動することができると言明している高性能な並列化システムは、多重メモリ空間を保持することが必要不可欠となっている。
【発明を実施するための最良の形態】
【０００５】
（発明の概要）
本発明によれば、コンパイラを備えた並列化システムが提供される。この並列化システムは、コンピュータプログラム内で並列標識（concurrency marker）を識別する手段を有する。並列標識により、２つの並列標識の間のコード内ではいかなる副作用も遅延させられなければならないということが示される。また、本並列化システムは、実行システムを有する。実行システムは、実行システムが実行される時に、並列標識により識別されたコードが副作用の待ち行列を生成すること、及び、当該コードの実行が終了した後に、副作用の待ち行列を逐次実行すること、を確保する。実行システムは、ソフトウェア、ハードウェア、または両者の組合せにおいて実施され得る。
【０００６】
どのコードが遅延させられた副作用（以下、「遅延副作用」ということがある）を有することになるか、を示す標識を用いて、これら標識を認識するようにコンパイラを構成することにより、コンパイラが自動的にソフトウェアを並列化することを可能にするための非常に簡素で本質的に決定的な技術が提供される。これにより、デバッグが簡素化され、信頼性が向上する。また、並列性の指示によりコードが実質的に独立したブロックへと分割されるため、プログラムは広範な異なるシステムの上で実行され得ることになる。具体的には、並列性の指示により、データは異なるメモリ空間に保存され得るブロックへと分割される。また、並列ブロックは自動的に並列化され得るため、本発明の並列化システムは、プロセッサ数及びメモリ空間数の両方について容易に拡張可能になる。
【０００７】
コンパイラは、複数の並列標識の間において（複数の並列標識に挟まれた部分において）１または２以上の分割標識（split marker）を識別する機能を有してよい。分割標識は、プログラムが分割される場所を示す。分割により、必要に応じ、並列に実行され得る別々のプログラム断片（program fragment）が形成される。実行システムは、コードの断片を並列に実行し、副作用の待ち行列を生成する。そして、コードの実行が終了した後に、副作用の待ち行列を逐次実行する。
【０００８】
コンパイラは、複数の並列標識の間において１または２以上の特殊変数（special variable）を認識する機能を有してよい。特殊変数は、必要に応じ、並列実行に係る多くの変数に分割されてよい。また、コンパイラは、複数の並列標識の間において統合の指示を認識する機能を有してよい。統合の指示は、多くの変数の出力がどのように単一の結果へと統合され得るかを示す。実行システムは、分割変数（split variable）を、１または２以上の異なる実行用プロセッサに導く機能を有してよい。また、実行システムは、更新された各変数を受理する機能を有してよい。また、実行システムは、これら変数を統合し、これらを主メモリに記憶する機能を有してよい。
【０００９】
本発明は、一実施形態では、コンピュータプログラムを並列化しその後実行するための並列化システムを構成する。この並列化システムは、２つの並列標識の間のコードは遅延させられた副作用とともに実行されるべきである、ということを示す並列標識をプログラム内で識別するように構成される。また、この並列化システムは、並列標識の間のコードが並列化され得るか否かを決定するように構成される。また、この並列化システムは、コードを複数の実行用プロセッサの１または２以上に送るように構成される。また、この並列化システムは、並列標識により識別されたコードを１または２以上のプロセッサで実行し、副作用の待ち行列を生成するように構成される。また、この並列化システムは、コードの実行が終了した後に副作用の待ち行列を逐次実行するように構成される。
【００１０】
本発明の別の一態様によれば、コンピュータプログラムを実行する方法が提供される。この方法は、プログラム内で並列標識を識別することを備える。並列標識は、２つの並列標識の間のコードは遅延させられた副作用とともに実行されるべきであるということを示す。また、この方法は、並列標識により識別されたコードを実行し、副作用の待ち行列を生成することを備える。また、この方法は、コードの実行が終了した後に副作用の待ち行列を逐次実行することを備える。本方法は、並列に動作し得る断片を、標識が付されたコード内で識別することをさらに有してよい。
【００１１】
本発明のさらに別の一態様によれば、好ましくはデータ担体またはコンピュータ可読性媒体に、コンピュータプログラムが提供される。このコンピュータプログラムは並列標識を有し、並列標識は、並列標識の間のコード（すなわち、並列領域：concurrency region）は遅延させられた副作用とともに実行されるべきであるということを示す。
【００１２】
並列標識は、標識が付された１または２以上の分割可能オブジェクトを有してよい。この分割可能オブジェクトは、変数がどこで並列実行に係るローカル変数へと分割され得るかを示す。また、並列標識は、ローカル変数がどのように単一の変数に統合され得るかを示す統合の指示を有してよい。
【００１３】
好ましくは、複数の並列領域は、並列に実施され得る領域であると定義付けられる。
【００１４】
１または２以上の並列領域は、外側にある並列領域の中に入れ子化されて（be nested）よい。
【図面の簡単な説明】
【００１５】
以下、本発明の様々な態様について、次の図面を参照しつつ実施例を用いて説明する。
【図１】並列化システムのブロック図である。
【図２】コンパイル過程の流れ図である。
【図３】図２の過程で使用されるsieveの模式図である。
【図４】sieve計算における暗黙の（implicit）並列性を表した模式図である。
【図５】逐次の計算がどのように断片へと分割されるかを表している。
【図６】断片を実行するためのsieveブロックに出入りする制御流れを表している。
【図７】分割され得るオブジェクトを有する並列性の模式図である。
【図８】入れ子化されたsieveの模式図である。
【図９】複数の並列sieveの模式図である。
【００１６】
（発明の詳細）
本発明は、１つのプログラムを別々のコード断片へと並列化するコンパイラから構成される並列化システム、及び、コード断片を並列に実行する実行システムを提供する。本発明により、コンピュータプログラムは、移植可能かつ拡張可能な信頼できる態様で並列化され得る。これは、特定のソフトウェアコード構造及びコンパイラを用いて達成される。コンパイラは、プログラマソースコードを機械で実行できるコードに翻訳するプログラムである。この機械で実行できるコードは、ソフトウェアコード構造を認識し、これに基づき並列化の決定を行う機能を有する。大半のソフトウェアは、本発明の要求事項に適合するように構成され得る。特に、Ｃ及びＣ＋＋等のプログラミング言語で書かれたソフトウェアが本発明の要求事項に適している。
【００１７】
ソフトウェアを本発明に適合するように構成するには、並列領域に係る標識は、並列化されることになるプログラムに付されなければならない。ソースコードの一区域が並列に実行されることをプログラマが望む場合において、当該ソースコードの一区域が並列領域となる。並列領域に標識を付すことは、ソフトウェアが書かれている時に行われてよく、あるいは、その後ソフトウェアが並列化のために適合させられなければならない時に行われてもよい。並列領域は、２つの目的を有する。第１の目的は、コードを並列に動作することが望まれる場所をコンパイラに示すことである。第２の目的は、コードのブロックであって内包する副作用が遅延させられるべきブロックを明らかにすることである。副作用により、sieveブロックの外部で規定されるプログラム状態のあらゆる部分に対して改変がなされる。この改変には、メモリ書込み、ハードウェア状態の改変、及びsieveシステムの外部で規定される関数の実行が含まれる。標識が付されたブロックの実行は、２つの部分に分離される。第１の部分、すなわち「sieve計算」は、副作用の待ち行列を作成し記憶する。しかし、副作用の適用は行わない。第２の部分、すなわち「副作用計算」は、副作用の待ち行列において逐次記憶されたプログラム状態に対し改変を行う。これにより、sieve計算は並列化され得る。
【００１８】
多重メモリ空間を有するシステムにおいて、実行は３つの部分に分割されてよい。１つ目は「データ読込み（data loading）」であり、sieve計算を実行するのに必要なデータを計算し、当該実行のために選択されたメモリ空間にこのデータを伝送する。第２の段階は「データ処理」であり、読み込まれたデータを演算実行部上で処理し、副作用の待ち行列を作成する。これら副作用は、第３の段階である「書込み」において、親メモリに書き込まれる。幾つかのアーキテクチャでは、データ読込み及びデータ処理の段階は、インターリーブされてよい。これは、メモリ読込みが終了することを待つ間作業待ち行列に対するデータ処理タスクを中断するとともに、準備ができているとの標識が付された上記作業待ち行列から読み出された他の計算を続けることによって達成され得る。中断されるタスクのために必要なデータの読込みは、バックグラウンドにおいて実行される。読込みが終了したら、中断されたタスクは、空いている演算実行部により再開できる状態にある。
【００１９】
一般に、並列領域内ではローカル変数及び外部変数が存在している。ローカル変数は、並列領域の中で規定される。外部変数は、並列領域の外部において規定される。並列領域の副作用は、外部変数に対する改変である。並列領域により、これら副作用は、並列領域においてプログラム制御が行われなくなった後にまで遅延させられる。これら遅延副作用は、待ち行列に入れられた副作用から構成されてよい。待ち行列に入れられた副作用には、メモリ書込み及び関数呼出し、並びに統合操作等の他の副作用が含まれ得る。
【００２０】
並列領域は、「sieve」を用いてプログラマにより規定される。これは、プログラマにより規定されたプログラムの一区域であって遅延副作用を有する一区域である。sieveは、次のことを意味するものとしてコンパイラにより認識される。すなわち、全てのメモリ書込み及び他の副作用は、sieveの最後まで遅延させられる（sieveは、副作用を効果的にふるい分ける）ということを意味する。sieveの意味は、作業がなされる時期及び順序であると明確に規定されるため、sieveを用いたプログラムは決定的である。sieveは、適切な構文形態（例えば、sieve｛…｝）を採用することができる。これにより、sieveブロックが規定される。これは、ソースコード内でsieveを記述する方法の１つである。括弧の中のコードは、単一の並列領域の中にある。このため、各sieveブロックは並列領域となる。sieveは、sieveブロック内の副作用を遅延させることにより、内部の変数がブロック外部の変数の改変に依存し得ないことを確保する。sieveブロックは、利用可能なメモリの全部が入力情報であり副作用の待ち行列が出力情報である関数として解されてよい。前述したように、sieve計算により副作用の待ち行列が作成されるが、sieve計算は副作用の実行は行わない。
【００２１】
sieveブロックは、関数または手順へと復元される。この関数または手順においては、データ流れ及び制御流れが明確に規定される。これら復元された関数は、他の全てのコードブロックから独立しており、これにより別々にコンパイルされ得る。これら独立した決定的なコードブロックが別々にコンパイルされ得ることにより、それぞれのsieveブロックは異なる目標アーキテクチャ（target architecture）にコンパイルされ得、これによりクロスプラットフォームの互換性が最大限得られる。
【００２２】
前述した簡素なsieveの一態様では、２または３以上のsieveは入れ子化されてよい。この場合、囲いのあるsieveの内部のローカルメモリ（及び他のローカル副作用）への書込みは、入れ子化されたsieveを出た直後に実行される。外部の書込み及び他の副作用は、囲いのあるsieveに係る適切な待ち行列に追加される。sieveを入れ子化する際に、非sieveコードから下に向かって測定した特定のsieveの入れ子の絶対的な深さは、その「sieve深さ」と呼ばれる。特定のsieveまたは当該sieve内で宣言された構文の「sieve水準」は、現在のsieveから上に向かって測定された相対的な水準である。
【００２３】
sieveの内部には、特定のsieveの外部のデータを指し示すポインタが存在し得るため、sieve内部で使用するための幾つかの異なるポインタ様式が存在する。即時ポインタ（immediate pointer）は、現在のsieveブロック内のデータを指し示すものである。即時ポインタは、即時ポインタにより指し示されたデータが即時に変更され得るという点において、sieve外部の通常のポインタと同じ意味を有する。大域ポインタ（global pointer）は、最高水準でデータを指し示すものであり、いかなるsieve内にも存在しない。sieveの外部では、大域ポインタは通常のポインタであり、sieveブロック内での即時ポインタと同じ動作を行う。sieveブロック内では、大域ポインタへのいかなる書込みも、現在のsieveブロックが全て終了した後にまで遅延させられなければならない。遅延させられたポインタ（以下、「遅延ポインタ」という）は、sieve入れ子の外側の水準を指し示すものである。遅延ポインタには、これらポインタが指し示すsieveの水準が付される。これら水準は、現在の水準と関連している。すなわち、新しいsieveブロックが開始したら、現在の遅延ポインタの水準は１つ増えることになる。遅延ポインタへの書込みは、これら遅延ポインタが指し示すsieve入れ子の水準にまで遅延させられる。ソースコード内で、即時の書込み、大域の書込み、及び遅延させられた書込みには、これらが別々の種類のものである旨の標識が付される。これにより、プログラマは、容易に種類の不整合のエラーを識別することができる。
【００２４】
基本的概念の別の一態様では、sieve作成を並列に行うことにより明示的な（explicit）並列性が導入され得る。独立したsieve計算を並列に実行することにより、安全性は常に確保される。sieve計算は並列に実行され、この際副作用の待ち行列が生成される。その後、副作用が逐次実行される。最初のsieve計算に起因する副作用は、２番目のsieve計算の副作用の前に実行される。一般に、並列に作成されたｉ番目のsieveの計算に起因する副作用は、並列に作成された（ｉ＋１）番目のsieveの計算の副作用の前に実行される。通常は、副作用は、関連するsieveブロックの出口で適用される。しかし、プログラマは、副作用の待ち行列を保存し、後でこれらを適用することを望むかもしれない。
【００２５】
また、「分割可能オブジェクト」を用いることにより、sieveブロック内部でさらに並列性を得ることができる。分割可能オブジェクトは、幾つかの子プロセッサに亘って分割され、その後親プロセッサ上または指定された制御プロセッサ上で単一のオブジェクトに統合され得る。これにより、分割可能オブジェクトの値が改変される前と後との間でのこれら値の依存性が排除される。プログラマは、分割可能オブジェクトを用いるために、分割／統合操作をクラス上で規定しなければならない。通常は、これは、特定の関数（例えば、配列の内容を合計すること）のために用意される分割／統合の書式を用いてなされる。
【００２６】
分割／統合操作が実施され得るようにするため、プログラマは、オブジェクトに対する操作が幾つかのプロセッサ上で並列に実施され、その後sieveブロックの最後で１つの結果へと統合されるようにする方法を決定しなければならない。プログラマは、「分割上（onsplit）」操作を特定しなければならない。分割上操作は、分割可能オブジェクトの各コピーに対して起動される。分割上操作は、必要に応じ、制御流れの中の分割点（split point）の前に生じる変化点（change point）の数を数えることができる。ここで、変化点は、分割可能オブジェクトが改変される点と定義される。これにより、例えばループが並列化されることが可能となる。この場合、変化点の数はループの反復回数である。プログラマは、分割操作について、「統合」操作を特定することができる。統合操作は、子処理が終了した後において、分割可能オブジェクトの幾つかのコピーをどのように再結合させるかを規定する。統合操作は、例えば、単にそれぞれの子処理の結果の全てを合計するという指示であってよい。
【００２７】
分割可能オブジェクトを併用しつつsieveを用いてより大きい並列性を得ることの一例として、ループを分割することが挙げられる。このループは、時折アキュムレータを更新するとともに、ループ内の任意の副作用を実施する。ここで、アキュムレータは、適用可能な操作が追加操作のみであるオブジェクトである。ループ反復子及びアキュムレータは、ともに分割可能オブジェクトであるといえる。ループは、並列に実行される断片へと分割される。各断片はそれぞれ、反復子及びアキュムレータのコピーを有する。各断片は、アキュムレータの初期値を有する。アキュムレータに対する操作がアキュムレータに１を足す操作（インクリメント）のみである場合、各断片に係るsieve計算を実行することによって得られるアキュムレータは、並列計算が終了した後において、単にアキュムレータを合計することによって安全に統合され得る。アキュムレータは、待ち行列に入れられた副作用が実行される時に、sieveブロックの後ろに統合される。
【００２８】
コンパイラは、sieveブロックの中のコードについて依存関係分析を行い、並列化を決定することができる。依存関係分析を行うための技術は公知であるため、これに係る詳細な説明は省略する。副作用は遅延させられるため、sieveブロックの外部において規定されたデータへの、読取り前の書込み（write-before-read）の依存はあり得ない。これにより、依存関係分析は簡素化される。また、分割可能オブジェクトについて依存性が発見された場合、この依存性は、オブジェクトの分割及び統合の方法を用いることにより排除され得る。従って、sieveブロックを分析し、全ての依存性を排除することができる地点を見出すことが可能である。これらは、「潜在的分割点」と呼ぶことができる。
【００２９】
潜在的分割点は、個々の反復が並列に実施されることを可能にしているループの中で、あるいは、コードの個々の区域が並列に実施されることを可能にしているループの外部で生じ得る。潜在的分割点は、条件付きブランチの内部でも生じ得る。この場合、分割点が生じるブランチは、どのブランチが実際採られることになるかを知る前において、推測的に継続して実行され得る。これにより、実行システムは、コード断片が実行されるべきか否かに関して決定がなされる前にコード断片を実行し、またこの決定がなされそれが肯定的である場合に副作用を適用する。
【００３０】
関数／手順は、sieveブロックの中から呼び出されてよい。しかし、副作用を収集する必要があるため、コード内でこれら手順には標識が付されてよく、これら手順には通常の関数とは異なるコンパイルがなされてよい。２つの異なる種類の関数には、sieveブロック内部での使用のために標識が付されてよい。sieve関数は、仮にsieve関数がsieveブロック外部での使用のためにコンパイルされたなら、副作用が原因で異なる意味を有することになる関数である。生成された副作用はsieveブロックの外部とは関係がないため、sieve関数の使用はsieveブロックの内部に限定されることになる。即時関数（immediate function）は、副作用が存在しないことからsieveブロックの内部または外部において同じ意味を有する関数である。即時関数は、囲いを有するsieveの外部に存在し得るいかなるものにも書込みを行わないことを確保するように、限定的に定義付けられる。これにより、即時関数が副作用を生成しないこと、及び、即時関数がsieveブロックの内部または外部のあらゆる場所における使用のために安全にコンパイルされ得ることが確保される。
【００３１】
プログラマがソフトウェアに標識を付すと、ソフトウェアは、本発明を体現するコンパイラを用いて並列化され得る。このコンパイラは、sieve及び分割／統合操作を認識する機能を有するとともに、依存性を排除することにより決定的な方法でコードを再整理（re-order）する機能を有する。コードの個々の区域は、別個のプロセッサによる処理のために変換される。コンパイラは、例えば図１に表したように、利用可能なメモリ空間も分離する。コンパイラは、主システムプロセッサと結合した単一の大域メモリを有する。この大域メモリは、通常のデータを記憶するために用いられる。並列化に関与しているローカルプロセッサまたは子プロセッサのそれぞれについて、分離したメモリ空間が規定される。これらメモリ空間は、sieve内で規定されたローカル情報を記憶するためのものである。子プロセッサの１つにおいてsieveが終了した時、生成され記憶された、遅延させられた記憶データは、ローカルメモリからコピーされ、主ＣＰＵにより他のsieveからの対応するデータと統合され、その後主ＣＰＵメモリに記憶される。
【００３２】
図２は、本発明に従ってコンパイラが採用する段階を表している。これは、最初にコンピュータプログラムを受理することを有する。このコンピュータプログラムは、並列領域、すなわちsieveブロック、及び必要に応じ分割／統合操作に標識を付している。プログラムは、並列領域を取り扱うように拡張された構文解析器に送られる。構文解析器からの出力は、翻訳機に送られる。翻訳機は、原プログラム言語をコンパイルに適した書式に変換する。特に、翻訳機は、並列性及び遅延副作用を管理するための指示が与えられた中間表現を出力する。
【００３３】
中間表現において、「即時の」変数及び記憶場所と「遅延させられた」変数及び記憶場所との間で区別がなされる。変数または記憶場所が現在のsieveの内部で宣言されたなら、当該変数または記憶場所は「即時の」ものである。即時の変数（以下、「即時変数」という）への書込みは、当該変数が宣言されたsieveの内部において即座に生じる。変数または記憶場所がsieveの外部において宣言されたなら、当該変数または記憶場所は「遅延させられた」ものである。遅延させられた変数（以下、「遅延変数」という）への書込みは、sieveが終了するまで遅延させられる。読取りは常に即座に行われるが、中間表現は、遅延変数からの外部の読取りと、即時変数からの内部の読取りとを区別することができる。中間表現において、変化点及び分割可能オブジェクトに標識が付される。構文解析器は、ポインタがsieveブロック内またはsieveブロック外における記憶場所を参照するか否かを識別するためのシステムを有する。中間表現は、並列化の最適化器に送られる。並列化の最適化器は、プログラムを最適に分割する方法を計算し、これにより分割されたプログラムの部分は目標アーキテクチャ上で並列に動作することができる。
【００３４】
コンパイラは、プログラムコード内でsieveを識別する機能を有し、sieveの仕様に従ってsieveが正確に実行されることを確保する。図３に、これを表した。前述したように、sieveは、sieve計算を副作用計算から分離する並列領域である。sieve構文の中で、まずsieve計算が実行され、この際副作用の待ち行列が生成される。その後、副作用の待ち行列が逐次実行される。図３において、黒い実線は制御流れを示し、点線はデータ流れを示し、破線は並列計算の境界を定めている。副作用の待ち行列は、実行前に、コンパイラまたは実行システムによって速度及びサイズが最適化され得る。これは、例えば、同じアドレスへの多重書込みを排除することによって、または、独立した副作用を再整理することによってなされ得る。
【００３５】
sieve計算は、自動並列化に適応しやすい。図４に表したように、sieve計算を副作用計算から分離することにより、暗黙の（implicit）並列性が導入される。前述したように、黒い実線は制御流れを示し、点線はデータ流れを示し、破線は並列計算の境界を定めている。sieve計算の下位計算（sub-computation）の収集は、１つの下位計算が他の下位計算の結果に依存しない限り、常に並列に実行され得る。従って、最適化器は、sieve計算上で自動並列化を行い潜在的な分割点を決定するために、依存関係分析を遂行する機能を有する。遅延変数への書込みは全て遅延させられるため、遅延変数への、読取り前の書込みの依存は排除される。さらに、分割可能オブジェクトへの依存は分割及び統合の操作に置き換えられ得ることから、このような依存は排除される。
【００３６】
図５に表したように、潜在的分割点が見出されたら、中間表現は並列に実行されることになる「断片」へと分割される。各断片は、開始点及び１または２以上の出口点を有する。開始点は、潜在的分割点でなければならない。また、１または２以上の出口点も、潜在的分割点でなければならない。中間表現がどのように断片へと分解されるかは、目標アーキテクチャの特徴により、または独立的に中間表現それ自体の特徴のみに基づいた目標の特徴により、正確に決定され得る。図６に表したように、中間表現は、制御流れが任意の潜在的分割点において出入りすることができるように改変されてもよい。
【００３７】
図６は、中間表現の概念的構造を表している。実際には、全てのローカル変数が正確な値に初期化されるとともに正確に除去されることを確保するため、セットアップ及びセットダウンの段階も分離されなければならない。図５は、中間表現がどのように完全に分離した断片へと分解され得るかを示している。また、図６は、単一の中間表現が使用され、パラメータ化され得ることを示している。これら図に表した構成において、異なる地点での出入りにより、単一の断片または複数の逐次的な断片に対応した部分の実行が可能となる。
【００３８】
断片は、互いに独立してコンパイルされる。各断片への入力情報は、分割可能オブジェクトの変化数（change count）である。それぞれの分割可能オブジェクトに係るそれぞれの子プロセッサが断片の主体を実行する前に、当該子プロセッサによって分割上操作が実施される。断片を出る時に、出口点及び変化数は親プロセッサに戻される。親プロセッサは、断片を管理し制御する。断片は、適切な分割可能オブジェクトのパラメータとともに、子プロセッサに送られる。
【００３９】
断片に対するこれらパラメータは、実行システム内に格納された推測方略（guessing strategy）を通じて得ることができる。推測方略は、断片の開始点及び終了点、並びに、当該断片に入力される任意の分割可能オブジェクトの値を包含することができる。推測方略は、個々のsieveブロックの構造及びアルゴリズムに応じて、当該個々のsieveブロックに適合するように変更される必要があり得る。一般的な推測方略は、反復子に係る変化数が固定数「ｎ」だけインクリメントされるまで、断片を実行することとされている。その後、個々のプロセッサコアのそれぞれには、推測された開始反復子の値が与えられ得る。この値は、それぞれの新しいプロセッサコアより「ｎ」だけ大きい値である。
【００４０】
断片が終了する時に、どの実行通路が採用されるかが決定される。推論的な実行または拙い推測から生じた失効ブランチ（dead branch）は、全て廃棄される。図７に表したように、sieveを通じて有効な通路を経た後に、分割可能オブジェクトは親プロセッサ上へと統合される。最後に、任意の副作用が正しい順序で実行される。
【００４１】
前述したように、sieveは、図８に表したように入れ子化されてよい。この場合、囲いを有するsieve内部のローカルメモリへの書込み及び他のローカル副作用は、入れ子化されたsieveを終了する際に実行される。外部の待ち行列に入れられた副作用及び他の副作用は、囲いを有するsieveのための適切な待ち行列に追加される。基本概念の別の一態様では、明示的な並列性は、並列にsieveの文章を作成することによって導入され得る。図９に、これを表した。独立したsieve計算を並列に実行することにより、安全が常に確保される。sieve計算は並列に実行され、この際副作用の待ち行列が生成される。その後、副作用が逐次実行される。最初のsieveからの副作用は、２番目のsieveの副作用の前に実行される。一般に、ｉ番目のsieveからの副作用は、（ｉ＋１）番目のsieveの副作用の前に実行される。
【００４２】
断片の実行において、当該断片の全ての状態を作業待ち行列に保存しつつ、別の断片を実行し続けることが可能な場合がある。これにより、幾つかの異なる種類の並列処理が可能となる。例えば、断片の状態を１つのプロセッサに保存し、実行を続けるためにこれを他のプロセッサに伝送することにより、パイプラインが作製され得る。あるいは、低速度の操作が求められている時に（例えば、メモリ読込み）、断片の状態を作業待ち行列に保存し、その後低速度の操作が終了した時に当該断片を継続することによって、低速度の操作が完了するのを待っている時であっても並列実行を遂行することが可能となる。１つの断片が１または２以上の以前の断片の結果に依存する場合は、以前の断片の結果を作業待ち行列に保存し、その後これら全ての結果が利用可能となった時に、これら結果を必要とする断片を実行することができる。
【００４３】
本発明は、並列化システム、及び、利用しやすい拡張可能なソフトウェアを取り扱う方法を提供する。これは、sieve、分割、及び統合を用いて依存性を排除することによりなされる。sieveは、ローカル依存関係分析に係る自動並列化の工程を減らしつつ、sieve計算を外部の書込み等の副作用計算から分離させる。これにより、独立した計算が安全に並列に実行され得る。sieveと併用される分割可能オブジェクトは、複数の変化点にまたがる依存性を分割及び統合の操作に変換することにより、依存関係分析の結果を向上させることができる。
【００４４】
このシステムを活用するために、プログラマは原ソフトウェア内で、並列化され得る領域の標識、分割可能なオブジェクトの標識、及び、必要に応じ、プログラムが分割されることを望む場所の標識を付す。これにより、プログラマは速やかにソフトウェアを変形することができる。例えば、従来型の拡張不可のＣ／Ｃ＋＋ソフトウェアを拡張可能な並列のＣ／Ｃ＋＋ソフトウェアへと変形することができる。本発明は広い範囲のハードウェアに適用することができ、マルチコアプロセッサ、及びＦＰＧＡ等の拡張可能な／動的なハードウェアに用いるのが好ましい。
【００４５】
当業者は、開示された実施形態は本発明から逸脱しない範囲で変形することができるということに想到し得る。例えば、これまで主にソフトウェアの実施について説明してきたが、本発明はハードウェアにおいて実行され得るということに想到し得る。また、これまで並列化の仕組みを用いて本発明について説明してきたが、本発明が体現されたコンパイラは単一のプロセッサ上でプログラムを動かすために用いることができるということに想到し得る。従って、上述した特定の実施形態に係る説明は単に例に係るものであり、本発明を制限する目的のものではない。当業者にとっては、前述した操作に対して大きな変更を加えずに微修正がなされ得るということは明らかであろう。
【図１】
2009524866.tif 000003
【図２】
2009524866.tif 000004
【図３】
2009524866.tif 000005
【図４】
2009524866.tif 000006
【図５】
2009524866.tif 000007
【図６】
2009524866.tif 000008
【図７】
2009524866.tif 000009
【図８】
2009524866.tif 000010
【図９】
2009524866.tif 000011
【国際調査報告】
2009524866.tif 000012
2009524866.tif 000013
2009524866.tif 000014