(57)【要約】【課題】プログラム内の処理の実行先プロセッサを分散して効率的な並列処理を実行させること。【解決手段】並列処理支援装置１００では、同一のプロセッサによって実行させることを念頭に作成されたプログラム１０１の中から、ＡＲＰＣ指示子によって設計者が指定した特定の処理に着目して、この処理を複数のプロセッサによって分散して実行させる並列処理用プログラム１０２を作成することによってマルチコアプロセッサ１１０による並列処理の実行を支援する。【選択図】図１
2010211731.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータを、
複数のプロセッサによる並列処理の対象となる関数に特定のコードが付与されたプログラムを取得する取得手段、
前記取得手段によって取得されたプログラムの構文木が表す前記プログラム内の関数、文の間のデータ依存関係および制御の流れに基づいて、前記特定のコードが付与された関数の待ち合わせ箇所を特定する特定手段、
前記特定のコードが付与された関数の記述箇所を前記並列処理の開始を指示するコードに置換するとともに、前記特定手段によって特定された待ち合わせ箇所の前に、前記並列処理の終了を指示するコードを挿入する挿入手段、
前記挿入手段によって前記並列処理の開始と終了とを指示するコードが挿入されたプログラムを出力する出力手段、
として機能させることを特徴とする並列処理支援プログラム。
【請求項２】
前記コンピュータを、さらに、
前記取得手段によって前記特定のコードが付与されていないプログラムが取得された場合、当該プログラム内の並列処理の対象となる関数の選択を受け付ける受付手段、
前記受付手段によって受け付けた選択が表す関数に、前記特定のコードを付与する付与手段、として機能させ、
前記特定手段は、前記付与手段によって並列処理の対象となる関数に特定のコードが付与されたプログラムの構文木が表す前記プログラム内の関数同士のデータ依存関係に基づいて、前記特定のコードが付与された関数によって作成されたデータを用いた処理の記述箇所を特定することを特徴とする請求項１に記載の並列処理支援プログラム。
【請求項３】
複数のプロセッサによる並列処理の対象となる関数に特定のコードが付与されたプログラムを取得する取得手段と、
前記取得手段によって取得されたプログラムの構文木が表す前記プログラム内の関数、文の間のデータ依存関係および制御の流れに基づいて、前記特定のコードが付与された関数の待ち合わせ箇所を特定する特定手段と、
前記特定のコードが付与された関数の記述箇所を前記並列処理の開始を指示するコードに置換するとともに、前記特定手段によって特定された待ち合わせ箇所の前に、前記並列処理の終了を指示するコードを挿入する挿入手段と、
前記挿入手段によって前記並列処理の開始と終了とを指示するコードが挿入されたプログラムを出力する出力手段と、
を備えることを特徴とする並列処理支援装置。
【請求項４】
コンピュータが、
複数のプロセッサによる並列処理の対象となる関数に特定のコードが付与されたプログラムを取得する取得工程と、
前記取得工程によって取得されたプログラムの構文木が表す前記プログラム内の関数、文の間のデータ依存関係および制御の流れに基づいて、前記特定のコードが付与された関数の待ち合わせ箇所を特定する特定工程と、
前記特定のコードが付与された関数の記述箇所を前記並列処理の開始を指示するコードに置換するとともに、前記特定工程によって特定された待ち合わせ箇所の前に、前記並列処理の終了を指示するコードを挿入する挿入工程と、
前記挿入工程によって前記並列処理の開始と終了とを指示するコードが挿入されたプログラムを出力する出力工程と、
を実行することを特徴とする並列処理支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、同一のプログラム内の命令を複数のプロセッサに分散して並列処理させるための並列処理支援プログラム、並列処理支援装置および並列処理支援方法に関する。
【背景技術】
【０００２】
従来より、組み込みシステムによるプログラムの処理速度を上げるには、より動作周波数の高いプロセッサを搭載しなければならなかった。動作周波数の高いプロセッサを搭載した場合には、消費電力が増大してしまい、また、プロセッサの動作周波数にも物理的な限界がある。そこで、近年では、プロセッサの動作周波数を上げずに、同一のプログラム内の命令を複数のプロセッサ・コアに分散させて並列処理をすることで処理速度を上げる手法が採用される傾向にある（たとえば、下記特許文献１参照。）。
【０００３】
個々のプログラムの命令の構成を検証すると、命令レベルの並列性は２〜４程度であることが多いため（たとえば、下記非特許文献１参照。）、開発者によって、さらに投機的な実行などを導入することにより並列性を向上させるような手法も利用されている。さらに、上述のように命令レベルでの並列化にも限界があり、これを解消するために、プログラム内の手続き呼び出しなど、命令レベルよりも大きな粒度でプログラムを並列化し、複数のプロセッサにて実行することにより、処理性能を向上させる手法も注目されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平５―２９０００３号公報
【非特許文献】
【０００５】
【非特許文献１】Ｄａｖｉｄ  Ｗ．Ｗａｌｌ“Ｌｉｍｉｔｓ  ｏｆ  ｉｎｓｔｒｕｃｔｉｏｎ  ｌｅｖｅｌ  ｐａｒａｌｌｅｌｉｓｍ”Ｔｅｃｈｎｉｃａｌ  Ｒｅｐｏｒｔ  ９３／６，Ｄｉｇｉｔａｌ  ＷＲＬ，Ｎｏｖｅｍｂｅｒ  １９９３．
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上述したように同一のプログラム内の手続き呼び出しを複数のプロセッサによって分散させ、並列処理を実行するには、依存関係のない手続きを同時に呼び出し、かつ、プロセッサの待ち時間が少なくなるように適切な場所・順番で手続きの待ち合わせを実行させる必要がある。そのためには、可能な限り、同一システム内の他プロセッサで実行した結果が必要となるタイミングで待ち合わせをおこなうことが望ましい。
【０００７】
ところが、条件分岐やループ制御を含むプログラムでは、制御構造を考慮して待ち合わせを設定しなければならない。このとき、誤った待ち合わせを設定すると、起動していない手続きの待ち合わせをしたり、起動した手続きが終了する前にプログラムを終了して、再度手続きを呼び出したりしてしまい、プログラムを正常に動作させることができないという問題が起きてしまう。
【０００８】
したがって、開発者は、システムに実行させたいプログラムを入手すると、このプログラムのデータの流れと制御構造を解析し、適切な待ち合わせ箇所を個別に設定する必要があった。この作業には開発者の熟練度が求められる上に、作業時間もかかり、ミスも発生しやすいため、開発者にとって大きな負担となっていた。
【０００９】
本開示技術は、上述した従来技術による問題点を解消するため、プログラム内の処理の実行先プロセッサを分散して効率的な並列処理を実行させる並列処理用のプログラムを自動的に作成する並列処理支援プログラム、並列処理支援装置および並列処理支援方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するため、本開示技術は、コンピュータにおいて、複数のプロセッサによる並列処理の対象となる関数に特定のコードが付与されたプログラムを取得する処理と、取得されたプログラムの構文木が表す前記プログラム内の関数、文の間のデータ依存関係および制御の流れに基づいて、前記特定のコードが付与された関数の待ち合わせ箇所を特定する処理と、前記特定のコードが付与された関数の記述箇所を前記並列処理の開始を指示するコードに置換するとともに、特定された待ち合わせ箇所の前に、前記並列処理の終了を指示するコードを挿入する処理と、前記並列処理の開始と終了とを指示するコードが挿入されたプログラムを出力する処理とを、含むことを特徴とする。
【００１１】
本開示技術によれば、指示子が付与された関数の記述についての、呼び出しと待ち合わせ箇所を特定することによって、並列処理を実行するためのコードに書き換えられるため、自動的に並列処理用の記述に修正されたプログラムが出力される。
【発明の効果】
【００１２】
本並列処理支援プログラム、並列処理支援装置および並列処理支援方法によれば、プログラム内の処理の実行先プロセッサを分散して効率的な並列処理を実行させる並列処理用のプログラムを自動的に作成することができるという効果を奏する。
【図面の簡単な説明】
【００１３】
【図１】本実施の形態にかかる並列処理支援の概要を示す説明図である。
【図２】非同期遠隔手続き呼び出しによる並列処理を示す説明図である。
【図３】本実施の形態にかかる並列処理支援装置のハードウェア構成を示す説明図である。
【図４】本実施の形態にかかる並列処理支援装置の機能的構成を示すブロック図である。
【図５】並列処理支援の手順を示すフローチャートである。
【図６】並列処理用のＡＲＰＣプラグマの書式を示す説明図である。
【図７】Ｃプログラムの一例を示すデータ列である。
【図８】図７のＣプログラムの構文木を示す説明図である。
【図９】構文木によって表される関数の構成を示す説明図である。
【図１０】並列処理用のＣプログラムの作成手順を示すフローチャートである。
【図１１】並列処理の待ち合わせ箇所の特定手順を示すフローチャートである。
【図１２】待ち合わせ判定手順を示すフローチャートである。
【図１３】制御構文内の待ち合わせ判定手順を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下に添付図面を参照して、この発明にかかる並列処理支援プログラム、並列処理支援装置および並列処理支援方法の好適な実施の形態を詳細に説明する。本実施の形態では、同一のプロセッサによって実行させることを念頭に作成されたプログラム、すなわち並列処理用の設定がなされていないプログラムの中から、設計者が指定した特定の処理に着目して、この処理を複数のプロセッサによって分散して実行させる並列処理用のプログラムを作成することによってマルチコアプロセッサによる並列処理の実行を支援する。
【００１５】
（並列処理支援の概要）
まず、本実施の形態にかかる並列処理支援について説明する。図１は、本実施の形態にかかる並列処理支援の概要を示す説明図である。図１のように、並列処理支援装置１００は、任意のプログラム１０１が入力されると、このプログラム１０１を並列処理用プログラム１０２に自動変換して出力する。出力された並列処理用プログラム１０２は、マルチコアプロセッサ１１０によって実行される。
【００１６】
本実施の形態では、プログラム１０１内の処理のうち、手続き呼び出しに着目し、この手続きをマルチコアプロセッサ１１０内の遠隔プロセッサにて実行させる。遠隔プロセッサとは、マルチコアプロセッサ１１０内の複数のプロセッサのうち、プログラム１０１（実際に処理されるのは並列処理用プログラム１０２）を処理するメインのプロセッサ以外のプロセッサを意味する。また、メインのプロセッサと遠隔プロセッサとでは、それぞれ分散された処理が独立して処理される。したがって、以下、遠隔プロセッサに分散される処理を、「非同期遠隔手続き呼び出し」と呼ぶ。
【００１７】
ここで、図２は、非同期遠隔手続き呼び出しによる並列処理を示す説明図である。図２のように、並列処理用プログラム１０２を用いた場合、マルチコアプロセッサ１１０では、コア＃０をメインのプロセッサ、コア１＃〜コア＃３を遠隔プロセッサとして非同期遠隔手続き呼び出しがおこなわれる。
【００１８】
たとえば、コア＃０で呼び出された関数Ａ（ｆｕｎｃ＿Ａ）は、コア＃１によって処理２０１として実行され、コア＃０で呼び出された関数Ｂ（ｆｕｎｃ＿Ｂ）は、コア＃２によって処理２０２として実行され、コア＃０で呼び出された関数Ｃ（ｆｕｎｃ＿Ｃ）は、コア＃３によって処理２０３として実行される。そして、メインのプロセッサであるコア＃０では、処理２０４が実行され関数Ｄ（ｆｕｎｃ＿Ｄ）を他の関数Ａ〜Ｃと並列して実行させることができる。
【００１９】
図２に例示した並列処理のように、遠隔プロセッサであるコア＃１〜＃３によって実行された処理結果は、それぞれ、メインのプロセッサであるコア＃０に戻される。戻された処理結果は、コア＃０によるつぎの処理に利用される。したがって、処理結果を戻すタイミングを適切に設定しなければ、課題にて説明したように並列処理用プログラム１０２を正しく実行させることができなかったり、必要以上の待機時間が生じ、処理をおこなっているにもかかわらず並列処理用プログラム１０２の処理速度が低下してしまうといった問題が起こる恐れがある。
【００２０】
そこで、図１に示すように、並列処理支援装置１００では、入力されたプログラム１０１に記述された処理のうち、あらかじめプログラム１０１に特定のコードが付与された箇所を並列処理として他のプロセッサに分散可能な処理の記述に変換する。具体的には、並列処理を実行させたい呼び出し処理の関数にあらかじめプラグマとしてＡＲＰＣ（Ａｓｙｎｃｈｒｏｎｏｕｓ  Ｒｅｍｏｔｅ  Ｐｒｏｃｅｄｕｒｅ  Ｃａｌｌ：非同期型遠隔手続き呼び出し）指示子を付与しておく。
【００２１】
そして、プログラム１０１の記述のうち、ＡＲＰＣ指示子の記述箇所をＡＲＰＣの呼び出しに置換し（Ｓ１）、遠隔手続き呼び出しの開始箇所を設定する。具体的には、「ｆｕｎｃ＿Ａ＿ｓｔａｒｔ、ｆｕｎｃ＿Ｂ＿ｓｔａｒｔ、ｆｕｎｃ＿Ｃ＿ｓｔａｒｔ」が置換されている。そして、この遠隔手続きの終了箇所を設定するためには、手続き呼び出し処理によるデータの流れから、手続き結果が必要な箇所や、制御の流れから手続き呼び出しに応答した手続き待ち合わせの対応箇所を特定する。したがって、本実施の形態では、下記のＳ２〜Ｓ４によってＡＲＰＣの待ち合わせ処理が挿入される。
Ｓ２：出力結果が必要となる文の直前でＡＲＰＣの待ち合わせを挿入（具体的には、「ｆｕｎｃ＿Ａ＿ｗａｉｔ」を挿入）
Ｓ３：出力結果が必要となる文を含むＩｆ文の直前でＡＲＰＣの待ち合わせを挿入（具体的には、「ｆｕｎｃ＿Ｂ＿ｗａｉｔ」を挿入）
Ｓ４：遠隔手続き呼び出しを開始した文が含まれるＬｏｏｐ文の末尾でＡＲＰＣの待ち合わせ挿入（具体的には、「ｆｕｎｃ＿Ｃ＿ｗａｉｔ」を挿入）
【００２２】
このように、Ｓ１によって置換したＡＲＰＣによる手続き呼び出しに応答した手続き待ち合わせをＳ２〜Ｓ４のいずれかが該当する箇所に挿入することによって、適切な待ち合わせが設定された並列処理用プログラム１０２が自動的に作成される。したがって設計者に負担なく、マルチコアプロセッサ１１０による効率的な処理が可能なプログラムを提供することができる。以下に、上述した並列処理支援を実現するための具体的な構成ならびに処理内容について説明する。
【００２３】
（並列処理支援装置のハードウェア構成）
まず、本実施の形態にかかる並列処理支援装置１００のハードウェア構成について説明する。図３は、本実施の形態にかかる並列処理支援装置１００のハードウェア構成を示すブロック図である。図３において、並列処理支援装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）３０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３０３と、磁気ディスクドライブ３０４と、磁気ディスク３０５と、通信Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）３０６と、入力デバイス３０７と、出力デバイス３０８と、を備えている。また、各構成部はバス３１０によってそれぞれ接続されている。
【００２４】
ここで、ＣＰＵ３０１は、並列処理支援装置１００の全体の制御を司る。ＲＯＭ３０２は、ブートプログラムや、本実施の形態にかかる並列処理支援を実現するための並列処理支援プログラムなどの各種プログラムを記憶している。ＲＡＭ３０３は、ＣＰＵ３０１のワークエリアとして使用される。磁気ディスクドライブ３０４は、ＣＰＵ３０１の制御にしたがって磁気ディスク３０５に対するデータの更新／参照を制御する。磁気ディスク３０５は、磁気ディスクドライブ３０４の制御で書き込まれたデータを記憶する。なお、図３のハードウェア構成では、記録媒体として、磁気ディスク３０５を用いているが、光ディスクや、フラッシュメモリなど他の記録媒体を利用してもよい。
【００２５】
通信Ｉ／Ｆ３０６は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク（ＮＥＴ）３０９に接続され、このネットワーク３０９を介して他の情報処理装置やその他の外部装置に接続される。そして、通信Ｉ／Ｆ３０６は、ネットワーク３０９と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。通信Ｉ／Ｆ３０６の構成例としては、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２６】
入力デバイス３０７は、並列処理支援装置１００に対しての外部からの入力を受け付ける。入力デバイス３０７としては、具体的には、キーボード、マウスなどが挙げられる。キーボードの場合、たとえば、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウスの場合、たとえば、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。また、ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００２７】
出力デバイス３０８は、並列処理支援装置１００に入力されたプログラム１０１の記述内容や、並列処理用プログラム１０２の記述内容などを出力する。出力デバイス３０８としては、具体的には、ディスプレイ、プリンタなどが挙げられる。ディスプレイの場合、たとえば、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイとしてさらに、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。また、プリンタの場合、たとえば、画像データや文書データを印刷する。さらに、レーザプリンタやインクジェットプリンタを採用することができる。
【００２８】
（並列処理支援装置の機能的構成）
つぎに、並列処理支援装置１００の機能的構成について説明する。図４は、本実施の形態にかかる並列処理支援装置の機能的構成を示すブロック図である。図４のように、並列処理支援装置１００は、取得部４０１と、特定部４０２と、挿入部４０３と、出力部４０４と、受付部４０５と、付与部４０６と、を含む構成である。この制御部となる機能（取得部４０１〜付与部４０６）は、具体的には、たとえば、図３に示したＲＯＭ３０２、ＲＡＭ３０３、磁気ディスク３０５などの記憶領域に記憶された並列処理支援プログラムをＣＰＵ３０１に実行させることにより、または、通信Ｉ／Ｆ３０６により、その機能を実現する。
【００２９】
取得部４０１は、複数のプロセッサによる並列処理の対象となる関数に特定のコードが付与されたプログラム１０１を取得し、取得したプログラム１０１の構文木を作成する機能を有する。プログラム１０１には、図１にて説明したように、特定のコードとしてＡＲＰＣ指示子が付与されている。なお、プログラム１０１は、あらかじめ開発者によってＡＲＰＣ指示子が付与されているものを取得してもよいし、並列処理支援装置１００によって付与してもよいが、この場合は、後述する付与部４０６を利用する。したがって、まずは、あらかじめＡＲＰＣ指示子が付与されたプログラム１０１を取得したものとして説明を続ける。なお、取得されたプログラム１０１は、ＲＡＭ３０３、磁気ディスク３０５などの記憶領域に一旦記憶される。また、並列処理支援装置１００は、プログラム１０１の構文木についても、外部からプログラム１０１の構文木を取得してもよい。
【００３０】
特定部４０２は、取得部４０１によって取得されたプログラムの構文木が表す前記プログラム内の関数、文の間のデータ依存関係および制御の流れに基づいて、ＡＲＰＣ指示子が付与された関数によって作成されたデータを用いた処理の記述箇所を特定する機能を有する。すなわち、特定部４０２では、図１のＳ２〜Ｓ４に該当する箇所を特定する。なお、特定された箇所の情報は、ＲＡＭ３０３、磁気ディスク３０５などの記憶領域に一旦記憶される。
【００３１】
挿入部４０３は、所定の箇所に並列処理、すなわち、本実施の形態では手続き呼び出しならびに手続き待ち合わせを指示するコードを挿入する機能を有する。具体的には、ＡＲＰＣ指示子が付与された関数の記述箇所の前に、手続き呼び出しを指示するコードを挿入する（たとえば、関数のｓｔａｒｔ命令）。このとき、挿入したコードによってＡＲＰＣ指示子を置換する。また、特定部４０２によって特定された記述箇所の前に、手続き待ち合わせを指示するコードを挿入する（たとえば、関数のｗａｉｔ命令）。
【００３２】
なお、手続き待ち合わせの挿入箇所としては、特定部４０２によって３種類のパターンの箇所が特定される。具体的には、特定部４０２は、構文木によって表されたＡＲＰＣ指示子が付与された関数による演算結果が利用される記述箇所あるいは制御が移行する文の記述箇所あるいは待ち合わせを指示するコードの記述箇所と、ＡＲＰＣ指示子が付与された関数による演算結果が利用される記述箇所あるいは制御が移行する文の記述箇所あるいは待ち合わせを指示するコードの記述箇所を内部に含む条件分岐処理あるいはループ処理の記述箇所と、ＡＲＰＣ指示子が付与された関数が存在する条件分件処理あるいはループ制御の末尾が特定される。
【００３３】
したがって、挿入部４０３では、ＡＲＰＣ指示子が付与された手続き呼び出し箇所の関数と対応させて、各特定箇所の前に手続き待ち合わせを指示するコードを挿入する。なお、各コードが挿入されたプログラム１０１は、ＲＡＭ３０３、磁気ディスク３０５などの記憶領域に一旦記憶される。
【００３４】
出力部４０４は、挿入部４０３によって手続き呼び出しならびに手続き待ち合わせを指示するコードが挿入されたプログラム１０１を並列処理用プログラム１０２として出力する機能を有する。出力部４０４による出力とは、並列処理用プログラム１０２として加工されたデータ群が作成されたことを意味し、出力された並列処理用プログラム１０２は、ＲＡＭ３０３、磁気ディスク３０５などの記憶領域に一旦記憶された後、出力デバイス３０８のディスプレイに表示されてもよいし、通信Ｉ／Ｆ３０６を介して直接マルチコアプロセッサ１１０に提供されてもよいし、一旦外部の記録媒体に保持されてもよい。
【００３５】
つぎに、取得部４０１によって、ＡＲＰＣ指示子が付与されていないプログラム１０１を取得した場合について説明する。ＡＲＰＣ指示子が付与されていないプログラム１０１を取得した場合、取得部４０１は、プログラム１０１を受付部４０５に出力する。
【００３６】
受付部４０５は、取得部４０１によってＡＲＰＣ指示子が付与されていないプログラム１０１が取得された場合に、プログラム１０１内の並列処理の対象となる関数の選択を受け付ける機能を有する。関数の選択は、入力デバイス３０７のキーボードなどによっておこなわれる。なお、受付部４０５によって受け付けられた関数の選択情報は、ＲＡＭ３０３、磁気ディスク３０５などの記憶領域に一旦記憶される。
【００３７】
そして付与部４０６は、受付部４０５によって受け付けられた選択が表す関数に、ＡＲＰＣ指示子を付与する機能を有する。そして、ＡＲＰＣ指示子が付与されたプログラム１０１は、ＲＡＭ３０３、磁気ディスク３０５などの記憶領域に一旦記憶される。
【００３８】
このように、受付部４０５と、付与部４０６とによってＡＲＰＣ指示子が付与されたプログラム１０１が作成されると、特定部４０２では、このプログラム１０１を用いて、手続き待ち合わせ箇所の特定をおこなうため、以下の挿入部４０３、出力部４０４では、ＡＲＰＣ指示子が付与されたプログラム１０１と同様の処理をおこない、並列処理用プログラム１０２を作成することができる。
【００３９】
上述したように、並列処理支援装置１００では、取得部４０１〜付与部４０６の機能部によって構成されているが、開発者の利用環境や、並列処理装置１００のハードウェア資源や処理能力に応じて構成を適宜変更することもできる。たとえば、単純に並列処理用プログラム１０２の作成機能に能力を特化させたい場合には、受付部４０５〜付与部４０６の機能部を外部に用意してもよい。
【００４０】
（並列処理支援の手順）
つぎに、上述した構成の並列処理支援装置１００における並列処理支援の手順について説明する。図５は、並列処理支援の手順を示すフローチャートである。図５のように、マルチコアプロセッサ１１０によって並列処理を実行させたいプログラム１０１の入力をトリガに処理を開始する。なお、以下の説明では、プログラム１０１の一例としてＣプログラム５０１を利用して、並列処理用プログラム１０２として呼び出し側Ｃプログラム５０２を作成する場合について説明する。
【００４１】
なお、Ｃプログラム５０１には変換指示用のプラグマとしてＡＲＰＣ指示子が付与されている。図６は、並列処理用のＡＲＰＣプラグマの書式を示す説明図である。図６のように、手続き呼び出し処理をおこなう関数には、ＡＲＰＣ指示子として、特定のコードとともに処理対象となる変数リストを指定する情報が含まれている。
【００４２】
図５の説明に戻り、並列処理支援装置１００において、Ｃプログラム５０１が入力されると、Ｃプログラム５０１の構文解析をおこない、Ｃプログラム５０１の構文木を作成し、データの流れと制御の流れを特定する（ステップＳ５１０）。なお、ステップＳ５１０の際に、指示子にて指定された情報を保存しておくとともに、ＡＲＰＣ＿ＷＡＩＴ指示文はダミーの関数に変換しておく。また、ここで利用する構文木（抽象構文木）とは、プログラムの制御構造を木構造で表した情報である。
【００４３】
ここで、図７は、Ｃプログラムの一例を示すデータ列である。そして、図８は、図７のＣプログラムの構文木を示す説明図である。図７のような任意のプログラムがデータ列７００のような記述によって構成された場合、１列目の関数「ｆｏｏ」をルートとして２列目以下の記述をノードとして図８のような構文木８００が作成される。なお、構文木の作成技術は公知であるため、ここでは説明を省略する（たとえば、「コンパイラの構成と最適化（中田育男著、朝倉書店、１９９９年）」参照。）。
【００４４】
そして、図９は、構文木によって表される関数の構成を示す説明図である。図９では、構文木を用いてデータ依存箇所の特定（ステップＳ５２０）を行うことで表される関数の構成を示している。ここで、Ｃプログラム５０１としてＡＲＰＣ指示子にて変数の入出力が指定されている場合はその情報を加味してデータの参照・代入情報を求める。
【００４５】
このとき、ｉｎ，ｉｎｏｕｔで指定された変数は、当該手続き呼び出しで参照される変数とし、ｏｕｔ，ｉｎｏｕｔで指定された変数は当該手続き呼び出しで代入される変数とする。Ｃプログラム５０１の場合、構文木を作成しデータ依存箇所を特定することによってブロック構造図９００によって表される。
【００４６】
具体的には、ｆｏｒ文（ステップＳ９０１）によって、所定の条件を満たすまでループ処理が繰り返される（ステップＳ９０１：Ｒｏｏｐ）。ループ処理では、まず、変数ａ，ｂ，ｃがそれぞれ関数Ａ〜Ｃ（ｆｕｎｃ＿Ａ〜Ｃ）によって演算される（ステップＳ９０２）。この演算結果は、後述する変数参照をおこなうステップＳ９０３，９０５，９０７によって利用される。
【００４７】
まず、ステップＳ９０３によって関数Ａの演算結果によって変数ａが参照され、つぎに、ｉｆ文によって条件分岐判断がおこなわれる（ステップＳ９０４）。ステップＳ９０４によってＹｅｓ判断がなされた場合（ステップＳ９０４：Ｙｅｓ）、関数Ｂの演算結果によって変数ｂが参照され（ステップＳ９０５）、ステップＳ９０６の処理に移行する。一方、ステップ９０４によってＮｏ判断がなされた場合（ステップＳ９０５：Ｎｏ）、そのままステップＳ９０６の処理に移行する。
【００４８】
ステップＳ９０６では、変数ｂの参照処理もしくはｉｆ文によってＮｏ判断された場合のつぎの文ｓに移行し、文ｓの処理をおこなう（ステップＳ９０６）。その後、ステップＳ９０１に戻り、ｆｏｒ文によって、所定の条件を満たすと（ステップＳ９０１：Ｅｎｄ）ループを脱出し、変数ｃを参照し（ステップＳ９０７）、一連の処理を終了する。このように、この構文木の接続状態とデータ依存箇所の特定結果を参照することによって、Ｃプログラム５０１内のデータの流れと制御の流れを即座に把握することができる。データの流れの解析技術は公知でるため、ここでは説明を省略する（たとえば、「コンパイラの構成と最適化（中田育男著、朝倉書店、１９９９年）」参照。）。
【００４９】
図５の説明に戻り、ステップＳ５１０によって構文木が作成されると、つぎに構文木の構成を参照してＣプログラム５０１のデータ依存箇所を特定する（ステップＳ５２０）。そして、指示子が付与された命令を、非同期遠隔手続き呼び出しをおこなうためにＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）に置換するとともに、ステップＳ５２０によって特定された箇所に手続き終了待ち合わせをおこなうためのＡＰＩを挿入する（ステップＳ５３０）。ＡＰＩとは、プラットフォーム向けのソフトウェアを開発する際に使用できる命令や関数のデータセットである。したがって、ここでは、並列処理用の命令や関数のデータセットとして設定されたＡＰＩが置換もしくは挿入される。
【００５０】
最後に、ステップＳ５３０によってＡＰＩが置換、挿入されたＣプログラム５０１を出力する（ステップＳ５４０）。なお、ステップＳ５４０の際に、ＡＲＰＣ＿ＷＡＩＴのダミー関数を除外してＣプログラム５０１を出力することによって、Ｃプログラム５０１が、並列処理用の呼び出し側Ｃプログラム５０２となり、マルチコアプロセッサ１１０によって処理可能なプログラムとして提供される。
【００５１】
（Ｃプログラムの作成手順）
つぎに、図５にて説明したＣプログラム５０１から呼び出し側Ｃプログラム５０２を作成する際のより具体的な手順について説明する。図１０は、並列処理用のＣプログラムの作成手順を示すフローチャートである。図１０のフローチャートにおいて、まず、Ｃプログラム５０１の構文木とデータ依存箇所の特定結果を取得する（ステップＳ１００１）。
【００５２】
つぎに、ステップＳ１００１によって取得した構文木を構成するステートメントを深さ優先で検索する（ステップＳ１００２）。このステップＳ１００２によって未処理のステートメントが検索されたか否かを判断し（ステップＳ１００３）、未処理のステートメントが検索された場合（ステップＳ１００３：Ｙｅｓ）、続いて、検索されたステートメントに指示子が付与されているか否かを判断する（ステップＳ１００４）。指示子とは上述したように、並列処理対象として選択された関数に付与されたＡＲＰＣプラグマである。
【００５３】
ステップＳ１００４において、ステートメントに指示子が付与されていない場合には（ステップＳ１００４：Ｎｏ）、ステップＳ１００２に戻り、つぎの未処理ステートメントを検索する。そして、検索されたステートメントに指示子が付与されていると判断された場合（ステップＳ１００４：Ｙｅｓ）、このステートメントを並列処理用の命令に変換するための処理に移行する。
【００５４】
まず、ステートメントを並列処理呼び出しＡＰＩに置換する（ステップＳ１００５）。この変換処理によって、並列処理の開始箇所に並列処理の開始を指示するＡＰＩが挿入される。そして、Ｃプログラム５０１内の並列処理の待ち合わせ箇所を判定するとともに、待ち合わせ箇所がある階層の最後となることもあるため、待ち合わせＡＰＩ挿入箇所の前の文を特定する（ステップＳ１００６）。並列処理の待ち合わせ箇所とは、並列処理として実行された関数によって作成されたデータを利用する箇所であり、並列処理の終了箇所である。なお、このステップＳ１００６の処理については、後ほど詳しく説明する。
【００５５】
そして、ステップＳ１００６による特定箇所の後に並列処理の待ち合わせＡＰＩを挿入することによって（ステップＳ１００７）、並列処理の終了箇所にも適切にＡＰＩが挿入され、ステップＳ１００２に戻り、つぎのステートメントへの処理へ移行する。そして、ステップＳ１００３において、未処理のステートメントがないと判断されると（ステップＳ１００３：Ｎｏ）、一連の処理を終了する。このように、指示子が付与されたすべてのステートメントに対して、ステップＳ１００７までの処理が施されたＣプログラム５０１が、すなわち、並列処理用の呼び出し側Ｃプログラム５０２となる。
【００５６】
（待ち合わせ箇所の特定）
つぎに、ステップＳ１００６における並列処理の待ち合わせ箇所の特定についての具体的な処理手順について説明する。図１１は、並列処理の待ち合わせ箇所の特定手順を示すフローチャートである。図１１のフローチャートにおいて、まず、図１０のステップＳ１００２において、処理対象として検索されたステートメントを構成する文ｓｎを文ｓ０に設定する（ステップＳ１１０１）。
【００５７】
続いて、文ｓ０が構文木において文ｓｎと親を同一にする同一階層の最後の文か否かを判断する（ステップＳ１１０２）。構文木の階層とは、図８にて説明したようなルートとなる「関数  ｆｏｏ」から同じ何段階分岐したノードであるかを意味する。たとえば、構文木８００の場合、ノード３，４，１５，１６が親をｆｏｏとする階層１の同一階層であり、ノード６，７，８，９，１０，１３が親をｆｏｒ文とする同一階層となる。
【００５８】
ステップＳ１１０２において、文ｓ０が構文木の同一階層の最後の文であると判断された場合（ステップＳ１１０２：Ｙｅｓ）、文ｓ０を待ち合わせ箇所に特定して（ステップＳ１１０９）、一連の処理を終了する。一方、文ｓ０が構文木の同一階層の最後の文ではないと判断された場合（ステップＳ１１０２：Ｎｏ）、処理対象を文ｓ０のつぎの文である文ｓ１に移行する（ステップＳ１１０３）。
【００５９】
その後、文ｓ１についての待ち合わせ判定をおこなう（ステップＳ１１０４）。ステップＳ１１０４の待ち合わせ判定とは、文ｓ１において所定のデータまたは制御の流れが発生しているか否かを「Ｔｒｕｅ」ｏｒ「Ｆａｌｓｅ」で判断する処理である。所定のデータ流れが発生していれば、並列処理の待ち合わせ箇所と判断される。
【００６０】
したがって、ここで、ステップＳ１１０４の待ち合わせ判定について詳しく説明する。図１２は、待ち合わせ判定手順を示すフローチャートである。図１２のフローチャートにおいて、まず、処理中の文ｓ（ここでは、ステップＳ１１０３によって文ｓ１が処理中の文に設定されている）はＡＲＰＣ＿ＷＡＩＴのダミー関数か否かを判断する（ステップＳ１２０１）。ステップＳ１２０１において、文ｓはＡＲＰＣ＿ＷＡＩＴのダミー関数であると判断された場合（ステップＳ１２０１：Ｙｅｓ）、処理中の文ｓは待ち合わせ箇所であるため、「Ｔｒｕｅ」を出力して（ステップＳ１２０４）、一連の処理を終了する。
【００６１】
一方、ステップＳ１２０１において、文ｓはＡＲＰＣ＿ＷＡＩＴのダミー関数でないと判断された場合（ステップＳ１２０１：Ｎｏ）、つぎに、文ｓはＶａｒｌｉｓｔで表された出力変数のいずれかを利用するか否かを判断する（ステップＳ１２０２）。出力変数のいずれかを利用するとは出力変数を参照または代入する処理を意味する。したがって、文ｓが出力変数のいずれかを利用すると判断された場合（ステップＳ１２０２：Ｙｅｓ）、処理中の文ｓは待ち合わせ箇所であるため、「Ｔｒｕｅ」を出力して（ステップＳ１２０４）、一連の処理を終了する。
【００６２】
一方、ステップＳ１２０２において、文ｓが出力変数のいずれかを利用しないと判断された場合（ステップＳ１２０２：Ｎｏ）、さらに、文ｓは特定の命令であるか否かを判断する（ステップＳ１２０３）。特定の命令とは、「ｒｅｔｕｒｎ」、「ｇｏｔｏ」、「ｂｒｅａｋ」などの処理中の文ｓを超えて他の文に処理が移行する命令を指す。そして、文ｓが特定の命令であると判断された場合（ステップＳ１２０３：Ｙｅｓ）、処理中の文ｓは待ち合わせ箇所であるため、「Ｔｒｕｅ」を出力して（ステップＳ１２０４）、一連の処理を終了する。
【００６３】
一方、ステップＳ１２０３において、文ｓが特定の命令ではないと判断された場合（ステップＳ１２０３：Ｎｏ）、処理対象となる文ｓでは、所定のデータの流れは発生していないとして、「Ｆａｌｓｅ」を出力して（ステップＳ１２０５）、一連の処理を終了する。以上説明したように、ステップＳ１１０４では、文ｓ１が待ち合わせ箇所となるか否かの判断がおこなわれる。そして、判断結果として、「Ｔｒｕｅ」ｏｒ「Ｆａｌｓｅ」のいずれかが出力される。
【００６４】
図１１の説明に戻り、ステップＳ１１０４の待ち合わせ判定が終了すると、この待ち合わせ判定が「Ｔｒｕｅ」か否かを判断する（ステップＳ１１０５）。このステップＳ１１０５において、待ち合わせ判定が「Ｔｒｕｅ」であった場合（ステップＳ１１０５：Ｙｅｓ）、特定した文ｓ１の前にＡＰＩを挿入するため文ｓ０を待ち合わせ箇所に特定して（ステップＳ１１０９）、一連の処理を終了する。
【００６５】
一方、ステップＳ１１０５において、待ち合わせ判定が「Ｆａｌｓｅ」であった場合（ステップＳ１１０５：Ｎｏ）、つぎに、文ｓ１が特定の制御構文であるか否かを判断する（ステップＳ１１０６）。特定の制御構文とは、具体的には、「ｉｆ」、「ｗｈｉｌｅ」、「ｆｏｒ」、「ｄｏ」、「ｓｗｉｔｃｈ」などのデータの制御処理をおこなう構文を指す。
【００６６】
ステップＳ１１０６において、文ｓ１が特定の制御構文であると判断された場合（ステップＳ１１０６：Ｙｅｓ）、この制御構文内の待ち合わせ判定をおこなう（ステップＳ１１０７）。ステップＳ１１０７の制御構文内の待ち合わせ判定とは、文ｓ１の構文木上の子孫に対して所定のデータまたは制御の流れが発生しているか否かを「Ｔｒｕｅ」ｏｒ「Ｆａｌｓｅ」で判断する処理である。所定のデータまたは制御の流れが発生していれば、並列処理の待ち合わせ箇所と判断される。また、ステップＳ１１０６において、文ｓ１が特定の制御構文でないと判断された場合（ステップＳ１１０６：Ｎｏ）、ステップＳ１１１０に移行する。
【００６７】
したがって、つぎに、ステップＳ１１０７における制御構文内の待ち合わせ判定について詳しく説明する。図１３は、制御構文内の待ち合わせ判定手順を示すフローチャートである。図１３のフローチャートにおいて、まず、制御構文の先頭文を文ｓに設定する（ステップＳ１３０１）。そして、ここであらたに設定した文ｓについて図１２にて説明したような特定のデータまたは制御の流れが発生しているかを判断するための待ち合わせ判定をおこなう（ステップＳ１３０２）。
【００６８】
そして、ステップＳ１３０２における待ち合わせ判定として「Ｔｒｕｅ」が出力されたか否かを判断する（ステップＳ１３０３）。ここで、「Ｔｒｕｅ」が出力された場合（ステップＳ１３０３：Ｙｅｓ）、制御構文内でも特定のデータまたは制御の流れが発生しており、待ち合わせ箇所となるため、「Ｔｒｕｅ」を出力して（ステップＳ１３０４）、一連の処理を終了する。
【００６９】
一方、ステップＳ１３０３において、待ち合わせ判定として「Ｆａｌｓｅ」が出力された場合（ステップＳ１３０３：Ｎｏ）、文ｓは特定の制御構文であるか否かが判断される（ステップＳ１３０５）。ここで判断基準となる特定の制御構文とは上述した「ｉｆ」、「ｗｈｉｌｅ」、「ｆｏｒ」、「ｄｏ」、「ｓｗｉｔｃｈ」などのデータの制御処理をおこなう構文である。
【００７０】
そして、文ｓが特定の制御構文であると判断された場合（ステップＳ１３０５：Ｙｅｓ）、制御構文内の待ち合わせ判定をおこなう（ステップＳ１３０６）。このステップＳ１３０６では、文ｓについて、再度、図１３のフローチャートの処理が実行されることになる。すなわち、制御構文内にさらに特定の制御構文が配置されている場合には、より深い階層に処理を移行することを意味する。
【００７１】
また、制御構文内にさらに制御構文があるか否かの判断は、ステップＳ１３０５において、処理中の文ｓが特定の制御構文ではないと判断されるまで繰り返し実行される。特定の制御構文ではない文ｓに行き着き、待ち合わせ判定がおこなわれると、ステップＳ１３０６における待ち合わせ判定として「Ｔｒｕｅ」が出力されたか否かを判断する（ステップＳ１３０７）。ここで、「Ｔｒｕｅ」が出力された場合（ステップＳ１３０７：Ｙｅｓ）、制御構文内でも特定のデータまたは制御の流れが発生しており、待ち合わせ箇所となるため、「Ｔｒｕｅ」を出力して（ステップＳ１３０４）、一連の処理を終了する。
【００７２】
そして、ステップＳ１３０５において、文ｓが特定の制御構文でないと判断された場合（ステップＳ１３０５：Ｎｏ）、もしくは、ステップＳ１３０７において、待ち合わせ判定が「Ｆａｌｓｅ」と出力された場合（ステップＳ１３０７：Ｎｏ）、つぎに、文ｓが制御構文の最後の文か否かを判断する（ステップＳ１３０８）。
【００７３】
ステップＳ１３０８において、文ｓが制御構文の最後の文であると判断された場合（ステップＳ１３０８：Ｙｅｓ）、並列処理の待ち合わせ箇所とはならないため、「Ｆａｌｓｅ」を出力して（ステップＳ１３１０）、一連の処理を終了する。一方、文ｓが制御構文の最後の文でないと判断された場合（ステップＳ１３０８：Ｎｏ）、処理対象を文ｓのつぎの文に移行して（ステップＳ１３０９）、ステップＳ１３０２の処理に戻り、「Ｔｒｕｅ」ｏｒ「Ｆａｌｓｅ」のいずれかが出力されるまで、処理を繰り返す。このように、特定の制御が発生している制御構文内については、さらに、制御構文内に特定のデータまたは制御の流れが発生している箇所を待ち合わせ箇所として特定する。
【００７４】
図１１の説明に戻り、ステップＳ１１０７の制御構文内の待ち合わせ判定が終了すると、この待ち合わせ判定が「Ｔｒｕｅ」か否かを判断する（ステップＳ１１０８）。このステップＳ１１０８において、待ち合わせ判定が「Ｔｒｕｅ」であった場合（ステップＳ１１０８：Ｙｅｓ）、特定した文ｓ１の前にＡＰＩを挿入するため文ｓ０を待ち合わせ箇所に特定して（ステップＳ１１０９）、一連の処理を終了する。
【００７５】
一方、ステップＳ１１０８において、待ち合わせ判定が「Ｆａｌｓｅ」であった場合（ステップＳ１１０８：Ｎｏ）、文ｓ０に移行して（ステップＳ１１１０）、ステップＳ１１０２の処理に移行する。すなわち、文ｓ０が同一階層の最後の文になるまで特定処理を繰り返すことによって、一連の処理を終了する。
【００７６】
以上説明したように、本実施の形態にかかる並列処理支援プログラム、並列処理支援装置および並列処理支援方法によれば、１つのプロセッサによって処理を実行することを念頭に開発されたプログラムであっても、指示子が付与された関数の記述についての、呼び出しと待ち合わせ箇所を特定することによって、自動的に並列処理を実行するためのＡＰＩに書き換えることができる。したがって、設計者がプログラムを修正する負荷をかけることなく、マルチコアプロセッサ１１０による効率的な並列処理を実現することができる。
【００７７】
また、本実施の形態では、並列処理支援装置１００からＡＲＰＣ指示子の自動付与機能や、構文木の作成機能を独立させ、これらの処理を外部に分散することもできる。したがって、開発環境に応じた機能を備えた並列処理支援装置１００を構成することができる。
【００７８】
なお、本実施の形態で説明した並列処理支援方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーションなどのコンピュータで実行することにより実現することができる。本並列処理支援プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本並列処理支援プログラムは、インターネットなどのネットワークを介して配布してもよい。
【００７９】
また、本実施の形態で説明した並列処理支援装置１００は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）などの特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡなどのＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、たとえば、上述した並列処理支援装置１００の機能（取得部４０１〜付与部４０６）をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、並列処理支援装置１００を製造することができる。
【００８０】
上述した実施の形態に関し、さらに以下の付記を開示する。
【００８１】
（付記１）コンピュータを、
複数のプロセッサによる並列処理の対象となる関数に特定のコードが付与されたプログラムを取得する取得手段、
前記取得手段によって取得されたプログラムの構文木が表す前記プログラム内の関数、文の間のデータ依存関係および制御の流れに基づいて、前記特定のコードが付与された関数の待ち合わせ箇所を特定する特定手段、
前記特定のコードが付与された関数の記述箇所を前記並列処理の開始を指示するコードに置換するとともに、前記特定手段によって特定された待ち合わせ箇所の前に、前記並列処理の終了を指示するコードを挿入する挿入手段、
前記挿入手段によって前記並列処理の開始と終了とを指示するコードが挿入されたプログラムを出力する出力手段、
として機能させることを特徴とする並列処理支援プログラム。
【００８２】
（付記２）前記特定手段は、前記構文木によって表された、前記特定のコードが付与された関数による演算結果が利用される記述箇所を特定し、
前記挿入手段は、前記特定手段によって特定された記述箇所の前に、前記並列処理の終了を指示するコードを挿入することを特徴とする付記１に記載の並列処理支援プログラム。
【００８３】
（付記３）前記特定手段は、前記構文木によって表された、前記特定のコードが付与された関数の後に位置する待ち合わせを指示するコードの記述箇所を特定し、
前記挿入手段は、前記特定手段によって特定された記述箇所の前に、前記並列処理の終了を指示するコードを挿入することを特徴とする付記１に記載の並列処理支援プログラム。
【００８４】
（付記４）前記特定手段は、前記構文木によって表された、前記特定のコードが付与された関数の後に位置する制御の流れを表す記述箇所を特定し、
前記挿入手段は、前記特定手段によって特定された記述箇所の前に、前記並列処理の終了を指示するコードを挿入することを特徴とする付記１に記載の並列処理支援プログラム。
【００８５】
（付記５）前記特定手段は、前記特定のコードが付与された関数による演算結果が利用される記述箇所、前記特定のコードが付与された関数の後に位置する待ち合わせを指示するコードの記述箇所および前記特定のコードが付与された関数の後に位置する制御の流れを表す記述箇所の中から、前記特定のコードが付与された関数に最も近い記述箇所を特定し、
前記挿入手段は、前記特定手段によって特定された記述箇所の前に、前記並列処理の終了を指示するコードを挿入することを特徴とする付記１に記載の並列処理支援プログラム。
【００８６】
（付記６）前記特定手段は、前記構文木によって表された、前記特定のコードが付与された関数による演算結果が利用される記述箇所、あるいは、他の文に制御が移行する文がある箇所、あるいは、待ち合わせ指定箇所が内部に存在する前記特定のコードが付与された関数と親を同一にする同一階層の条件分岐処理やループ処理を特定し、
前記挿入手段は、前記特定手段によって特定された処理の前に、前記並列処理の終了を指示するコードを挿入することを特徴とする付記１〜５のいずれか一つに記載の並列処理支援プログラム。
【００８７】
（付記７）前記特定手段は、前記構文木によって表された、前記特定のコードが付与された関数と構文木において親を同一にする同一階層の末尾の文の記述箇所を特定し、
前記挿入手段は、前記特定手段によって特定された記述箇所の後に前記並列処理の終了を指示するコードを挿入することを特徴とする付記１〜６のいずれか一つに記載の並列処理支援プログラム。
【００８８】
（付記８）前記コンピュータを、さらに、
前記取得手段によって前記特定のコードが付与されていないプログラムが取得された場合、当該プログラム内の並列処理の対象となる関数の選択を受け付ける受付手段、
前記受付手段によって受け付けた選択が表す関数に、前記特定のコードを付与する付与手段、として機能させ、
前記特定手段は、前記付与手段によって並列処理の対象となる関数に特定のコード付与されたプログラムの構文木が表す前記プログラム内の関数同士のデータ依存関係に基づいて、前記特定のコードが付与された関数によって作成されたデータを用いた処理の記述箇所を特定することを特徴とする付記１〜７のいずれか一つに記載の並列処理支援プログラム。
【００８９】
（付記９）前記コンピュータを、さらに、
前記取得手段によって取得された前記プログラムの構文木を作成する作成手段として機能させ、
前記特定手段は、前記作成手段によって作成された構文木が表す前記プログラム内の関数同士のデータ依存関係に基づいて、前記特定のコードが付与された関数によって作成されたデータを用いた処理の記述箇所を特定することを特徴とする付記１〜８のいずれか一つに記載の並列処理支援プログラム。
【００９０】
（付記１０）複数のプロセッサによる並列処理の対象となる関数に特定のコードが付与されたプログラムを取得する取得手段と、
前記取得手段によって取得されたプログラムの構文木が表す前記プログラム内の関数、文の間のデータ依存関係および制御の流れに基づいて、前記特定のコードが付与された関数の待ち合わせ箇所を特定する特定手段と、
前記特定のコードが付与された関数の記述箇所を前記並列処理の開始を指示するコードに置換するとともに、前記特定手段によって特定された待ち合わせ箇所の前に、前記並列処理の終了を指示するコードを挿入する挿入手段と、
前記挿入手段によって前記並列処理の開始と終了とを指示するコードが挿入されたプログラムを出力する出力手段と、
を備えることを特徴とする並列処理支援装置。
【００９１】
（付記１１）コンピュータが、
複数のプロセッサによる並列処理の対象となる関数に特定のコードが付与されたプログラムを取得する取得工程と、
前記取得工程によって取得されたプログラムの構文木が表す前記プログラム内の関数、文の間のデータ依存関係および制御の流れに基づいて、前記特定のコードが付与された関数の待ち合わせ箇所を特定する特定工程と、
前記特定のコードが付与された関数の記述箇所を前記並列処理の開始を指示するコードに置換するとともに、前記特定工程によって特定された待ち合わせ箇所の前に、前記並列処理の終了を指示するコードを挿入する挿入工程と、
前記挿入工程によって前記並列処理の開始と終了とを指示するコードが挿入されたプログラムを出力する出力工程と、
を実行することを特徴とする並列処理支援方法。
【符号の説明】
【００９２】
１００  並列処理支援装置
１０１  プログラム
１０２  並列処理用プログラム
１１０  マルチコアプロセッサ
４０１  取得部
４０２  特定部
４０３  挿入部
４０４  出力部
４０５  受付部
４０６  付与部
５０１  Ｃプログラム
５０２  呼び出し側Ｃプログラム
【図１】
2010211731.tif 000003
【図２】
2010211731.tif 000004
【図３】
2010211731.tif 000005
【図４】
2010211731.tif 000006
【図５】
2010211731.tif 000007
【図６】
2010211731.tif 000008
【図７】
2010211731.tif 000009
【図８】
2010211731.tif 000010
【図９】
2010211731.tif 000011
【図１０】
2010211731.tif 000012
【図１１】
2010211731.tif 000013
【図１２】
2010211731.tif 000014
【図１３】
2010211731.tif 000015