(57)【要約】【課題】スケジューラを使用することなく、各ＣＰＵのロードバランスを改善し、効率の良い並列処理を可能とすることを目的としている。【解決手段】本発明のコンパイラプログラムは、ソースプログラムを読み込むと、予めセクションを実行時間の長い順に並べ替えを行い、並列領域を定義する並列コンパイラ指示文を検出すると、並列領域内に記述された並列処理単位であるセクションを定義する並列コンパイラ指示文によって分割された文の並びに対してスレッドが到達する順番に実行させ、実行するセクションに対してスレッドが割り当て済である旨の表示を行い、そのセクションの処理が完了すると、スレッドが割り当て済である旨の表示を参照して、未だスレッドが割り当てられていないセクションを実行させる処理を行うオブジェクトコードを生成する。【選択図】　　　図１
2004094581.tif 000002
【特許請求の範囲】
【請求項１】
共有メモリ型マルチプロセッサ向けの並列拡張機能を備えたコンパイラプログラムであって、
ソースプログラムから並列領域を定義する並列コンパイラ指示文を検出すると、並列領域内に記述された並列処理単位であるセクションを定義する並列コンパイラ指示文によって分割された文の並びに対してスレッドが到達する順番に実行させる処理を行うオブジェクトコードを生成するスレッド対応付手段と、
前記セクションに対してスレッドが割り当て済である旨の表示処理を行うオブジェクトコードを生成する割当済表示手段と、
前記セクションの処理が完了すると、前記スレッドが割り当て済である旨の表示を参照して、未だスレッドが割り当てられていないセクションを実行させる処理を行うオブジェクトコードを生成する次セクション実行手段と
してコンピュータを機能させるコンパイラプログラム。
【請求項２】
前記セクションを予め実行時間の長い順に並べ替えを行うセクション整列手段を有する、請求項１記載のコンパイラプログラム。
【請求項３】
共有メモリ型マルチプロセッサ向けの並列拡張機能を備えたコンパイラプログラムを記憶した記録媒体であって、
ソースプログラムから並列領域を定義する並列コンパイラ指示文を検出すると、並列領域内に記述された並列処理単位であるセクションを定義する並列コンパイラ指示文によって分割された文の並びに対してスレッドが到達する順番に実行させる処理を行うオブジェクトコードを生成するスレッド対応付手段と、
前記セクションに対してスレッドが割り当て済である旨の表示処理を行うオブジェクトコードを生成する割当済表示手段と、
前記セクションの処理が完了すると、前記スレッドが割り当て済である旨の表示を参照して、未だスレッドが割り当てられていないセクションを実行させる処理を行うオブジェクトコードを生成する次セクション実行手段と
してコンピュータを機能させるコンパイラプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項４】
共有メモリ型マルチプロセッサ向けの並列拡張機能を備えたコンパイル方法であって、
ソースプログラムから並列領域を定義する並列コンパイラ指示文を検出すると、並列領域内に記述された並列処理単位であるセクションを定義する並列コンパイラ指示文によって分割された文の並びに対してスレッドが到達する順番に実行させる処理を行うオブジェクトコードを生成するステップと、
前記セクションに対してスレッドが割り当て済である旨の表示処理を行うオブジェクトコードを生成するステップと、
前記セクションの処理が完了すると、前記スレッドが割り当て済である旨の表示を参照して、未だスレッドが割り当てられていないセクションを実行させる処理を行うオブジェクトコードを生成するステップと
を有するコンパイル方法。
【請求項５】
ソースプログラムから並列領域を定義する並列コンパイラ指示文を検出すると、並列領域内に記述された並列処理単位であるセクションを定義する並列コンパイラ指示文によって分割された文の並びに対してスレッドが到達する順番に実行させる処理を行うオブジェクトコードを生成するスレッド対応付手段と、
前記セクションに対してスレッドが割り当て済である旨の表示処理を行うオブジェクトコードを生成する割当済表示手段と、
前記セクションの処理が完了すると、前記スレッドが割り当て済である旨の表示を参照して、未だスレッドが割り当てられていないセクションを実行させる処理を行うオブジェクトコードを生成する次セクション実行手段と
を有することを特徴とするコンパイル装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、共有メモリ型マルチプロセッサ向けプログラミング言語で記述されたプログラムのセクションを、マルチＣＰＵで効率良く並列処理させるオブジェクトプログラムを生成するコンパイラに関し、特にＣＰＵ固定方式におけるロードバランスに優れたセクションの並列処理技術に関する。
【０００２】
【従来の技術】
近年、普及してきた共有メモリ型マルチプロセッサ向けの並列プログラミング標準化インタフェースで、従来のＦｏｒｔｒａｎやＣ／Ｃ＋＋規格に追加する並列拡張機能の部分の業界標準規格にＯｐｅｎＭＰ（ＯｐｅｎＭＰ標準の策定機関であるＯｐｅｎＭＰ　Ａｒｃｈｉｔｅｃｔｕｒ　Ｂｏａｒｄの登録商標）があり、ＯｐｅｎＭＰに準拠したＦｏｒｔｒａｎやＣ／Ｃ＋＋がＯｐｅｎＭＰ　Ｆｏｒｔｒａｎ、ＯｐｅｎＭＰ　Ｃ／Ｃ＋＋と呼ばれている。
【０００３】
ＯｐｅｎＭＰは、既存のＦｏｒｔｒａｎ　７７やＦｏｒｔｒａｎ　９０規格などに準拠したプログラミング言語で記述したソースコードを変更することなく、並列領域を定義するｐａｒａｌｌｅｌ、並列処理単位を定義するｓｅｃｔｉｏｎなどの並列コンパイラ指示文を挿入することで段階的に並列化することを可能としたものであり、移植性が高く、かつスケーラビィリティに優れた特徴を有している。
【０００４】
図１２は、Ｆｏｒｔｒａｎで記述されたプログラムに並列コンパイラ指示文を挿入して並列化させた例が示してある。（ａ）　、（ｂ）　、・・・、（ｆ）　は各々が並列実行可能な、プログラムの部分であり、セクションと呼ばれている。例えば、ロケットの速度などをいろいろ変化させてそのまわりの気流を計算する数値シミュレーションなどのように、計算のためのプログラムも使用するデータもほとんど同じで、速度だけを変えたものを多数処理することがある。このように同じような計算を、条件を少しずつ変えたケースを多数扱うパラメトリック・スタディなどがこの例に対応する。
【０００５】
図１２で示すプログラムにおいて、（ａ）　、（ｂ）　、・・・、（ｆ）　の各セクションの実行時間が等しく、かつスレッド数が十分用意されていて、各セクションが同時に実行できる理想的な環境では、このプログラムは図１３に示すように並列処理される。ここで、＜ａ＞　、＜ｂ＞　、・・・、＜ｆ＞　はセクション（ａ）　、（ｂ）　、・・・、（ｆ）　の実行時間がそれぞれ１単位時間で等しいことを表している。並列化していなかったときはセクション（ａ）　、（ｂ）　、・・・、（ｆ）　をシリアルに実行していたため６単位時間かかっていたところが、並列化の効果で１単位時間で済むようになったことを示している。
【０００６】
なお、スレッドとは、プロセス内部に含まれている論理的に並列処理可能な実行単位のことであり、プログラムカウンタとローカル変数領域の組で形成される。１つのプログラムカウンタは１つのＣＰＵにしか対応させることはできないが、１つのＣＰＵが複数のプログラムカウンタに対応させることは可能である。しかしながら、本明細書では発明部分が明確となるように１つのＣＰＵは１つのプログラムカウンタとのみ対応させて説明する。
【０００７】
各セクションを並列に実行させるためには、従来、以下の２つの方式で実現していた。
（イ）ＣＰＵ固定方式
各セクションを実行させるＣＰＵを、予めセクションＩＤに対応させて決めておき、各々のセクションを、決められたＣＰＵに割当てて実行する方式である。図１４は、この方式を実装したコンパイラが出力するオブジェクトプログラムをソースコード化したものである。各スレッドは並列領域で定義された同一のプログラムを実行する。並列セクションが開始すると、各スレッドでは自身のスレッドＩＤとセクションＩＤが一致するセクションかどうか判別して、一致したもののみ実行するようなオブジェクトコードが生成されている。
【０００８】
例えば、スレッド数が４の場合であって、セクションＩＤが０であるセクション（ａ）　を実行させるＣＰＵをスレッド０と決めておくと、セクション（ａ）　に対して　（１）、（３）　のようなｉｆ文、ｅｎｄｉｆ文に対応するオブジェクトコードが生成され、スレッドＩＤが０のＣＰＵでのみセクション（ａ）　が実行される。
ＣＰＵ数よりもセクションの数が多い場合は、図１５のように、１　つのＣＰＵに複数のセクションが固定的に割り当てられる。この場合、ＣＰＵ数が４であるため、ｍｏｄ（０，４）とｍｏｄ（４，４）、ｍｏｄ（１，４）とｍｏｄ（５，４）とは同じ値になるため、セクション（ａ）　とセクション（ｅ）　、セクション（ｂ）　とセクション（ｆ）　は同じＣＰＵで実行されることになる。
（ロ）スケジューラ方式
各セクションをカプセル化（　ルーチン化）　し、独立したスケジューラが各セクションの実行を管理する方式である。ＣＰＵ数よりもセクションの数が多い場合は、スケジューラが、各セクションに対するＣＰＵの割り当てを管理する。
【０００９】
【発明が解決しようとする課題】
しかしながら、パラメトリック・スタディなどの場合、入力のパラメータによって、演算の収束状況が異なり、結果として、各セクションの実行時間が大きくばらつく場合が往々にしてあった。このような場合、従来の技術では、以下の問題が発生する。
（イ）ＣＰＵ固定方式
ＣＰＵ数よりもセクションの数が多い場合に、各セクションの実行時間がばらつくと、図１６のように、他のＣＰＵが担当のセクションの実行を終えて空いているにも関わらず、実行時間の長いセクションを受け持つＣＰＵでは、後続のセクションが待たされる状態が生じ、ロードバランスが崩れ、実行効率が低下する。
【００１０】
図１６において、セクション（ａ）　を担当するスレッドは実行時間が＜ａ＞＜ａ＞の２単位時間、セクション（ｂ）　を担当するスレッドは実行時間が＜ｂ＞＜ｂ＞＜ｂ＞　の３単位時間、全体の並列処理時間はセクション（ｂ）　とセクション（ｆ）　を担当するスレッドが要する実行時間が最長の５単位時間（＜ｂ＞＜ｂ＞＜ｂ＞＜ｆ＞＜ｆ＞）かかることを表している。セクション（ｃ）　を担当するスレッドは１単位時間実行すると空きとなるため、ロードバランスがよくない。
（ロ）スケジューラ方式
スケジューラ方式では、動的にセクションをスケジューリングするため、ロードバランスの問題は生じ難いが、スケジューラ用に余分なＣＰＵの確保、およびスケジューリング処理のための複雑な制御用プログラム開発が必要となり、かつＣＰＵ固定方式に比べてオーバヘッドが増加する。
【００１１】
本発明は、上記のような事情に鑑みて提案されたものであり、ＣＰＵ固定方式におけるセクションのＣＰＵへの割当て方式を改善し、各セクションの実行時間が大きくばらついた場合でも、スケジューラを使用することなく、各ＣＰＵのロードバランスを改善し、効率の良い並列処理を可能とすることを目的としている。
【００１２】
【課題を解決するための手段】
図１は本発明の実施の形態１の全体構成図を示すものである。コンパイラプログラム１０は、コンパイラプログラムの各処理部を呼び出し、内部インタフェースの受渡しの管理などを行い、コンパイラプログラムの動作を制御する制御部１１と、翻訳対象となるソースプログラム２を入力して、ソースプログラムの字句解析／構文解釈を行い、内部インタフェースに変換するフロントエンド部１２と、内部インタフェースを入力して、内部インタフェースに対して様々な最適化処理を行い、最適化後の内部インタフェースを出力するミドルパス部１３と、内部インタフェースをオブェクトコードに変換し、オブジェクトプログラム３を出力するバックエンド部１４から構成される。
【００１３】
本発明のコンパイラプログラム１０は、コンピュータを用いて利用者が作成したソースプログラム２を入力として、従来のコンパイラプログラムのバックエンド部１４に、新たにスレッド対応付手段１４１と、割当済表示手段１４２と、次セクション実行手段１４３を追加して、既存の処理部と連携してＣＰＵ固定方式におけるセクションのＣＰＵへの割当て方式を改善し、各セクションの実行時間が大きくばらついた場合でも、スケジューラを使用することなく、各ＣＰＵのロードバランスを改善し、効率の良い並列処理を可能とするオブジェクトプログラムを生成するものである。
【００１４】
スレッド対応付手段１４１は、ミドルパス部１３が出力した最適化後の内部インタフェースを入力として、並列領域を定義する並列コンパイラ指示文以降の並列領域内に記述された並列処理単位であるセクションを定義する並列コンパイラ指示文によって分割された文の並びに対してスレッドが到達する順番に実行させる処理を行うオブジェクトコードを生成し、割当済表示手段１４２はスレッドが該セクションを実行させると、該セクションに対してスレッドが割り当て済である旨の表示処理を行うオブジェクトコードを生成し、次セクション実行手段１４３は該セクションの処理が完了すると、前記スレッドが割り当て済である旨の表示を参照して、未だスレッドが割り当てられていないセクションを実行させる処理を行うオブジェクトコードを生成する。
【００１５】
本発明を適用すると、各ＣＰＵ毎に図５で示すようなオブジェクトコードを連係編集した同一のロードモジュールが実行され、先頭のセクションから順に現セクションが他のＣＰＵに割り当て済かどうかを判断し、割り当て済でない場合は現セクションを自ＣＰＵで実行し、現セクションの実行が完了すると、割り当て済でないセクションを続けて実行させるようにしたためであり、他のＣＰＵが担当のセクションの実行を終えて空いているにも関わらず、実行時間の長いセクションを受け持つＣＰＵで後続のセクションが待たされる状態は発生しなくなる。
【００１６】
更に、ミドルパス部１３に、並列処理させる各セクションを予め実行時間の長い順に並べ替えを行うセクション整列手段１３１を追加することにより、バックエンド部１４の入力となる最適化後の内部インタフェースでは、図８で示すように実行時間の長い順に並列処理されるセクションが並べ替えられる。
このように最適化された内部インタフェースがオブジェクトコードに変換されると、実行時間の長いセクションから順に実行されることになるため、図９で示した実行タイムチャートのように、特定のスレッドが実行時間の長い複数のセクションを担当する確率が低くなり、よりロードバランスのよい並列処理が可能となる。
【００１７】
【発明の実施の形態】
図１は本発明の実施の形態１の全体構成図が示してある。本発明のコンパイル装置では、図示しないが通常と同じくＣＰＵ（　Ｃｅｎｔｒａｌ　Ｐｒｏｃｅｓｓｉｎｇ　Ｕｎｉｔ）、ＲＡＭ（　Ｒａｎｄｏｍ　Ａｃｃｅｓｓ　Ｍｅｍｏｒｙ　）、ハードディスクドライブ（ＨＤＤ：Ｈａｒｄ　Ｄｉｓｋ　Ｄｒｉｖｅ）、グラフィック処理装置、入力インタフェースなどがバスを介して接続された構成からなるコンピュータ上でコンパイラプログラムが動くことによって各処理部、手段として機能する。
【００１８】
コンパイル装置１では、利用者が作成したソースプログラム２を入力として、オブジェクトプログラム３を生成するコンパイラプログラム１０が実行される。コンパイラプログラム１０は、従来より制御部１１、フロントエンド部１２、ミドルパス部１３、バックエンド部１４から構成されており、本発明では、バックエンド部１４に新たにスレッド対応付手段１４１と、割当済表示手段１４２と、次セクション実行手段１４３を、ミドルパス部１３にセクション整列手段１３１を追加して、既存の処理部と連携させてＣＰＵ固定方式におけるセクションのＣＰＵへの割当て方式を改善し、各セクションの実行時間が大きくばらついた場合でも、スケジューラを使用することなく、各ＣＰＵのロードバランスを改善し、効率の良い並列処理を可能とするようにしたものである。
【００１９】
スレッド対応付手段１４１は、ミドルパス部１３が出力した最適化後の内部インタフェースを入力として、並列領域を定義する並列コンパイラ指示文以降の並列領域内に記述された並列処理単位であるセクションを定義する並列コンパイラ指示文によって分割された文の並びに対してスレッドが到達する順番に実行させる処理を行うオブジェクトコードを生成し、割当済表示手段１４２はスレッドが該セクションを実行させると、該セクションに対してスレッドが割り当て済である旨の表示処理を行うオブジェクトコードを生成し、次セクション実行手段１４３は該セクションの処理が完了すると、前記スレッドが割り当て済である旨の表示を参照して、未だスレッドが割り当てられていないセクションを実行させる処理を行うオブジェクトコードを生成する。セクション整列手段１３１は並列処理させる各セクションを予め実行時間の長い順に並べ替えを行う。
【００２０】
図２は、本発明を適用したコンパイラプログラムが出力するオブジェクトプログラム上に格納され、実行プログラムが実行されるときには、共用メモリ上に展開されるスレッド割当済判定テーブルの例である。このテーブルは並列処理プログラムが開始する初期化状態では、すべての割当済フラグが未の状態となっており、各セクションがスレッドに割り当てられていくにしたがって割当済フラグが済の状態に更新される。なお、このフラグは、複数のＣＰＵからアクセスされるため、実際に参照したり、更新する際は排他制御が適用される。
【００２１】
図３は、本発明に係るコンパイラプログラム１０のバックエンド部１４の処理概要、およびそのコード展開Ｓ３２の追加処理フローのフローチャートが示してある。バックエンド部１４の処理は、コード展開（Ｓ３１）、レジスタ割り付け（Ｓ３２）、オブジェクトコード生成（Ｓ３３）のフェーズから成り、本発明では、従来のコード展開（Ｓ３１）フェーズにセクションのための以下のコード展開を追加したものである。
【００２２】
図４で示すソースプログラムを、フロントエンド部１２が字句解析／構文解釈を行い内部インタフェースに変換したものに対し、ミドルパス部が様々な最適化処理を行ったものを入力とし、ｓｅｃｔｉｏｎ並列コンパイラ指示文を検出すると（Ｓ３１１）、図５で示すオブジェクトコードをソースコード化したイメージのようなオブェクトコードを生成する（Ｓ３１２）。
【００２３】
ｅｎｄ　ｓｅｃｔｉｏｎｓ並列コンパイラ指示文を検出すると（Ｓ３１３）、セクションの処理が完了したと判断し、セクション数に対応する図２で示すようなスレッド割当済判定テーブルを生成し、オブジェクトコードに出力する（Ｓ３１４）。内部インタフェースからオブジェクトコードを生成する処理については、従来の技術であり、本発明の本質ではないため省略する。
【００２４】
このようにして翻訳されたオブジェクトプログラムは、図５で示したようなイメージで出力され、スレッド数が４で、セクション（ａ）　の実行時間が２単位時間、セクション（ｂ）　の実行時間が３単位時間、セクション（ｃ）　の実行時間が１単位時間、セクション（ｄ）　の実行時間が２単位時間、セクション（ｅ）　の実行時間が１単位時間、セクション（ｆ）　の実行時間が２単位時間かかると仮定すると、各スレッドでは図６のタイムチャートで示したように各セクションが実行され、他のＣＰＵが担当のセクションの実行を終えて空いているにも関わらず、実行時間の長いセクションを受け持つＣＰＵで後続のセクションが待たされる状態は発生しなくなる。
【００２５】
図４は、本発明を説明するために使用するＯｐｅｎＭＰ　Ｆｏｒｔｒａｎで記述されたソースプログラムの例が示してある。先頭に「！＄ｏｍｐ」が記述してある文は、並列コンパイラ指示文である。ｓｅｃｔｉｏｎ並列コンパイラ指示文と次のｓｅｃｔｉｏｎ並列コンパイラ指示文で挟まれた（ａ）　、（ｂ）　、・・・、（ｆ）　は各々が並列実行可能な、プログラムの部分であり、セクションと呼ばれるものである。ｐａｒａｌｌｅｌからｅｎｄ　ｐａｒａｌｌｅｌの並列コンパイラ指示文で挟まれた部分が並列化領域である。ｓｅｃｔｉｏｎｓからｅｎｄ　ｓｅｃｔｉｏｎｓの並列コンパイラ指示文で挟まれた部分がセクション化の対象となることを示している。なお、最初のセクションでは、ｓｅｃｔｉｏｎ並列コンパイラ指示文は省略可能である。
【００２６】
図５は、本発明を適用した場合の、オブジェクトコードをソースコード化したイメージが示してある。従来技術と異なり、各スレッドは図２で示すスレッド割当済判定テーブルを参照し、割当済フラグが未の状態となっている先頭のセクションを担当するように制御される。
図６は、本発明を適用し、従来技術を適用した図１６と同一条件における、実行タイムチャートの例が示してある。本発明を適用すると、先頭のＣＰＵから４番目のＣＰＵまで、セクションが対応付けられ実行が開始すると、実行時間が最小のセクション（ｃ）　を担当したＣＰＵが最初に空き状態になり、５番目のセクション（ｅ）　と対応付けられ、次に実行時間の少ないセクション（ａ）　を担当したＣＰＵがセクション（ｆ）　と対応付けられ、ロードアンバランシングが発生した図１６と比較して並列処理の実行時間は、１　単位時間短くなる。
【００２７】
図７は、本発明に係るコンパイラプログラム１０のミドルパス部１３の処理概要、およびそのハード無依存最適化Ｓ７２の追加処理フローのフローチャートが示してある。ミドルパス部１３の処理は、最適化情報収集（Ｓ７１）、ハード無依存最適化（Ｓ７２）、ハード依存最適化（Ｓ７３）のフェーズから成り、本発明では、ハード無依存最適化（Ｓ７２）フェーズにセクションを実行時間の長い順に並び替えるための以下のコード展開を追加したものである。
【００２８】
図４で示すソースプログラムを、フロントエンド部１２が字句解析／構文解釈を行い内部インタフェースに変換したものを入力とし、ｓｅｃｔｉｏｎ並列コンパイラ指示文を検出すると（Ｓ７２１）、コンパイルオプションなどで以前に実行した際の、プロファイリング情報など実行時情報を使用する旨の指示があるかどうかを判定する（Ｓ７２２）。実行時情報を使用する旨の指示がある場合には、並列セクションのコスト見積を実行時情報に基づいたものとする（Ｓ７２３）。これは、従来技術である実行時のプログラムの情報を収集するプロファイリング機能を用いて、予め並列セクションのコスト情報をファイルに収集しておいたものを利用する。
【００２９】
実行時情報を使用する旨の指示がない場合には、コンパイルオプションなどに利用者のプログラム実行のコストに対する翻訳時指示（各セクションに対する実行コスト）があるかどうかを判定する（Ｓ７２４）。翻訳時指示がある場合には、並列セクションのコスト見積を利用者の翻訳時指示に基づいたものとする（Ｓ７２５）。
【００３０】
翻訳時指示がない場合には、翻訳時に、文数と繰り返し数に基づきコストを算出する（Ｓ７２６）。コンパイラプログラムは重みを考慮した文のコストと数からセクションの実行コストを算出する。繰り返しがある場合には繰り返し部分の実行コストに、繰り返しの数を乗じて算出する。
ｅｎｄ　ｓｅｃｔｉｏｎｓ並列コンパイラ指示文を検出すると（Ｓ７２７）、セクションの処理が完了したと判断し、図８で示すように各セクションを実行コストの大きい順に並び替える（Ｓ７２８）。このように最適化された内部インタフェースがオブジェクトコードに変換されると、実行時間の長いセクションから順に実行されることになるため、図９で示した実行タイムチャートのように、特定のスレッドが実行時間の長い複数のセクションを担当する確率が低くなり、よりロードバランスのよい並列処理が可能となる。
【００３１】
図８は、本発明を適用し、図４で示したソースプログラムの（ａ）　、（ｂ）　、・・・、（ｆ）　の各セクションの実行時間がそれぞれ、２、３、１、２、１、２単位時間である場合の、各セクションを実行時間の長い順に整列させた場合のソースコード化したイメージの例が示してある。
図９は、本発明を適用し、従来技術を適用した図１６と同一条件における、実行タイムに関する整列の効果の例が示してある。予め、実行時間の長い順にセクションを並び替えてあるため、特定のスレッドが実行時間の長い複数のセクションを担当する確率が低くなり、図６で示した本発明に係る請求項１のみを適用した場合に比較して、並列処理の実行時間は、更に１　単位時間短くなる。
【００３２】
図１０、１１は、本発明を適用したコンパイラプログラムが出力するオブジェクトプログラムの詳細をソースコード化したイメージの例が示してある。図３、および図７で示す本発明に係る処理を示すフローチャートでは、発明部分に着目して説明してあるが、図２で示すスレッド割当済判定テーブルは、同時に複数のスレッドから参照、更新されるため本発明を適用する際には、排他制御が必要となる。
【００３３】
以下に、本発明を適用したコンパイラプログラムが出力するオブジェクトプログラムの処理の詳細について、図１０のコメントに記述した（１）　、（２）　、・・・、（７）　の順序番号に従って説明する。
（１）　各スレッドは、セクションに到達すると、スレッド割当済判定テーブルにある、そのセクションに対応したフラグを参照する。セクションに対応したフラグが「未」でない場合、スレッドはそのセクションをスキップし、次のセクションの処理に移る。
（２）　セクションに対応したフラグが「未」の場合、スレッドは、ロックを用いて排他制御を開始する。
（３）　スレッドは、再度、セクションに対応したフラグを参照する。
（４）　セクションに対応したフラグが「済」に変わっていた場合、スレッドは、排他制御を終了し、そのセクションをスキップし、次のセクションの処理に移る。
（５）　セクションに対応したフラグが「済」でない場合、スレッドはそのセクションのフラグを「済」に更新する。
（６）　排他制御を終了し、そのセクションを実行する。
（１）　から（６）　までの処理を、各セクションに対してセクションが無くなるまで繰り返す。
【００３４】
本発明の処理内容を記述したコンパイラプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記録装置（ハードディスク装置、フレキシブルディスクなど）、光ディスク（ＤＶＤやＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭなど）、光磁気記録媒体（ＭＯなど）や半導体メモリなどがある。
【００３５】
また、本コンパイラプログラムは可搬型の記録媒体だけでなくネットワークを通じて利用者に提供することができる。
【００３６】
【発明の効果】
スケジューラを使用することなく、各ＣＰＵのロードバランスを改善し、効率の良い並列処理が可能となる。
【図面の簡単な説明】
【図１】本発明の実施の形態１の全体構成図
【図２】スレッド割当済判定テーブル
【図３】本発明に係るバックエンド部の処理概要、およびコード展開の追加処理のフローチャート
【図４】本発明を説明するためのソースプログラム例
【図５】本発明に係るオブジェクトコードのイメージ例
【図６】本発明に係る実行タイムチャート例
【図７】本発明に係るミドルパス部の処理概要、およびハード無依存最適化の追加処理のフローチャート
【図８】実行時間による整列例
【図９】整列の効果例
【図１０】本発明に係るオブジェクトコードのイメージ例の詳細
【図１１】本発明に係るオブジェクトコードのイメージ例の詳細（続き）
【図１２】従来の技術を説明するためのソースプログラム例
【図１３】実行タイムチャート例（ＣＰＵ数がセクション数より多いか等しい場合）
【図１４】ＣＰＵ固定方式による従来のオブジェクトコードのイメージ例
【図１５】実行タイムチャート例（ＣＰＵ数がセクション数より少ない場合）
【図１６】ロードアンバランシング例
【符号の説明】
１　コンパイル装置
２　ソースプログラム
３　オブジェクトプログラム
１０　コンパイラプログラム
１１　制御部
１２　フロントエンド部
１３　ミドルパス部
１４　バックエンド部
１３１　セクション整列手段
１４１　スレッド対応付手段
１４２　割当済表示手段
１４３　次セクション実行手段
【図１】
2004094581.tif 000003
【図２】
2004094581.tif 000004
【図３】
2004094581.tif 000005
【図４】
2004094581.tif 000006
【図５】
2004094581.tif 000007
【図６】
2004094581.tif 000008
【図７】
2004094581.tif 000009
【図８】
2004094581.tif 000010
【図９】
2004094581.tif 000011
【図１０】
2004094581.tif 000012
【図１１】
2004094581.tif 000013
【図１２】
2004094581.tif 000014
【図１３】
2004094581.tif 000015
【図１４】
2004094581.tif 000016
【図１５】
2004094581.tif 000017
【図１６】
2004094581.tif 000018