(57)【特許請求の範囲】
【請求項１】
複数の計算機と前記複数の計算機を管理する管理装置とを有する並列計算機において、
前記管理装置は、
プロセス毎にスレッド数が割り当てられた複数のプロセスが前記複数の計算機で並列に実行されたときの並列化の度合いを示す並列化率が第１の閾値より大きいか否かを判定する第１の判定部と、
前記複数のプロセスが前記複数の計算機で並列に実行されたときにメモリが利用されていた時間の割合を示すメモリビジー率が第２の閾値より小さいか否かを判定する第２の判定部と、
プロセス毎の浮動小数点演算数の差を示す演算数差が第３の閾値より大きいか否かを判定する第３の判定部と、
プロセス毎の処理時間の差を示す処理時間差が第４の閾値より大きいか否かを判定する第４の判定部と、
前記並列化率が前記第１の閾値より大きく、前記メモリビジー率が前記第２の閾値より小さく、前記演算数差が前記第３の閾値より大きく、かつ、前記処理時間差が前記第４の閾値より大きい場合に、各プロセスへ割り当てるスレッド数を調整する調整部と
を有することを特徴とする並列計算機。
【請求項２】
前記調整部は、各プロセスへ割り当てるスレッド数を調整した際に、各計算機へのプロセスの割り当てを調整することを特徴とする請求項１に記載の並列計算機。
【請求項３】
前記調整部は、各計算機のコア数の制約のため各計算機へのプロセスの割り当てを調整することができない場合には、各計算機内で各プロセスへ割り当てるスレッド数を調整することを特徴とする請求項２に記載の並列計算機。
【請求項４】
前記並列化率は、全スレッドにより並列に処理が行われた時間のプロセスの処理時間に対する割合に基づくことを特徴とする請求項１、２又は３に記載の並列計算機。
【請求項５】
並列処理を行う複数の計算機を管理する管理装置によるスレッド再割当判定方法において、
プロセス毎にスレッド数が割り当てられた複数のプロセスが前記複数の計算機で並列に実行されたときの並列化の度合いを示す並列化率が第１の閾値より大きいか否かを判定し、
前記複数のプロセスが前記複数の計算機で並列に実行されたときにメモリが利用されていた時間の割合を示すメモリビジー率が第２の閾値より小さいか否かを判定し、
プロセス毎の浮動小数点演算数の差を示す演算数差が第３の閾値より大きいか否かを判定し、
プロセス毎の処理時間の差を示す処理時間差が第４の閾値より大きいか否かを判定し、
前記並列化率が前記第１の閾値より大きく、前記メモリビジー率が前記第２の閾値より小さく、前記演算数差が前記第３の閾値より大きく、かつ、前記処理時間差が前記第４の閾値より大きい場合に、各プロセスへ割り当てるスレッド数を調整する
ことを特徴とするスレッド再割当判定方法。
【請求項６】
並列処理を行う複数の計算機を管理するコンピュータに、
プロセス毎にスレッド数が割り当てられた複数のプロセスが前記複数の計算機で並列に実行されたときの並列化の度合いを示す並列化率が第１の閾値より大きいか否かを判定し、
前記複数のプロセスが前記複数の計算機で並列に実行されたときにメモリが利用されていた時間の割合を示すメモリビジー率が第２の閾値より小さいか否かを判定し、
プロセス毎の浮動小数点演算数の差を示す演算数差が第３の閾値より大きいか否かを判定し、
プロセス毎の処理時間の差を示す処理時間差が第４の閾値より大きいか否かを判定し、
前記並列化率が前記第１の閾値より大きく、前記メモリビジー率が前記第２の閾値より小さく、前記演算数差が前記第３の閾値より大きく、かつ、前記処理時間差が前記第４の閾値より大きい場合に、各プロセスへ割り当てるスレッド数を調整する
処理を実行させることを特徴とするスレッド再割当判定プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列計算機、スレッド再割当判定方法及びスレッド再割当判定プログラムに関する。
【背景技術】
【０００２】
複数の計算機を有する並列計算機は、複数のプロセスを並列に実行することによりプログラムを並列処理する。ここで、プロセスとは、並列処理の単位である。各計算機は複数のＣＰＵコアを有し、各計算機では１つ以上のプロセスが並列実行される。プロセス間の通信は、ＭＰＩ（Message  Passing  Interface）を用いて行われる。
【０００３】
各プロセスは部分的に複数のスレッドで実行される。例えば、ループ変数Ｉを１〜１０００まで変化させて繰り返し実行されるループがプログラムにあり、スレッド数が４である場合には、Ｉ＝１〜２５０、Ｉ＝２５１〜５００、Ｉ＝５０１〜７５０、Ｉ＝７５１〜１０００の４つのスレッドで並列に処理が行われる。１つのスレッドには１つのＣＰＵコアが割り当てられる。
【０００４】
プロセス数及びスレッド数は、並列計算機のユーザが指定することが可能である。ただし、スレッド数は、ＣＰＵコア数以内である。また、プロセス毎に１つ以上のスレッドが割り当てられた複数のプロセスによる並列処理は、ハイブリッド並列処理と呼ばれる。
【０００５】
並列処理を効率よく行うためには、プロセス毎の処理時間を均等化することが重要となる。また、プロセスの処理時間は、スレッド数に依存する。そこで、プロセス毎の処理時間に基づいてプロセスのスレッド数を動的に再設定することにより、プロセス毎の処理時間を均等化する技術がある。
【０００６】
また、実行される一連の部品プログラム列とそのタイミングと部品プログラムの性能値とを基にシミュレーションによって計算機システムの性能値を予測することで、要求性能を満たす計算機システムの設計を支援する技術がある。
【０００７】
また、各スレッドが測定した性能メトリックをメモリの対応する領域及び親スレッドに対応する領域に記憶し、プロセス完了時にプロファイラがメモリをスキャンして性能メトリックを合計することで、スレッド又はプロセスレベルでの分析を可能とする技術がある。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２０１１−１８０７２５号公報
【特許文献２】特開２００４−２７２５８２号公報
【特許文献３】特開平９−２３７２０３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、プロセスに割り当てるスレッド数を変更することでプロセスの処理時間を均等化することは可能となるが、スレッド数を変更してもプログラムの処理時間が短くならない場合もあり、スレッド数の変更が無駄になるという問題がある。例えば、複数のスレッドにより並列に処理される部分が少ない場合には、スレッド数を変更してもプログラムの処理時間はほとんど短くならない。
【００１０】
本発明は、１つの側面では、プロセスに割り当てるスレッド数の無駄な変更をなくすことを目的とする。
【課題を解決するための手段】
【００１１】
本願の開示する並列計算機は、１つの態様において、複数の計算機と前記複数の計算機を管理する管理装置とを有する。前記管理装置は、第１の判定部と、第２の判定部と、第３の判定部と、第４の判定部と、調整部とを有する。前記第１の判定部は、プロセス毎にスレッド数が割り当てられた複数のプロセスが前記複数の計算機で並列に実行されたときの並列化の度合いを示す並列化率が第１の閾値より大きいか否かを判定する。前記第２の判定部は、前記複数のプロセスが前記複数の計算機で並列に実行されたときにメモリが利用されていた時間の割合を示すメモリビジー率が第２の閾値より小さいか否かを判定する。前記第３の判定部は、プロセス毎の浮動小数点演算数の差を示す演算数差が第３の閾値より大きいか否かを判定する。前記第４の判定部は、プロセス毎の処理時間の差を示す処理時間差が第４の閾値より大きいか否かを判定する。前記調整部は、前記並列化率が前記第１の閾値より大きく、前記メモリビジー率が前記第２の閾値より小さく、前記演算数差が前記第３の閾値より大きく、かつ、前記処理時間差が前記第４の閾値より大きい場合に、各プロセスへ割り当てるスレッド数を調整する。
【発明の効果】
【００１２】
１実施態様によれば、プロセスに割り当てるスレッド数の無駄な変更をなくすことができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、実施例に係る並列計算機によるスレッド数変更処理の流れを示す図である。
【図２】図２は、プロセスに割り当てるスレッド数の変更が有効か否かを判定する方法を説明するための図である。
【図３】図３は、並列化率を説明するための図である。
【図４】図４は、スレッド再割当の一例を示す図である。
【図５】図５は、実施例に係る並列計算機の構成を示す図である。
【図６】図６は、ハードディスク装置が記憶するプログラム及びファイルを示す図である。
【図７】図７は、プロファイル情報から算出された情報の一例を示す図である。
【図８】図８は、再割当プログラムの機能構成を示す図である。
【図９Ａ】図９Ａは、計算機に割り当てるプロセスを変更しない例を示す図である。
【図９Ｂ】図９Ｂは、計算機に割り当てるプロセスを変更する例を示す図である。
【図１０】図１０は、再割当プログラムの処理のフローを示すフローチャートである。
【図１１】図１１は、第１決定部によるスレッド数決定処理のフローを示すフローチャートである。
【図１２】図１２は、第２決定部によるスレッド数決定処理のフローを示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下に、本願の開示する並列計算機、スレッド再割当判定方法及びスレッド再割当判定プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００１５】
まず、実施例に係る並列計算機によるスレッド数変更処理の流れについて説明する。図１は、実施例に係る並列計算機によるスレッド数変更処理の流れを示す図である。図１に示すように、実施例に係る並列計算機は、ソースプログラム２３を入力して翻訳を行い、実行可能バイナリ２４を出力する（ステップＳ１）。
【００１６】
そして、並列計算機は、実行可能バイナリ２４を入力して実行し、プログラムの情報収集を行う（ステップＳ２）。そして、並列計算機は、収集した情報すなわちプロファイル情報を解析してプロセスに割り当てるスレッド数の変更が有効か否かを判定する（ステップＳ３）。
【００１７】
そして、並列計算機は、プロセスに割り当てるスレッド数の変更が有効と判定した場合には、プロセス毎のスレッド数を決定し（ステップＳ４）、ホストファイル２６とスレッド定義ファイル２７を出力する（ステップＳ５）。
【００１８】
ここで、ホストファイル２６は、プロセスを計算機に割り当てるときに使用されるファイルであり、ホストファイル２６を使用しない場合には、並列計算機の割当ポリシーに従ってプロセスが計算機に割り当てられる。スレッド定義ファイル２７は、プロセス毎にスレッド数を指定するとともにスレッドのＣＰＵコアへの割当を指定する場合に使用されるファイルである。スレッド定義ファイル２７を使用しない場合には、プロセス毎のスレッド数はユーザが指定した値になり、並列計算機の割当ポリシーに従ってスレッドがＣＰＵコアに割り当てられる。
【００１９】
このように、実施例に係る並列計算機は、プロファイル情報を解析してプロセスに割り当てるスレッド数の変更が有効か否かを判定し、有効と判定した場合に、プロセスに割り当てるスレッド数の変更を行う。したがって、実施例に係る並列計算機は、プロセスに割り当てるスレッド数の無駄な変更をなくすことができる。
【００２０】
また、実施例に係る並列計算機は、スレッド数の変更にともなって、必要であれば、計算機に割り当てるプロセスの変更及びＣＰＵコアへ割り当てるスレッドの変更を行う。したがって、実施例に係る並列計算機は、スレッド数の変更に適したスレッド割当を行うことができる。
【００２１】
次に、プロセスに割り当てるスレッド数の変更が有効か否かを判定する方法について説明する。図２は、プロセスに割り当てるスレッド数の変更が有効か否かを判定する方法を説明するための図である。
【００２２】
図２に示すように、実施例に係る並列計算機は、実行可能バイナリ２４を実行してプロファイル情報２５を収集する。そして、実施例に係る並列計算機は、プロファイル情報２５から並列化率、メモリビジー率、プロセス毎の浮動小数点演算数及びプロセス毎の処理時間を算出する。
【００２３】
ここで、並列化率は、スレッドが並列で処理を行った割合である。プログラム内でスレッドにより並列処理される部分が多くないとスレッド数を変更しても効果はでないため、並列化率がスレッド数の変更が有効か否かの判定に用いられる。
【００２４】
並列化率は、以下の式で定義される。単位は％である。
並列化率＝１００×全スレッドの並列処理経過時間の合計／（全スレッドの並列処理経過時間の合計＋マスタースレッドの逐次処理経過時間）
【００２５】
全スレッドの並列処理経過時間は、プロセスに割り当てられた複数のスレッドが並列に処理を行った部分で経過した時間である。マスタースレッドの逐次処理経過時間は、プロセスに割り当てられた複数のスレッドのうち１つのスレッドだけが処理を行った部分で経過した時間である。
【００２６】
図３は、並列化率を説明するための図である。図３において、ソースプログラム２３のｄｏループ＃０〜ｄｏループ＃２の部分が複数のスレッドで並列に処理が行われた部分であり、他の部分は１つのスレッドで逐次処理が行われた部分である。全体の処理時間に対する処理時間の割合がｄｏループ＃０では４０％であり、ｄｏループ＃１では３０％であり、ｄｏループ＃２では１０％であるとすると、並列化率は、８０％となる。
【００２７】
メモリビジー率は、メモリアクセスがボトルネックになっていないことを確認するために、スレッド数の変更が有効か否かの判定に用いられる。メモリアクセスがボトルネックになっている場合には、ボトルネックが処理時間を決める要因になるため、スレッド数を変更しても効果が得られない。
【００２８】
浮動小数点演算は負荷の高い演算であり、プロセス毎に浮動小数点演算数に差がないとスレッド数を変更しても効果が得られない。このため、浮動小数点演算数がスレッド数の変更が有効か否かの判定に用いられる。
【００２９】
プロセス毎の処理時間が不均等な場合に、処理時間を均等にすることによって、全体の処理時間を短縮することができる。このため、プロセス毎の処理時間がスレッド数の変更が有効か否かの判定に用いられる。
【００３０】
実施例に係る並列計算機では、再割当プログラム１０が、並列化率、メモリビジー率、プロセス毎の浮動小数点演算数及びプロセス毎の処理時間に基づいて、プロセスに割り当てるスレッド数の変更が有効か否かを判定する。そして、再割当プログラム１０は、有効と判定した場合には、ホストファイル２６及びスレッド定義ファイル２７を出力することで、プロセスに割り当てるスレッド数、計算機に割り当てるプロセスを調整する。
【００３１】
そして、実施例に係る並列計算機は、次に実行可能バイナリ２４を実行するときに、ホストファイル２６及びスレッド定義ファイル２７を入力して実行する。したがって、実施例に係る並列計算機は、プログラムの処理時間を短縮することができる。
【００３２】
図４は、スレッド再割当の一例を示す図である。図４では、プロセス＃０とプロセス＃１で表される２つのプロセスへのスレッド再割当が行われた場合を示す。図４に示すように、再割当前は、プロセス＃０及びプロセス＃１にそれぞれ４つのスレッドが割り当てられ、プロセス＃０とプロセス＃１の処理時間には差がある。一方、再割当後は、プロセス＃０及びプロセス＃１にそれぞれ６つ及び２つのスレッドが割り当てられ、プロセス＃０とプロセス＃１の処理時間が均等化され、処理時間が短縮される。
【００３３】
次に、実施例に係る並列計算機の構成について説明する。図５は、実施例に係る並列計算機の構成を示す図である。図５に示すように、並列計算機１は、複数の計算機２と管理用計算機５とを有する。計算機２は、情報処理を行う装置である。管理用計算機５は、複数の計算機２を管理し、並列計算機１におけるプログラムの実行を管理する計算機である。
【００３４】
計算機２は、ＣＰＵ３と、メモリ４とを有する。ＣＰＵ３は、メモリ４からプログラムを読み出して処理を行う処理装置であり、複数のコア３１とハードウェアモニタ３２とを有する。コア３１は、演算処理を行う装置であり、スレッドに割り当てられるＣＰＵコアである。
【００３５】
ハードウェアモニタ３２は、メモリビジー率と浮動小数点演算数を算出するための情報を収集及び蓄積する装置である。メモリ４は、ＣＰＵ３で実行されるプログラム、プログラム実行の途中結果等を記憶するＲＡＭ（Random  Access  Memory）である。
【００３６】
なお、ここでは説明の便宜上、計算機２が１つのＣＰＵ３を有する場合を示したが、計算機２は、複数のＣＰＵ３を有してもよい。
【００３７】
管理用計算機５は、ＣＰＵ６と、メモリ７と、ハードディスク装置８とを有する。ＣＰＵ６は、メモリ７からプログラムを読み出して処理を行う処理装置である。メモリ７は、ＣＰＵ６で実行されるプログラム、プログラム実行の途中結果等を記憶するＲＡＭである。
【００３８】
ハードディスク装置８は、並列計算機１で実行されるプログラム、並列計算機１で使用されるファイル等を記憶する磁気記憶装置である。図６は、ハードディスク装置８が記憶するプログラム及びファイルを示す図である。図６に示すように、ハードディスク装置８は、コンパイラ２１、ライブラリ２２、再割当プログラム１０、ソースプログラム２３、実行可能バイナリ２４、プロファイル情報２５、ホストファイル２６、スレッド定義ファイル２７を記憶する。
【００３９】
コンパイラ２１は、ソースプログラム２３をコンパイルして実行可能ライブラリ２４を生成する。コンパイラ２１は、計算機２でも管理用計算機５でも実行される。ライブラリ２２は、実行可能バイナリ２４が実行されたときにプロファイル情報２５を収集する機能、プロファイル情報２５から並列化率、メモリビジー率、浮動小数点演算数及び処理時間を算出する機能等を有するプログラムである。
【００４０】
再割当プログラム１０は、並列化率、メモリビジー率、浮動小数点演算数及び処理時間に基づいて、スレッド数の変更が有効か否かを判定し、有効と判定した場合に、ホストファイル２６とスレッド定義ファイル２７を出力する。再割当プログラム１０は、管理用計算機５で実行される。
【００４１】
ソースプログラム２３は、複数の計算機２で並列処理されるプログラムのソースコードである。実行可能バイナリ２４は、ソースプログラム２３からコンパイラ２１によって生成される実行可能プログラムであり、複数の計算機２で並列に実行される。
【００４２】
プロファイル情報２５は、実行可能バイナリ２４が実行されたときに収集される情報であり、ハードウェアモニタ３２又はライブラリ２２によって収集される。プロファイル情報２５から、並列化率、メモリビジー率、プロセス毎の浮動小数点演算数及びプロセス毎の処理時間が算出される。
【００４３】
図７は、プロファイル情報２５から算出された情報の一例を示す図である。図７は、４つのプロセスで並列処理されたプログラムの並列化率、メモリビジー率、プロセス毎の浮動小数点演算数及びプロセス毎の処理時間を示す。図７に示すように、並列化率は、９２％である。メモリビジー率は、４％である。
【００４４】
浮動小数点演算数については、プロセス番号が０であるプロセスは１．１９Ｅ＋１０回すなわち１１９億回であり、プロセス番号が１であるプロセスは２．４６Ｅ＋１０回であり、プロセス番号が２であるプロセスは３．５１Ｅ＋１０回である。プロセス番号が３であるプロセスは２．１９Ｅ＋１０回である。
【００４５】
処理時間については、プロセス番号が０であるプロセスは２２秒であり、プロセス番号が１であるプロセスは４８秒であり、プロセス番号が２であるプロセスは７０秒であり、プロセス番号が３であるプロセスは４４秒である。
【００４６】
ホストファイル２６は、計算機２へのプロセスの割当を記憶するファイルである。スレッド定義ファイル２７は、プロセスに対するスレッド数の割当、スレッドのＣＰＵコアへの割当を記憶するファイルである。
【００４７】
次に、再割当プログラム１０の機能構成について説明する。図８は、再割当プログラム１０の機能構成を示す図である。図８に示すように、再割当プログラム１０は、判定部１１と、スレッド数決定部１２とを有する。
【００４８】
判定部１１は、プロセスへのスレッド数の再割当が有効か否かを判定する。判定部１１は、第１判定部１１ａと、第２判定部１１ｂと、第３判定部１１ｃと、第４判定部１１ｄとを有する。
【００４９】
第１判定部１１ａは、並列化率が第１の閾値より大きいか否かを判定する。第２判定部１１ｂは、メモリビジー率が第２の閾値より小さいか否かを判定する。第３判定部１１ｃは、プロセス毎の浮動小数点演算数の差が第３の閾値より大きいか否かを判定する。ここで、プロセス毎の浮動小数点演算数の差は、最大の浮動小数点演算数と最小の浮動小数点演算数の差である。第４判定部１１ｄは、プロセス毎の処理時間の差が第４の閾値より大きいか否かを判定する。ここで、プロセス毎の処理時間の差は、最大の処理時間と最小の処理時間の差である。
【００５０】
判定部１１は、並列化率が第１の閾値より大きく、メモリビジー率が第２の閾値より小さく、プロセス毎の浮動小数点演算数の差が第３の閾値より大きく、かつ、プロセス毎の処理時間の差が第４の閾値より大きい場合に、スレッド数の再割当が有効と判定する。
【００５１】
スレッド数決定部１２は、判定部１１がスレッド数の再割当が有効と判定した場合に、プロセスへ割り当てるスレッド数を決定する。スレッド数決定部１２は、第１決定部１２ａと、第２決定部１２ｂとを有する。
【００５２】
第１決定部１２ａは、全ての計算機２で実行されるプロセス全体でプロセスの処理時間が均等になるようにプロセス毎のスレッド数を決定する。具体的には、第１決定部１２ａは、「プロセス毎の処理時間」を合計して「プロセス全体の処理時間の合計」を算出する。そして、第１決定部１２ａは、「プロセス毎の処理時間」及び「プロセス全体の処理時間の合計」から「プロセス毎の時間比率」を以下の式に基づいて算出する。
「プロセス毎の時間比率」＝「プロセス毎の処理時間」÷「プロセス全体の処理時間の合計」
【００５３】
そして、第１決定部１２ａは、「使用可能な全ＣＰＵコア数（スレッド数）」と「プロセス毎の時間比率」から「プロセス毎の暫定必要スレッド数」（小数点以下切り捨て）を以下の式に基づいて算出する。
「プロセス毎の暫定必要スレッド数」＝「使用可能な全ＣＰＵコア数」×「プロセス毎の時間比率」
【００５４】
そして、第１決定部１２ａは、「使用可能な全ＣＰＵコア数」と「プロセス毎の暫定必要スレッド数の合計」から「余りスレッド数」を以下の式に基づいて算出する。
「余りスレッド数」＝「使用可能な全ＣＰＵコア数」−「プロセス毎の暫定必要スレッド数の合計」
【００５５】
そして、第１決定部１２ａは、「余りスレッド数」が０の場合には、「プロセス毎の暫定必要スレッド数」を「プロセス毎の必要スレッド数」とする。一方、「余りスレッド数」が０よりも大きい場合には、第１決定部１２ａは、「プロセス毎の暫定必要スレッド数」の算出時の小数点以下の値の大きい順に余りスレッドを割り当てる。もし、最後の１スレッドを割り当てるときに小数点以下の値が同じ場合は、第１決定部１２ａは、「プロセス毎の暫定必要スレッド数」が少ない方に割り当て、それも同じ場合は、プロセス番号が小さい方に割り当てる。そして、第１決定部１２ａは、割り当てたスレッド数を、「プロセス毎の必要スレッド数」とする。
【００５６】
そして、第１決定部１２ａは、計算機２に割り当てたスレッド数の合計が計算機２当たりのＣＰＵコア数と同じ場合は、その計算機２に割り当てるプロセスは、変更しない。図９Ａは、計算機２に割り当てるプロセスを変更しない例を示す図である。図９Ａでは、計算機＃０及び計算機＃１で表される計算機２がそれぞれ８個のコア３１を有する。そして、再割当前は、計算機＃０で動作するプロセス＃００及びプロセス＃０１にそれぞれ４個のスレッドが割り当てられ、計算機＃１で動作するプロセス＃１０及びプロセス＃１１にそれぞれ４個のスレッドが割り当てられている。
【００５７】
そして、スレッド数の再割当後、プロセス＃００には６個のスレッドが割り当てられ、プロセス＃０１には２個のスレッドが割り当てられたとする。この場合、計算機＃０に割り当てられたスレッド数の合計は８で計算機２当たりのＣＰＵコア数と同じである。したがって、第１決定部１２ａは、計算機＃０に割り当てるプロセスは変更しない。また、スレッド数の再割当後、プロセス＃１０には５個のスレッドが割り当てられ、プロセス＃１１には３個のスレッドが割り当てられたとする。この場合、計算機＃１に割り当てられたスレッド数の合計は８で計算機２当たりのＣＰＵコア数と同じである。したがって、第１決定部１２ａは、計算機＃１に割り当てるプロセスは変更しない。
【００５８】
一方、図９Ｂは、計算機２に割り当てるプロセスを変更する例を示す図である。図９Ｂでは、再割当前は、計算機＃０で動作するプロセス＃００及びプロセス＃０１にそれぞれ４個のスレッドが割り当てられ、計算機＃１で動作するプロセス＃１０及びプロセス＃１１にそれぞれ４個のスレッドが割り当てられている。
【００５９】
そして、スレッド数の再割当後、プロセス＃００には６個のスレッドが割り当てられ、プロセス＃０１には４個のスレッドが割り当てられ、プロセス＃１０には４個のスレッドが割り当てられ、プロセス＃１１には２個のスレッドが割り当てられたとする。この場合、計算機＃０に割り当てられたスレッド数の合計は１０で計算機２当たりのＣＰＵコア数を超える。したがって、第１決定部１２ａは、計算機＃０に割り当てるプロセスを変更する。
【００６０】
すなわち、第１決定部１２ａは、計算機＃０にプロセス＃００とプロセス＃１１を割り当て、計算機＃１にプロセス＃１０とプロセス＃０１を割り当て、計算機＃０及び計算機＃１に割り当てられたスレッド数の合計を８とする。
【００６１】
このように、計算機２に割り当てたスレッド数の合計が計算機２当りのＣＰＵコア数と違う計算機２がある場合は、第１決定部１２ａは、計算機２に割り当てるプロセスを再設定する。具体的には、第１決定部１２ａは、「プロセス毎の必要スレッド数」と「プロセス番号」を用いてプロセスのソート（降順）を行う。そして、第１決定部１２ａは、「プロセス毎の必要スレッド数」の合計が「計算機当たりのスレッド数」となるよう、先頭または後尾から順にプロセスの組み合わせを行う。そして、第１決定部１２ａは、全ての計算機２において「プロセス毎の必要スレッド数」の合計が「計算機当たりのスレッド数」となった場合は、処理を終了する。一方、いずれかの計算機２において「プロセス毎の必要スレッド数」の合計が「計算機当たりのスレッド数」とならない場合は、第１決定部１２ａは、プロセス毎のスレッド数を決定することなく、第２決定部１２ｂが、プロセス毎のスレッド数を決定する。
【００６２】
第２決定部１２ｂは、各計算機２で計算機２内のプロセスの処理時間が均等になるようにプロセス毎のスレッド数を決定する。具体的には、第２決定部１２ｂは、計算機２毎に以下を行う。まず、第２決定部１２ｂは、「プロセス毎の処理時間」を合計し、「計算機２内の処理時間の合計」を算出する。そして、第２決定部１２ｂは、「プロセス毎の処理時間」及び「計算機２内の処理時間の合計」から「プロセス毎の時間比率」を算出する。
【００６３】
そして、第２決定部１２ｂは、１計算機２あたりのＣＰＵコア数を基に、「プロセス毎の時間比率」から「プロセス毎の暫定必要スレッド数」（小数点以下切り捨て）を算出する。そして、第２決定部１２ｂは、「１計算機２あたりのＣＰＵコア数」から、「プロセス毎の暫定必要スレッド数」の合計を減算し、「余りスレッド数」を算出する。
【００６４】
そして、第２決定部１２ｂは、「余りスレッド数」が０の場合、「プロセス毎の暫定必要スレッド数」を「プロセス毎の必要スレッド数」とする。一方、「余りスレッド数」が０よりも大きい場合、第２決定部１２ｂは、「プロセス毎の暫定必要スレッド数」の算出時の小数点以下の値の大きい順に余りスレッドを割り当てる。もし、最後の１スレッドを割り当てるときに小数点以下の値が同じ場合は、第２決定部１２ｂは、暫定必要スレッド数が少ない方に割り当て、それも同じ場合は、「プロセス番号」が小さい方に割り当てる。そして、第２決定部１２ｂは、割り当てたスレッド数を、「プロセス毎の必要スレッド数」とする。
【００６５】
次に、再割当プログラム１０の処理のフローについて説明する。図１０は、再割当プログラム１０の処理のフローを示すフローチャートである。図１０に示すように、再割当プログラム１０は、プロファイル情報２５から算出された並列化率、メモリビジー率、浮動小数点演算数及び処理時間を取得する（ステップＳ１１）。
【００６６】
そして、再割当プログラム１０は、並列化率は第１の閾値より大きいか否かを判定し（ステップＳ１２）、大きくない場合には、処理を終了し、大きい場合には、メモリビジー率が第２の閾値より小さいか否かを判定する（ステップＳ１３）。
【００６７】
そして、再割当プログラム１０は、メモリビジー率が第２の閾値より小さくない場合には、処理を終了し、小さい場合には、プロセス毎の浮動小数点演算数の差が第３の閾値より大きいか否かを判定する（ステップＳ１４）。
【００６８】
そして、再割当プログラム１０は、プロセス毎の浮動小数点演算数の差が第３の閾値より大きくない場合には、処理を終了し、大きい場合には、プロセス毎の処理時間の差が第４の閾値より大きいか否かを判定する（ステップＳ１５）。
【００６９】
そして、再割当プログラム１０は、プロセス毎の処理時間の差が第４の閾値より大きくない場合には、処理を終了する。一方、大きい場合には、再割当プログラム１０は、プロセス毎のスレッド数を決定し（ステップＳ１６）、ホストファイル２６とスレッド定義ファイル２７を出力する（ステップＳ１７）。
【００７０】
このように、再割当プログラム１０は、並列化率、メモリビジー率、浮動小数点演算数及び処理時間に基づいてスレッド数の再割当の有効性を判定するので、無駄なスレッド数の変更をなくすことができる。
【００７１】
次に、第１決定部１２ａによるスレッド数決定処理のフローについて説明する。図１１は、第１決定部１２ａによるスレッド数決定処理のフローを示すフローチャートである。図１１に示すように、第１決定部１２ａは、各プロセスの処理時間を取得する（ステップＳ２１）。
【００７２】
そして、第１決定部１２ａは、プロセス全体の処理時間の合計を算出し（ステップＳ２２）、プロセス毎の時間比率を算出する（ステップＳ２３）。そして、第１決定部１２ａは、プロセス毎の暫定必要スレッド数を算出し（ステップＳ２４）、余りスレッド数を算出する（ステップＳ２５）。そして、第１決定部１２ａは、プロセス毎の必要スレッド数を算出し（ステップＳ２６）、プロセスを組み合わせて計算機２に割り当てる（ステップＳ２７）。
【００７３】
このように、第１決定部１２ａは、プロセス全体で処理時間を均等化することで、プログラムの処理時間を短縮することができる。
【００７４】
次に、第２決定部１２ｂによるスレッド数決定処理のフローについて説明する。図１２は、第２決定部１２ｂによるスレッド数決定処理のフローを示すフローチャートである。図１２に示すように、第２決定部１２ｂは、各プロセスの処理時間を取得し（ステップＳ３１）、対象計算機番号に０を設定する（ステップＳ３２）。
【００７５】
そして、第２決定部１２ｂは、対象計算機番号が全計算機数より小さいか否かを判定し（ステップＳ３３）、小さくない場合には、処理を終了し、小さい場合には、対象の計算機２内のプロセスの処理時間の合計を算出する（ステップＳ３４）。
【００７６】
そして、第２決定部１２ｂは、プロセス毎の時間比率を算出し（ステップＳ３５）、プロセス毎の暫定必要スレッド数を算出し（ステップＳ３６）、余りスレッド数を算出する（ステップＳ３７）。そして、第２決定部１２ｂは、プロセス毎の必要スレッド数を算出し（ステップＳ３８）、対象計算機番号に１を加え（ステップＳ３９）、ステップＳ３３へ戻る。
【００７７】
このように、第２決定部１２ｂは、各計算機２内でプロセスの処理時間を均等化することで、プログラムの処理時間を短縮することができる。
【００７８】
上述してきたように、実施例では、第１判定部１１ａが、並列化率が第１の閾値より大きいか否かを判定し、第２判定部１１ｂが、メモリビジー率が第２の閾値より小さいか否かを判定する。そして、第３判定部１１ｃが、プロセス毎の浮動小数点演算数の差が第３の閾値より大きいか否かを判定し、第４判定部１１ｄが、プロセス毎の処理時間の差が第４の閾値より大きいか否かを判定する。そして、判定部１１は、並列化率が第１の閾値より大きく、メモリビジー率が第２の閾値より小さく、プロセス毎の浮動小数点演算数の差が第３の閾値より大きくかつプロセス毎の処理時間の差が第４の閾値より大きい場合に、スレッド数の再割当が有効と判定する。したがって、再割当プログラム１０は、無駄なスレッド数の変更をなくすことができる。
【００７９】
また、実施例では、第１決定部１２ａが、プロセス全体で処理時間を均等化するようにプロセス毎のスレッド数を決定するので、プログラムの処理時間を短縮することができる。
【００８０】
また、実施例では、第２決定部１２ｂが、各計算機２内でプロセスの処理時間を均等化するようにプロセス毎のスレッド数を決定するので、プログラムの処理時間を短縮することができる。
【００８１】
また、実施例では、第１判定部１１ａは、全スレッドの並列処理経過時間の合計／（全スレッドの並列処理経過時間の合計＋マスタースレッドの逐次処理経過時間）に基づいて算出された並列化率を用いる。したがって、第１判定部１１ａは、プログラムの並列性が高いか否かを正確に判定することができる。
【符号の説明】
【００８２】
１    並列計算機
２    計算機
３    ＣＰＵ
４    メモリ
５    管理用計算機
６    ＣＰＵ
７    メモリ
８    ハードディスク装置
１０    再割当プログラム
１１    判定部
１１ａ    第１判定部
１１ｂ    第２判定部
１１ｃ    第３判定部
１１ｄ    第４判定部
１２    スレッド数決定部
１２ａ    第１決定部
１２ｂ    第２決定部
２１    コンパイラ
２２    ライブラリ
２３    ソースプログラム
２４    実行可能バイナリ
２５    プロファイル情報
２６    ホストファイル
２７    スレッド定義ファイル
３１    コア
【図１】
0006435980.tif 000002
【図２】
0006435980.tif 000003
【図３】
0006435980.tif 000004
【図４】
0006435980.tif 000005
【図５】
0006435980.tif 000006
【図６】
0006435980.tif 000007
【図７】
0006435980.tif 000008
【図８】
0006435980.tif 000009
【図９Ａ】
0006435980.tif 000010
【図９Ｂ】
0006435980.tif 000011
【図１０】
0006435980.tif 000012
【図１１】
0006435980.tif 000013
【図１２】
0006435980.tif 000014