(57)【特許請求の範囲】
【請求項１】
計算機を制御して、ＭＰＩを使用したソースプログラムをコンパイルすることによりオブジェクトプログラムを出力するコンパイラにおける最適化方法において、
入力された前記ソースプログラムのＭＰＩ手続の呼び出し部分の他の手続への変更や実行順序の変更により、前記ＭＰＩ手続の最適化を行なう場合に、
前記コンパイラによる前記ソースプログラムのコンパイルに際し、
前記ソースプログラムから同期通信によるＭＰＩ通信を実行するための同期通信のＭＰＩ手続の呼び出しを検出し、
前記ソースプログラムの前記同期通信のＭＰＩ手続呼び出しの文の前後の文を解析し、
解析により、前記同期通信のＭＰＩ手続による通信データとは関係のないデータのみによる実行文があり、かつ当該実行文の移動によりプログラムの意味を変えない場合に、前記実行文の実行順序を前記同期通信のＭＰＩ手続の後に移動し、
前記同期通信のＭＰＩ手続を、非同期通信によるＭＰＩ通信を実行するための非同期通信のＭＰＩ手続に変更し、
前記実行文の並びの後に、通信待ち合わせの手続を挿入することにより、
前記ソースプログラムの前記同期通信のＭＰＩ手続を非同期通信のＭＰＩ手続に変更したオブジェクトプログラムを出力することを特徴とするＭＰＩプログラムのコンパイルにおける最適化方法。
【発明の詳細な説明】
【０００１】
【発明が属する技術分野】
本発明は、メッセージ交換インタフェース（ＭＰＩ）を使用したプログラムをコンパイルするコンパイラによる最適化方法に関し、特にＭＰＩプログラムの実行時間短縮を実現する最適化方法に関する。
【０００２】
【従来の技術】
従来のコンパイラにおいては、入力されたソースプログラムに対して、コードサイズと実行速度の何れかを重視した最適化処理を行なってオブジェクトプログラムの出力を行なっている。
【０００３】
この種のコンパイラは、例えば特開平１１−１２０１５２号公報に開示されており、ソースプログラムの構文解析を行なう構文解析部と、構文解析の終了後に、解析結果及び指定に基づいて命令を選択して出力コードを生成してオブジェクトプログラムを出力するコード生成部が備えられている。
【０００４】
ところで、メッセージ交換インタフェース（ＭＰＩ）は言語に依存しないライブラリであるため、上述した従来のコンパイラでは、ソースプログラム中にあるＭＰＩ手続呼び出しを変形せず、記述された通りに手続を呼び出す命令を、オブジェクトプログラム中に組み込んでいるのが一般的にある。
【０００５】
すなわち、ＭＰＩ手続き読み出しに関して多くの最適化の余地があるにも関わらず、最適化の対象外としていた。
【０００６】
【発明が解決しようとする課題】
上述した従来のコンパイラにおける最適化では、ソースプログラム中にあるＭＰＩ手続呼び出しを変形せず、記述された通りに手続を呼び出す命令を、オブジェクトプログラム中に組み込み、ＭＰＩ手続き読み出しを最適化の対象外としているので、ＭＰＩプログラムの実行時間を短縮させることができないという問題点があった。
【０００７】
本発明の目的は、メッセージ交換インターフェイス（ＭＰＩ）を使用したプログラムをコンパイルする時に、ＭＰＩ手続の呼び出し部分をコンパイラによる最適化の対象とすることによって、プログラムの実行時間を短縮させることができるコンパイラによる最適化方法を提供することにある。
【０００８】
【課題を解決するための手段】
上記目的を達成する本発明は、計算機を制御して、ＭＰＩを使用したソースプログラムをコンパイルすることによりオブジェクトプログラムを出力するコンパイラにおける最適化方法において、入力された前記ソースプログラムのＭＰＩ手続の呼び出し部分の他の手続への変更や実行順序の変更により、前記ＭＰＩ手続の最適化を行なう場合に、前記コンパイラによる前記ソースプログラムのコンパイルに際し、前記ソースプログラムから同期通信によるＭＰＩ通信を実行するための同期通信のＭＰＩ手続の呼び出しを検出し、前記ソースプログラムの前記同期通信のＭＰＩ手続呼び出しの文の前後の文を解析し、解析により、前記同期通信のＭＰＩ手続による通信データとは関係のないデータのみによる実行文があり、かつ当該実行文の移動によりプログラムの意味を変えない場合に、前記実行文の実行順序を前記同期通信のＭＰＩ手続の後に移動し、前記同期通信のＭＰＩ手続を、非同期通信によるＭＰＩ通信を実行するための非同期通信のＭＰＩ手続に変更し、前記実行文の並びの後に、通信待ち合わせの手続を挿入することにより、前記ソースプログラムの前記同期通信のＭＰＩ手続を非同期通信のＭＰＩ手続に変更したオブジェクトプログラムを出力することを特徴とする。
【００１４】
【発明の実施の形態】
以下、本発明の実施の形態について図面を参照して詳細に説明する。図１は、本発明の実施の形態によるコンパイラのシステム構成を示すブロック図である。
【００１５】
本発明は、メッセージ交換インターフェイス（ＭＰＩ）を使用したプログラムをコンパイルする時に、ＭＰＩ手続の呼び出し部分をコンパイラによる最適化の対象とすることによって、プログラムの実行時間を短縮させるものである。
【００１６】
図１において、コンパイラ２０は、ソースプログラム１０を入力して、オブジェクトプログラム３０を出力するものであり、ＭＰＩ手続検出部４０と、ＭＰＩ手続最適化部５０を備える。なお、図１では本発明の特徴的な要素のみを示しており、上記構成要素以外に、従来と同様の構文解析部やコード生成部及びオブジェクトプログラム出力に関する構成要素を備えている。
【００１７】
入力されたソースプログラム１０中から、ＭＰＩ手続検出部４０によりＭＰＩ手続呼び出し部分が検出されると、ＭＰＩ手続最適化部５０により最適化が施され、オブジェクトプログラム３０が生成される。
【００１８】
ＭＰＩ手続最適部５０は、以下に述べる種々の最適化の方法によりＭＰＩ手続呼び出し部分の最適化処理を行なう。以下、これらの最適化方法について、フローチャートとソースプログラム例を用いて説明する。
【００１９】
まず、第１の最適化方法について図２のフローチャートに従って説明する。
【００２０】
ＭＰＩ手続は実行時に引数のエラーチェックを行っているが、この第１の最適化方法では、コンパイル時に引数のエラーチェックを行いエラーが無ければ、実行時のエラーチェックを行わない高速版のＭＰＩ手続を呼ぶように変更することにより実行時間の短縮を実現する。
【００２１】
ＭＰＩ手続最適化部５０は、呼び出されているＭＰＩ手続の引数について正しい型が使われているかどうかを検査する（ステップ２０１）。そして、正しい型が使われていたならば（ステップ２０２）、型チェックを省略した手続を呼び出すようにオブジェクトプログラム３０を出力する（ステップ２０３）。
【００２２】
また、正しい型が使われていなければ（ステップ２０２）、手続を変更せずにそのままの名前で呼び出すようなオブジェクトプログラム３０を出力する（ステップ２０４）。なお、正しい型が使われていない場合には、コンパイルエラーとしてもよい。
【００２３】
例えば、ソースプログラム１０がＦｏｒｔｒａｎで記述されている場合、図７に示すようにＭＰＩ手続呼び出しがあり、かつ引き数の型が正しければ、最適化された結果は図８の文を含むソースプログラム１０が入力されたものと等価となる。ここで、「ＭＰＩ＿ＳＥＮＤ１」とは、「ＭＰＩ＿ＳＥＮＤ」の引数のエラーチェック処理を省略した手続とする。
【００２４】
第２の最適化方法にについて図３のフローチャートに従って説明する。
【００２５】
複数の通信プロトコルを利用できる場合でも、ＭＰＩプログラムは、通常、プログラムの開始から終了まで一つの通信プロトコルを使用する。ところが、実行時間の短縮をするためには、データサイズの違いによって、どの通信プロトコルを使用すると通信速度が最適になるかを判定し選択する必要がある。したがって、この第２の最適化方法では、通信サイズがコンパイル時に分る時、サイズによって最適なプロトコルを用いたＭＰＩルーチンを呼ぶように変更することにより実行時間の短縮を実現する。
【００２６】
ＭＰＩ手続最適化部５０は、呼び出されているＭＰＩ手続の通信データサイズに関する引数を検査する（ステップ３０１）。そして、通信データサイズがコンパイル時に決定できるならば（ステップ３０２）、その通信データサイズの大きさに応じて、最適な手続を呼び出すようにオブジェクトプログラム３０を出力する（ステップ３０３）。
【００２７】
通信データサイズと対応する手続の関係は、あらかじめコンパイラ内で用意しておくが、プログラム開発者がきめ細かく操作できるように、コンパイルオプションやソースプログラム１０中の指示行によって変更できるようにしても良い。
【００２８】
また、通信データサイズがコンパイル時に決定できない場合は（ステップ３０２）、手続を変更せずにそのままの名前で呼び出すようなオブジェクトプログラム３０を出力する（ステップ３０４）。
【００２９】
例えば、８０バイト未満の通信データサイズの場合はプロトコルＡ、それ以上の場合はプロトコルＢを用いた手続を使用するとする。そして、ソースプログラム１０がＦｏｒｔｒａｎで記述されており、図７のようにＭＰＩ手続呼び出しがあるとする。
【００３０】
この場合、通信データサイズがコンパイル時に決定でき、「ＭＰＩ＿ＲＥＡＬ」が４バイトとすると、通信データサイズが４０バイトである１行目の手続はプロトコルＡ、通信データサイズが１００バイトである２行目の手続はプロトコルＢを使用するように最適化される。最適化された結果は図９に示す文を含むソースプログラム１０が入力されたものと等価となる。ここで、「ＭＰＩ＿ＳＥＮＤ２」とは、プロトコルＡを用いた手続、「ＭＰＩ＿ＳＥＮＤ」は、プロトコルＢを用いた手続とする。
【００３１】
第３の最適化方法にについて図４のフローチャートに従って説明する。
【００３２】
ＭＰＩの通信には、同期通信と非同期通信とがある。同期通信は、通信が完了するまで他の処理が実行できないが、プログラム開発者は、通信対象であるデータアクセスに関するプログラムミスを起こすことはない。一方、非同期通信は、通信が完了するまでにも他の処理が行え、プログラムの実行時間の短縮に有用であるが、プログラム開発者は、他の処理の中で通信対象であるデータをアクセスするというミスを起こしやすいという性質を有する。そこで、この第３の最適化方法では、コンパイラにより、同期通信のＭＰＩ手続を非同期通信のＭＰＩ手続に変更し通信データに関与しない実行文をＭＰＩ手続の直後に移動することにより、プログラム開発者に負担をかけることなく通信と処理の同時実行を行い実行時間の短縮を実現する。
【００３３】
ＭＰＩ手続最適化部５０は、同期通信のＭＰＩ手続呼び出しを検出すると（ステップ４０１）、その呼び出し文の前後の文を解析する（ステップ４０２）。
【００３４】
そして、解析により、通信データとは関係のないデータのみによる実行文があり、かつ文の移動によりプログラムの意味を変えない場合には、その実行文の実行順序をＭＰＩ手続の後に移動する（ステップ４０３）。その結果、ＭＰＩ手続の後には、１つ以上の通信データとは関係のないデータのみによる実行文の並びができる。
【００３５】
そして、その実行文の並びの後に、通信待ち合わせの手続を挿入し（ステップ４０４）、ＭＰＩ手続を非同期通信の手続に変更したオブジェクトプログラム３０を出力する（ステップ４０５）。
【００３６】
例えば、ソースプログラム１０がＦｏｒｔｒａｎで記述されている場合、図１０に示すような文の並びがあるとする。そして、通信データは変数Ａであり、変数Ｂと変数Ｃは変数Ａと記憶領域の重なりがないということがコンパイル時に判明しているとする。
【００３７】
この場合、１行目の変数Ｂへの代入文は、変数Ａとは関係がないので、ＭＰＩ手続「ＭＰＩ＿ＳＥＮＤ」の呼び出しとの文の入れ換えが可能である。また、４行目の変数Ｃへの代入文は、３行目のＡとＢを使った演算とは関係がないので、文の入れ換えが可能である。
【００３８】
そして、ＭＰＩ手続「ＭＰＩ＿ＳＥＮＤ」を非同期通信の手続「ＭＰＩ＿ＩＳＥＮＤ」に変更し、その通信に対応した待ち合わせの手続「ＭＰＩ＿ＷＡＩＴ」を、通信と同時実行する実行文の並びの最後に挿入する。その結果、図１１に示すような文を含むソースプログラムが入力されたものと等価となる。
【００３９】
第４の最適化方法にについて図５のフローチャートに従って説明する。
【００４０】
プログラム開発者は、安全にプログラムを動作させるためにバリア同期を頻繁に使用する傾向がある。そのため、プログラム中に不要なバリア同期が含まれることになる。そこで、この第４の最適化方法では、バリア同期が不要かどうか判断し、不要な場合はそのバリア同期呼び出しを削除することにより実行時間の短縮を実現する。
【００４１】
ＭＰＩ手続最適化部５０は、バリア同期のＭＰＩ手続呼び出しを検出すると（ステップ５０１）、その呼び出し文の前後の文を解析する（ステップ５０２）。そして、そのＭＰＩ手続が不要と判断すると（ステップ５０３）、その手続の呼び出し文を削除したオブジェクトプログラム３０を出力する（ステップ５０４）。ＭＰＩ手続が不要と判断されない場合には、その手続の呼び出し文をそのままにしてオブジェクトプログラム３０を出力する（ステップ５０５）。
【００４２】
第５の最適化方法にについて図６のフローチャートに従って説明する。
【００４３】
この第５の最適化方法では、一対一通信を用いて特定の集団的な通信をしている通信パターンを認識し、より効率の良い集団通信に置き換えることにより実行時間の短縮を実現する。
【００４４】
ＭＰＩ手続最適化部５０は、ループ中にある一対一通信を検出し（ステップ６０１）、通信パターンを解析する（ステップ６０２）。そして、その通信パターンがＭＰＩの集団通信に対応するものがあれば（ステップ６０３）、代わりにその集団通信の手続を呼び出すようにオブジェクトプログラム３０を出力する（ステップ６０４）。通信パターンがＭＰＩの集団通信に対応していなければ、手続を変更することなくオブジェクトプログラム３０を出力する（ステップ６０５）。
【００４５】
例えば、ソースプログラム１０がＦｏｒｔｒａｎで記述されている場合、図１２のような文の並びがあるとする。この場合は、プロセッサ０から残りのプロセッサへのデータの送信であることがわかるため、最適化された結果はこの一連の文を「ＭＰＩ＿ＢＣＡＳＴ」に変更したものである図１３に示す文を含むソースプログラム１０が入力されたものと等価となる。
【００４６】
なお、上述した第１から第５の最適化方法は、それぞれ単独で実行することも可能であるし、互いに組み合わせることにより実行することもできる。
【００４７】
以上好ましい実施の形態及び実施例をあげて本発明を説明したが、本発明は必ずしも上記実施の形態及び実施例に限定されるものではなく、その技術的思想の範囲内において様々に変形して実施することができる。
【００４８】
【発明の効果】
以上説明した本発明の最適化方法によれば、ＭＰＩ手続呼び出し部分を最適化の対象とし、より効率の良い手続へ変更、実行順序を変更することにより通信と処理の同時実行などの最適化を行うため、ＭＰＩプログラムの実行時間の短縮を実現することができる。
【００４９】
請求項２の最適化方法によれば、コンパイル時に引数のエラーチェックを行いエラーが無ければ、実行時のエラーチェックを行わない高速版のＭＰＩ手続を呼ぶように変更することにより実行時間の短縮が実現される。
【００５０】
請求項３の最適化方法によれば、通信サイズがコンパイル時に分る時、サイズによって最適なプロトコルを用いたＭＰＩルーチンを呼ぶように変更することにより、実行時間の短縮が実現される。
【００５１】
請求項４の最適化方法によれば、同期通信のＭＰＩ手続を非同期通信のＭＰＩ手続に変更し通信データに関与しない実行文をＭＰＩ手続の直後に移動することにより、プログラム開発者に負担をかけることなく通信と処理の同時実行を行い実行時間の短縮が実現される。
【００５２】
請求項５の最適化方法によれば、バリア同期が不要かどうか判断し、不要な場合はそのバリア同期呼び出しを削除することにより実行時間の短縮が実現される。
【００５３】
請求項６の最適化方法によれば、一対一通信を用いて特定の集団的な通信をしている通信パターンを認識し、より効率の良い集団通信に置き換えることにより実行時間の短縮を実現する。
【図面の簡単な説明】
【図１】  本発明の実施の形態による最適化方法を適用したコンパイラのシステム構成を示すブロック図である。
【図２】  本発明の第１の最適化方法の処理内容を示すフローチャートである。
【図３】  本発明の第２の最適化方法の処理内容を示すフローチャートである。
【図４】  本発明の第３の最適化方法の処理内容を示すフローチャートである。
【図５】  本発明の第４の最適化方法の処理内容を示すフローチャートである。
【図６】  本発明の第５の最適化方法の処理内容を示すフローチャートである。
【図７】  ソースプログラムの一例を示す図である。
【図８】  図７のソースプログラムが第１の最適化方法により最適化された状態と等価なソースプログラムを示す図である。
【図９】  図７のソースプログラムが第２の最適化方法により最適化が行われた状態と等価なソースプログラムを示す図である。
【図１０】  ソースプログラムの一例を示す図である。
【図１１】  図１０のソースプログラムが第３の最適化方法により最適化された状態と等価なソースプログラムを示す図である
【図１２】  ソースプログラムの一例を示す図である。
【図１３】  図１２のソースプログラムが第５の最適化方法により最適化された状態と等価なソースプログラムを示す図である。
【符号の説明】
１０  ソースプログラム
２０  コンパイラ
３０  オブジェクトプログラム
４０  ＭＰＩ手続検出部
５０  ＭＰＩ手続最適化部
【図１】
0003640081.tif 000002
【図２】
0003640081.tif 000003
【図３】
0003640081.tif 000004
【図４】
0003640081.tif 000005
【図５】
0003640081.tif 000006
【図６】
0003640081.tif 000007
【図７】
0003640081.tif 000008
【図８】
0003640081.tif 000009
【図９】
0003640081.tif 000010
【図１０】
0003640081.tif 000011
【図１１】
0003640081.tif 000012
【図１２】
0003640081.tif 000013
【図１３】
0003640081.tif 000014