(57)【特許請求の範囲】
【請求項１】
プログラムをスレッドに分割し、前記スレッドそれぞれをＣＰＵ（Central Processing Unit）を構成するコアに割り当てて前記プログラムを実行するプログラム実行装置であって、
任意の前記コアに任意の前記スレッドを割り当てて前記プログラムの処理を行う通常処理の実行時に所定の周期で収集される、前記プログラムに記述されている変数の処理開始時刻と、その変数の処理がキャッシュヒットしたことを示すキャッシュヒット情報と、を関連付けて記憶しているとともに、前記ＣＰＵのコア数と、キャッシュヒットの効果の判定に用いる閾値とを記憶している記憶部と、
（１）前記変数の中の第１の変数の前記処理開始時刻およびその第１の変数の次に処理される第２の変数の前記処理開始時刻を読み出して差分を算出し、収集された回数分の前記差分の平均値を算出し、その算出した平均値を第１の処理時間とし、
（２）前記変数の中の、前記キャッシュヒット情報が関連付けられた前記第１の変数の前記処理開始時刻および当該第１の変数の次に処理される第２の変数の前記処理開始時刻を読み出して差分を算出し、収集された回数分の前記差分の平均値を算出し、その算出した平均値を第２の処理時間とし、
（３）前記第１の処理時間を前記第２の処理時間で除算して、独立化判定値を算出し、
（４）前記独立化判定値が前記第１の変数の処理に用いるスレッド数を示す前記閾値より大きいか否かを判定し、その判定結果において大きいという判定の場合に、前記第１の変数の前記処理時間を前記第２の処理時間とし、その判定結果において否という判定の場合に、前記第１の変数の前記処理時間を前記第１の処理時間とし、
（５）前記（１）〜前記（４）の処理を前記プログラムの変数について実行し、
（６）前記ＣＰＵのコア数を、前記通常処理の実行時の前記プログラムの前記変数について前記第１の処理時間を合計した合計値で除算し、その値を第１のスループット係数とし、
（７）前記ＣＰＵの１つのコアに、前記第２の処理時間を処理時間とする１つの前記変数の処理を実行させるように割り当てたときのスループットを、コア数の１を分子とし、前記第２の処理時間と当該変数の処理から次の処理までの待ち時間との合算値を分母とする第１の除算値を算出し、前記ＣＰＵのコア数から前記第２の処理時間を処理時間とする前記変数の数を減算して、その減算値を分子とし、前記プログラムの前記変数の中から前記第２の処理時間とならなかった前記変数の前記第１の処理時間と当該変数の処理の次の処理までの待ち時間との合計値を分母とする第２の除算値を算出し、前記第１の除算値および前記第２の除算値の中で最も小さい値を第２のスループット係数とし、
（８）前記第２のスループット係数が前記第１のスループット係数より大きい場合、前記第２の処理時間を処理時間とする前記変数を処理するスレッドを固定の前記コアに割り当てることを示したコア割当情報を生成する解析部と、
前記解析部によって生成された前記コア割当情報に基づいて、前記第２の処理時間を処理時間とする前記変数を処理するスレッドを固定の前記コアに割り当てて、前記プログラムを実行する実行部と
を備えることを特徴とするプログラム実行装置。
【請求項２】
前記記憶部は、前記ＣＰＵのコアのキャッシュサイズと、前記通常処理実行時に所定の周期で収集される、前記変数の、配列長、前記通常処理実行時に格納されるメモリのアドレス、およびデータサイズと、キャッシュヒット率の第２の閾値と、をさらに記憶しており、
前記解析部は、
前記変数について、前記記憶部から前記アドレスを読み出して異なるアドレスの数を集計した前記異なるアドレスの数と、前記記憶部から読み出した前記キャッシュサイズ、前記配列長、および前記データサイズとをパラメータとして、前記異なるアドレスの数の減少、前記配列長の減少、前記データサイズの減少、前記キャッシュサイズの増大、にしたがって大きな値となる前記キャッシュヒット率を算出する算出手段と、
前記キャッシュヒット率が前記記憶部に記憶している前記第２の閾値より大きいか否かを判定する判定手段と、
をさらに備え、
前記解析部は、
前記判定手段において前記キャッシュヒット率が前記第２の閾値より大きいと判定された場合、当該変数を、前記（１）および前記（２）の処理に用いる前記第１の変数として、前記（１）〜前記（８）の処理を実行する
ことを特徴とする請求項１に記載のプログラム実行装置。
【請求項３】
プログラムをスレッドに分割し、前記スレッドそれぞれをＣＰＵを構成するコアに割り当てて前記プログラムを実行するプログラム実行装置において用いられるプログラム実行方法であって、
前記プログラム実行装置は、
任意の前記コアに任意の前記スレッドを割り当てて前記プログラムの処理を行う通常処理の実行時に所定の周期で収集される、前記プログラムに記述されている変数の処理開始時刻と、その変数の処理がキャッシュヒットしたことを示すキャッシュヒット情報と、を関連付けて記憶しているとともに、前記ＣＰＵのコア数と、キャッシュヒットの効果の判定に用いる閾値とを記憶している記憶部と、解析部と、実行部と、を備え、
前記解析部は、
（１）前記変数の中の第１の変数の前記処理開始時刻およびその第１の変数の次に処理される第２の変数の前記処理開始時刻を読み出して差分を算出し、収集された回数分の前記差分の平均値を算出し、その算出した平均値を第１の処理時間とするステップ、
（２）前記変数の中の、前記キャッシュヒット情報が関連付けられた前記第１の変数の前記処理開始時刻および当該第１の変数の次に処理される第２の変数の前記処理開始時刻を読み出して差分を算出し、収集された回数分の前記差分の平均値を算出し、その算出した平均値を第２の処理時間とするステップ、
（３）前記第１の処理時間を前記第２の処理時間で除算して、独立化判定値を算出するステップ、
（４）前記独立化判定値が前記第１の変数の処理に用いるスレッド数を示す前記閾値より大きいか否かを判定し、その判定結果において大きいという判定の場合に、前記第１の変数の前記処理時間を前記第２の処理時間とし、その判定結果において否という判定の場合に、前記第１の変数の前記処理時間を前記第１の処理時間とするステップ、
（５）前記（１）〜前記（４）の処理を前記プログラムの変数について実行するステップ、
（６）前記ＣＰＵのコア数を、前記通常処理の実行時の前記プログラムの前記変数について前記第１の処理時間を合計した合計値で除算し、その値を第１のスループット係数とするステップ、
（７）前記ＣＰＵの１つのコアに、前記第２の処理時間を処理時間とする１つの前記変数の処理を実行させるように割り当てたときのスループットを、コア数の１を分子とし、前記第２の処理時間と当該変数の処理から次の処理までの待ち時間との合算値を分母とする第１の除算値を算出し、前記ＣＰＵのコア数から前記第２の処理時間を処理時間とする前記変数の数を減算して、その減算値を分子とし、前記プログラムの前記変数の中から前記第２の処理時間とならなかった前記変数の前記第１の処理時間と当該変数の処理の次の処理までの待ち時間との合計値を分母とする第２の除算値を算出し、前記第１の除算値および前記第２の除算値の中で最も小さい値を第２のスループット係数とするステップ、
（８）前記第２のスループット係数が前記第１のスループット係数より大きい場合、前記第２の処理時間を処理時間とする前記変数を処理するスレッドを固定の前記コアに割り当てることを示したコア割当情報を生成するステップ、
を実行し、
前記実行部は、
前記解析部によって生成された前記コア割当情報に基づいて、前記第２の処理時間を処理時間とする前記変数を処理するスレッドを固定の前記コアに割り当てて、前記プログラムを実行するステップ
を実行することを特徴とするプログラム実行方法。
【請求項４】
前記プログラム実行装置は、
前記ＣＰＵのコアのキャッシュサイズと、前記通常処理実行時に所定の周期で収集される、前記変数の、配列長、前記通常処理実行時に格納されるメモリのアドレス、およびデータサイズと、キャッシュヒット率の第２の閾値と、をさらに記憶している前記記憶部を備え、
前記解析部は、
前記変数について、前記記憶部から前記アドレスを読み出して異なるアドレスの数を集計した前記異なるアドレスの数と、前記記憶部から読み出した前記キャッシュサイズ、前記配列長、および前記データサイズとをパラメータとして、前記異なるアドレスの数の減少、前記配列長の減少、前記データサイズの減少、前記キャッシュサイズの増大、にしたがって大きな値となるキャッシュヒット率を算出する算出ステップ、
前記キャッシュヒット率が前記記憶部に記憶している前記第２の閾値より大きいか否かを判定する判定ステップ、
前記判定ステップにおいて前記キャッシュヒット率が前記第２の閾値より大きいと判定された場合、当該変数を、前記（１）および前記（２）の処理に用いる前記第１の変数として、前記（１）〜前記（８）の処理を実行するステップ
を実行することを特徴とする請求項３に記載のプログラム実行方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサの処理速度を向上する技術に関する。
【背景技術】
【０００２】
特許文献１には、マルチコアプロセッサにおける処理速度の向上を目的として、キャッシュミスを防ぐために、マルチコアプロセッサのどのコアにどのスレッドをどのタイミングで動作させるかをスケジューリングする技術が開示されている。具体的には、Ｌ２（Level 2）キャッシュ内に既に格納されているデータを再利用可能なように、スレッドを以前動作したコアで割り当てるスケジューリングを行うことによって、データをロードする時間を削減し高速化を実現する技術である。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０００−１４８５１８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、１つのスレッドが処理中に扱うデータのバリエーション（データアドレス、データのサイズ、データのビットパターン等の相違のこと）が多く、かつ、それらのデータが均等に処理に使用される場合には、データがキャッシュアウトした（データがキャッシュ上に存在しない）状態になるケースがほとんどである。また、特定のスレッド単独で見ればデータのバリエーションが少なく、キャッシュヒット率が高くなり得る場合であっても、同一コアで動作する他のスレッドが使用するデータのバリエーションが大きい場合には、他のスレッドのデータがＬ２キャッシュ内で支配的になり、単独ならばキャッシュヒット率が高いデータがキャッシュアウトした状態になる可能性が高い。つまり、特許文献１に記載の技術では、プロセッサの処理速度の向上を確実には望めないケースがあるといった問題がある。
【０００５】
また、プロセッサの処理効率向上のため、並行動作可能な処理をスレッド群として複数のコアで並行動作させることも考えられるが、この場合、バリエーションが少なく、本来キャッシュヒット率が高くなり得るデータであっても、複数のコアでスレッドが動作するが故に、同じアドレスのデータを複数のコア間で参照し合い、結果的にデータロードの時間を多く必要としてしまう可能性がある。このように、複数のコアのキャッシュ上に同じアドレスのキャッシュデータが存在してしまうと、キャッシュコヒーレンシ（複数のキャッシュに格納されている同一のデータの一貫性）を保つためのオーバヘッドが大きくなるため、プロセッサの処理速度の向上を損ねる原因となる。
【０００６】
そこで、本発明は、前記した問題を解決し、プロセッサの処理速度を向上する技術を提供することを課題とする。
【課題を解決するための手段】
【０００７】
本発明は、プログラムをスレッドに分割し、前記スレッドそれぞれをＣＰＵ（Central Processing Unit）を構成するコアに割り当てて前記プログラムを実行するプログラム実行装置であって、任意の前記コアに任意の前記スレッドを割り当てて前記プログラムの処理を行う通常処理の実行時に所定の周期で収集される、前記プログラムに記述されている変数の処理開始時刻と、その変数の処理がキャッシュヒットしたことを示すキャッシュヒット情報と、を関連付けて記憶しているとともに、前記ＣＰＵのコア数と、キャッシュヒットの効果の判定に用いる閾値とを記憶している記憶部と、（１）前記変数の中の第１の変数の前記処理開始時刻およびその第１の変数の次に処理される第２の変数の前記処理開始時刻を読み出して差分を算出し、収集された回数分の前記差分の平均値を算出し、その算出した平均値を第１の処理時間とし、（２）前記変数の中の、前記キャッシュヒット情報が関連付けられた前記第１の変数の前記処理開始時刻および当該第１の変数の次に処理される第２の変数の前記処理開始時刻を読み出して差分を算出し、収集された回数分の前記差分の平均値を算出し、その算出した平均値を第２の処理時間とし、（３）前記第１の処理時間を前記第２の処理時間で除算して、独立化判定値を算出し、（４）前記独立化判定値が前記第１の変数の処理に用いるスレッド数を示す前記閾値より大きいか否かを判定し、その判定結果において大きいという判定の場合に、前記第１の変数の前記処理時間を前記第２の処理時間とし、その判定結果において否という判定の場合に、前記第１の変数の前記処理時間を前記第１の処理時間とし、（５）前記（１）〜前記（４）の処理を前記プログラムの変数について実行し、（６）前記ＣＰＵのコア数を、前記通常処理の実行時の前記プログラムの前記変数について前記第１の処理時間を合計した合計値で除算し、その値を第１のスループット係数とし、（７）前記ＣＰＵの１つのコアに、前記第２の処理時間を処理時間とする１つの前記変数の処理を実行させるように割り当てたときのスループットを、コア数の１を分子とし、前記第２の処理時間と当該変数の処理から次の処理までの待ち時間との合算値を分母とする第１の除算値を算出し、前記ＣＰＵのコア数から前記第２の処理時間を処理時間とする前記変数の数を減算して、その減算値を分子とし、前記プログラムの前記変数の中から前記第２の処理時間とならなかった前記変数の前記第１の処理時間と当該変数の処理の次の処理までの待ち時間との合計値を分母とする第２の除算値を算出し、前記第１の除算値および前記第２の除算値の中で最も小さい値を第２のスループット係数とし、（８）前記第２のスループット係数が前記第１のスループット係数より大きい場合、前記第２の処理時間を処理時間とする前記変数を処理するスレッドを固定の前記コアに割り当てることを示したコア割当情報を生成する解析部と、前記解析部によって生成された前記コア割当情報に基づいて、前記第２の処理時間を処理時間とする前記変数を処理するスレッドを固定の前記コアに割り当てて、前記プログラムを実行する実行部とを備えることを特徴とする。
【０００８】
また、本発明は、プログラムをスレッドに分割し、前記スレッドそれぞれをＣＰＵを構成するコアに割り当てて前記プログラムを実行するプログラム実行装置において用いられるプログラム実行方法であって、前記プログラム実行装置が、任意の前記コアに任意の前記スレッドを割り当てて前記プログラムの処理を行う通常処理の実行時に所定の周期で収集される、前記プログラムに記述されている変数の処理開始時刻と、その変数の処理がキャッシュヒットしたことを示すキャッシュヒット情報と、を関連付けて記憶しているとともに、前記ＣＰＵのコア数と、キャッシュヒットの効果の判定に用いる閾値とを記憶している記憶部と、解析部と、実行部と、を備え、前記解析部が、（１）前記変数の中の第１の変数の前記処理開始時刻およびその第１の変数の次に処理される第２の変数の前記処理開始時刻を読み出して差分を算出し、収集された回数分の前記差分の平均値を算出し、その算出した平均値を第１の処理時間とするステップ、（２）前記変数の中の、前記キャッシュヒット情報が関連付けられた前記第１の変数の前記処理開始時刻および当該第１の変数の次に処理される第２の変数の前記処理開始時刻を読み出して差分を算出し、収集された回数分の前記差分の平均値を算出し、その算出した平均値を第２の処理時間とするステップ、（３）前記第１の処理時間を前記第２の処理時間で除算して、独立化判定値を算出するステップ、（４）前記独立化判定値が前記第１の変数の処理に用いるスレッド数を示す前記閾値より大きいか否かを判定し、その判定結果において大きいという判定の場合に、前記第１の変数の前記処理時間を前記第２の処理時間とし、その判定結果において否という判定の場合に、前記第１の変数の前記処理時間を前記第１の処理時間とするステップ、（５）前記（１）〜前記（４）の処理を前記プログラムの変数について実行するステップ、（６）前記ＣＰＵのコア数を、前記通常処理の実行時の前記プログラムの前記変数について前記第１の処理時間を合計した合計値で除算し、その値を第１のスループット係数とするステップ、（７）前記ＣＰＵの１つのコアに、前記第２の処理時間を処理時間とする１つの前記変数の処理を実行させるように割り当てたときのスループットを、コア数の１を分子とし、前記第２の処理時間と当該変数の処理から次の処理までの待ち時間との合算値を分母とする第１の除算値を算出し、前記ＣＰＵのコア数から前記第２の処理時間を処理時間とする前記変数の数を減算して、その減算値を分子とし、前記プログラムの前記変数の中から前記第２の処理時間とならなかった前記変数の前記第１の処理時間と当該変数の処理の次の処理までの待ち時間との合計値を分母とする第２の除算値を算出し、前記第１の除算値および前記第２の除算値の中で最も小さい値を第２のスループット係数とするステップ、（８）前記第２のスループット係数が前記第１のスループット係数より大きい場合、前記第２の処理時間を処理時間とする前記変数を処理するスレッドを固定の前記コアに割り当てることを示したコア割当情報を生成するステップ、を実行し、前記実行部が、前記解析部によって生成された前記コア割当情報に基づいて、前記第２の処理時間を処理時間とする前記変数を処理するスレッドを固定の前記コアに割り当てて、前記プログラムを実行するステップを実行することを特徴とする。
【０００９】
このような構成によれば、実測した値を用いて前記（１）〜（８）の処理を実行して変数のバリエーションを考慮した上で、キャッシュヒットによる効果が明らかな変数の処理のためのスレッドを特定している。例えば、前記（１）〜（５）の処理では、処理速度の向上のために、キャッシュヒットすることの効果の判定指標として、独立化判定値を算出している。そして、前記（６）〜（８）の処理では、独立化判定値によってキャッシュヒットすることの効果があると判定されたケースについて、スループット係数を算出して、前記効果を検証している。そして、前記検証結果に基づいて、そのスレッドを固定のコアに割り当てることができる。すなわち、変数のバリエーションを考慮しつつ、プロセッサの処理速度を向上することができる。
【００１０】
本発明は、前記記憶部が、前記ＣＰＵのコアのキャッシュサイズと、前記通常処理実行時に所定の周期で収集される、前記変数の、配列長、前記通常処理実行時に格納されるメモリのアドレス、およびデータサイズと、キャッシュヒット率の第２の閾値と、をさらに記憶しており、前記解析部が、前記変数について、前記記憶部から前記アドレスを読み出して異なるアドレスの数を集計した前記異なるアドレスの数と、前記記憶部から読み出した前記キャッシュサイズ、前記配列長、および前記データサイズとをパラメータとして、前記異なるアドレスの数の減少、前記配列長の減少、前記データサイズの減少、前記キャッシュサイズの増大、にしたがって大きな値となる前記キャッシュヒット率を算出する算出手段と、前記キャッシュヒット率が前記記憶部に記憶している前記第２の閾値より大きいか否かを判定する判定手段と、をさらに備え、前記解析部が、前記判定手段において前記キャッシュヒット率が前記第２の閾値より大きいと判定された場合、当該変数を、前記（１）および前記（２）の処理に用いる前記第１の変数として、前記（１）〜前記（８）の処理を実行することを特徴とする。
【００１１】
また、本発明は、前記プログラム実行装置が、前記ＣＰＵのコアのキャッシュサイズと、前記通常処理実行時に所定の周期で収集される、前記変数の、配列長、前記通常処理実行時に格納されるメモリのアドレス、およびデータサイズと、キャッシュヒット率の第２の閾値と、をさらに記憶している前記記憶部を備え、前記解析部が、前記変数について、前記記憶部から前記アドレスを読み出して異なるアドレスの数を集計した前記異なるアドレスの数と、前記記憶部から読み出した前記キャッシュサイズ、前記配列長、および前記データサイズとをパラメータとして、前記異なるアドレスの数の減少、前記配列長の減少、前記データサイズの減少、前記キャッシュサイズの増大、にしたがって大きな値となるキャッシュヒット率を算出する算出ステップ、前記キャッシュヒット率が前記記憶部に記憶している前記第２の閾値より大きいか否かを判定する判定ステップ、前記判定ステップにおいて前記キャッシュヒット率が前記第２の閾値より大きいと判定された場合、当該変数を、前記（１）および前記（２）の処理に用いる前記第１の変数として、前記（１）〜前記（８）の処理を実行するステップを実行することを特徴とする。
【００１２】
このような構成によれば、キャッシュヒット率に基づいて、前記（１）〜前記（８）の処理に用いる変数の候補を大まかに絞ることができる。したがって、特定のコアにスレッドを割り当て実行する変数を決定するために掛かる時間を短縮することができるので、短時間でプロセッサの処理速度の向上を図ることができる。
【発明の効果】
【００１３】
本発明によれば、プロセッサの処理速度を向上する技術を提供することができる。
【図面の簡単な説明】
【００１４】
【図１】本実施形態における高速処理システムの構成例を示す図である。
【図２】高速処理システムの処理シーケンス例を示す図である。
【図３】プログラム解析の例およびデータの解析例を示す図である。
【図４】高速処理システムの解析部における処理フロー例を示す図である。
【図５】独立化処理するか否かの判定例を示す図である。
【図６】本実施形態において、スレッドのコア割り当ての例を示す図である。
【図７】高速処理システムの適用例を示す図である。
【発明を実施するための形態】
【００１５】
本発明を実施するための形態（以降、「本実施形態」と称す。）におけるプログラム実行装置は、プロセッサ上でのソフトウェアの処理速度を向上させるために、バリエーションが少ないデータを扱うスレッドを決定し、そのスレッドをマルチコアプロセッサのコアに固定的に割り当てつつ、パイプライン状（後記）に並列処理する構成を備えている。以下に、それらの構成および処理フローについて、適宜図面を参照しながら詳細に説明する。
【００１６】
本実施形態におけるプログラム実行装置の構成について、図１を用いて説明する。
図１に示すように、プログラム実行装置１０は、ネットワーク２０内に配置され、ネットワーク２０に接続しているＰＣ（Personal Computer）等の端末３０（３０Ａ，３０Ｂ，３０Ｃ）との間で、情報を送受信可能になっている。プログラム実行装置１０は、端末３０からデプロイされたプログラムに基づいて、その処理動作が決定される。なお、プログラム実行装置１０は、例えば、汎用コンピュータ、サーバ、ルータ等である。
プログラム実行装置１０は、端末３０Ｃからデプロイされたプログラムを受信し、そのプログラムを動作させて、端末３０Ａから受信したデータに処理を施し、端末３０Ｂに処理後の処理データを送信する。
なお、図１では、端末３０を３台しか記載していないが、４台以上がネットワーク２０に接続していても構わない。
【００１７】
次に、プログラム実行装置１０の構成例について説明する。
図１に示すように、プログラム実行装置１０は、入力部１１、実行部１２、出力部１３、解析部１４、記憶部１５、および受付部１６を備える。プログラム実行装置１０は、図示しないＣＰＵおよびメインメモリによって構成される処理部（不図示）とアプリケーションプログラム等を記憶する記憶部１５とで構成される。処理部は、記憶部１５に記憶されているアプリケーションプログラムをメインメモリに展開して、実行部１２および解析部１４を具現化する。
【００１８】
入力部１１は、通信インタフェースであり、端末３０から処理用のデータを含むデータ情報を受信する。
実行部１２は、解析部１４によって生成されたプログラムのスレッドを記憶部１５から取得して、その取得したスレッドを実行し、入力部１１を介して取得したデータに対して、処理を実行する。
出力部１３は、通信インタフェースであり、端末３０へ処理結果をデータとして含むデータ情報を送信する。
【００１９】
解析部１４は、端末３０からデプロイされたプログラムをスレッドに分割するコンパイル処理を実行し、その分割したスレッド（分割プログラム）を記憶部１５に記憶する。また、解析部１４は、スレッドを、どのようにコアに割り当てるかを決定する処理を実行し、その割り当てに関するコア割当情報（後記）を記憶部１５に記憶する。
受付部１６は、通信インタフェースであり、端末３０からデプロイされたプログラムを含むプログラム情報を受信する。なお、受付部１６は、ネットワーク２０を介さずに、端末３０Ｃに通信ケーブルを介して直接接続するインタフェースであっても構わない。
記憶部１５は、解析部１４によって処理された結果等を記憶している。
【００２０】
次に、プログラム実行装置１０の処理シーケンス例について、図２を用いて説明する（適宜、図１参照）。
ステップＳ２０１では、端末３０Ｃが、プログラム実行装置１０に実行させるプログラムをプログラム実行装置１０へデプロイ（送信）し、受付部１６がそのプログラムを受け付ける。なお、プログラムは、逐次処理用のプログラムであっても構わない。
ステップＳ２０２では、受付部１６が、記憶部１５に受け付けたプログラムを記憶する。
ステップＳ２０３では、解析部１４が、記憶部１５からプログラムを取得する。この取得のタイミングは、例えば、新しくプログラムが記憶されたタイミングとする。
ステップＳ２０４では、解析部１４が、コンパイラレベルの解析を実行する。具体的には、解析部１４は、プログラムをコンパイルし、スレッドに分割した分割プログラムを生成する。
ステップＳ２０５では、解析部１４は、解析結果（分割プログラム）を記憶部１５に記憶する。
【００２１】
ステップＳ２０６では、実行部１２が、記憶部１５から、分割プログラムを取得する。この取得のタイミングは、例えば、新しく解析結果が記憶されたタイミングとする。そして、実行部１２は、分割プログラムに基づいて、太線に示すように、通常処理（逐次処理）を実行状態にする。
ステップＳ２０７では、端末３０Ａが、データを含むデータ情報をプログラム実行装置１０へ送信し、入力部１１がそのデータ情報を受け付ける。
ステップＳ２０８では、実行部１２が、入力部１１を介してデータを取得する。
ステップＳ２０９では、実行部１２が、取得したデータに対して、通常処理（逐次処理）を実行する。
ステップＳ２１０〜Ｓ２１１では、実行部１２が、出力部１３を介して、処理結果を含むデータ情報を端末３０Ｂへ出力する。
【００２２】
ステップＳ２１２では、実行部１２が、予め設定された周期ごとに、通常処理によって処理したデータの処理経過状況および処理開始時刻を、解析用データとして収集し、記憶部１５に記憶する。処理経過状況とは、例えば、プログラムに記述されている関数の引数（変数）のデータサイズ、その変数が格納されたメモリ上のアドレス等である。例えば変数が配列になっている場合は、配列長×各要素のデータサイズが、変数としてのデータサイズになる。処理開始時刻とは、例えば、その変数について処理が開始された時刻である。
ステップＳ２１３では、解析部１４が、記憶部１５に記憶された解析用データを取得する。
ステップＳ２１４では、解析部１４が、記憶部１５に記憶されている解析用データを読み出して、解析する。この解析によって、高速処理を実施できるか否かを判定し、高速処理を実施できると判定した場合に、どのスレッドをコアに占有して割り当てるかを表すコア割当情報を作成する。なお、解析部１４は、高速処理を実施できないと判定した場合には、コア割当情報を作成しない。
【００２３】
ステップＳ２１５では、解析部１４が、ステップＳ２１４において作成したコア割当情報を記憶部１５に記憶する。なお、解析部１４は、高速処理を実施できないと判定した場合に、既に記憶部１５にコア割当情報が記憶されているとき、当該コア割当情報を消去する。
ステップＳ２１６では、実行部１２が、記憶部１５から、コア割当情報を取得する。そして、実行部１２は、当該コア割当情報に基づいて、太い点線に示すように、高速処理（コア占有処理）を実行状態にする。なお、記憶部１５にコア割当情報が記憶されていない場合には、高速処理（コア占有処理）は実行状態とならず、通常処理（逐次処理）を継続することになる。
【００２４】
ステップＳ２１７では、端末３０Ａが、データを含むデータ情報をプログラム実行装置１０へ送信し、入力部１１がそのデータ情報を受け付ける。
ステップＳ２１８では、実行部１２が、入力部１１を介してデータを取得する。
ステップＳ２１９では、実行部１２が、取得したデータに対して、高速処理（コア占有処理）を実行する。
ステップＳ２２０〜Ｓ２２１では、実行部１２が、出力部１３を介して、処理結果を含むデータ情報を端末３０Ｂへ出力する。
【００２５】
なお、ステップＳ２１４における解析部１４は、記憶部１５から、少なくとも繰返し２回以上の解析用データを取得した上で、その解析用データに対して統計処理を施して平均値を算出する等の前処理を行った後、解析を行うことが好ましい。
【００２６】
ここで、図２のステップＳ２１２において、実行部１２が解析用データを収集する方法の一例について、図３を用いて説明する。
図３の左側は、プログラムの一例を示している。ただし、プログラム言語は、限定されなくてもよい。プログラム中の実行文および変数に対して、処理経過状況および処理開始時刻を収集する動作を有する指定子（図３では、analyzeと表している。）が付加される。そして、実行部１２は、この指定子に基づいて、プログラムに記述されている関数の変数のデータサイズ(変数が配列の場合は配列長×各要素のデータサイズ)、その変数が格納されたアドレス、および処理開始時刻を予め設定された周期で収集する。
【００２７】
図３の右側は、収集結果の例を示している。本実施形態では、配列（例えば、a0，a1等）の要素数や木の葉数（例えば、tree0，tree1等）が計測可能なデータ構造を収集対象としているが、これに限られることはなく、規模が計測可能なものであれば、他の要素であっても構わない。なお、以降の説明では、木構造は配列で表現することができるので、木と配列とを区別せずに、配列と表記することにする。
図３に示すように、配列の配列長（配列の要素の数）、配列の各要素のデータサイズ、キャッシュヒット（ｈｉｔと表示）であったか、キャッシュミス（ｍｉｓｓと表示）であったか、処理開始時刻、通常処理（逐次処理）の中で呼び出しているアドレス、および配列のデータサイズを集計対象としている。
【００２８】
次に、図２のステップＳ２１４における解析部１４の処理フローについて、図４を用いて説明する（適宜、図２，３参照）。
ステップＳ４０１では、解析部１４は、記憶部１５に記憶されている解析用データを取得する。そして、解析部１４は、解析用データに統計処理を施して、解析用データのうち異なるアドレスの数（Ｋと表記）を集計し、配列長の平均値（Ｌと表記）、各要素のデータサイズの平均値（Ｅと表記）を算出する。また、解析部１４は、プログラム実行装置１０のシステム情報（不図示）等から、コアのキャッシュサイズＣを取得する。
【００２９】
ステップＳ４０２では、解析部１４は、キャッシュヒット係数Ｐ（＝（１／Ｋ＋１／Ｌ）×Ｃ／Ｅ）を算出する。ここで、キャッシュヒット係数Ｐの特性について、以下に説明する。例えば、キャッシュヒット係数Ｐは、Ｋが大きい場合、すなわち、演算するたびに毎回異なるアドレスとなる場合には、スレッドが使用するアドレス領域が広いため、Ｌ２キャッシュにヒットする確率も小さくなると考えられ、値として小さくなるように見積もる。また、キャッシュヒット係数Ｐは、Ｌが大きい場合に関しても、該当箇所の処理が扱うデータがＬ２キャッシュに入りきらない可能性が高くなるため、値として小さくなるように見積もる。また同様に、キャッシュヒット係数Ｐは、Ｅが大きい場合にも、該当箇所の処理が扱うデータがＬ２キャッシュに入りきらない可能性が高くなるため、値として小さくなるように見積もる。また、キャッシュヒット係数Ｐは、Ｃが大きいほど、該当箇所の処理が扱うデータのＬ２キャッシュに入りきる可能性が高くなるため、値として大きくなるように見積もる。すなわち、キャッシュヒット係数Ｐを用いることで、スレッド処理化した際にキャッシュに収まり得るデータを扱う処理箇所の候補を、大まかに抽出することができる。
【００３０】
ステップＳ４０３では、解析部１４は、キャッシュヒット係数Ｐが予め設定してある閾値Ｔｈ０（第２の閾値）より大きいか否かを判定する。なお、閾値Ｔｈ０（第２の閾値）は、独立化処理を分類するための閾値であり、記憶部１５に記憶されている。
そして、Ｐが閾値Ｔｈ０（第２の閾値）より大きい場合（ステップＳ４０３でＹｅｓ）には、ステップＳ４０４では、解析部１４は、その指定子の振られた処理を独立化処理（コアに占有して割り当てて実行する処理）の候補に設定する。
また、Ｐが閾値Ｔｈ０（第２の閾値）以下の場合（ステップＳ４０３でＮｏ）には、処理はステップＳ４１３へ進む。
このステップＳ４０１〜Ｓ４０４の処理は、独立化処理のスレッドを確定するための前処理であって、独立化処理に当てはまらないものを大まかに振るい落とす効果がある。すなわち、独立化処理のスレッドを確定するためのステップＳ４０５以降の処理時間を短縮する効果もある。したがって、変数が少ない場合等には、ステップＳ４０１〜Ｓ４０４の処理を省略することも可能である。
【００３１】
ステップＳ４０５では、解析部１４は、独立化処理の候補について、記憶部１５に記憶している解析用データ中から処理開始時刻を読み出して、独立化判定値Ｆを算出する。ただし、Ｆ＝通常処理時の処理時間Ｍ／キャッシュヒット時の処理時間Ｈである。
ここで、その処理の具体例について、図５を用いて説明する。
【００３２】
図５（ａ）の上段は、通常処理における指定子の振られた処理［ａ１］の処理時間を表している。すなわち、処理［ａ１］の処理開始時刻（＝１０１００１）から処理［ａ２］の処理開始時刻（＝１０１２５０）までの時間を、通常処理における指定子の振られた処理時間（Ｍ）として表す。図５（ａ）では、そのＭの値は「２４９」である。なお、Ｍの値は、キャッシュヒットおよびキャッシュミスのいずれであっても区別せずに、統計処理によって算出される。例えば、Ｍの値は、平均値である。
次に、図５（ａ）の下段は、キャッシュヒットした場合の処理［ａ１］の処理時間を表している。すなわち、処理［ａ１］の処理開始時刻（＝３１８７４１）から処理［ａ２］の処理開始時刻（＝３１８８０６）までの時間を、キャッシュヒットした場合の処理時間（Ｈ）として表す。図５（ａ）では、そのＨの値は「５５」である。なお、Ｈの値は、キャッシュヒットした場合の処理時間のみを対象として、統計処理によって算出される。例えば、Ｈの値は、平均値である。
そして、図５（ａ）のケースでは、独立化判定値Ｆは、Ｍ／Ｈ＝２４９／５５＝４．５３として求まる。
【００３３】
また、図５（ｂ）の上段は、通常処理における指定子の振られた処理［ａ２］の処理時間を表している。すなわち、処理［ａ２］の処理開始時刻（＝１０１２５０）から処理［ａ３］の処理開始時刻（＝１０１５１０）までの時間を、通常処理における指定子の振られた処理時間（Ｍ）として表す。図５（ｂ）では、そのＭの値は「２６０」である。
次に、図５（ｂ）の下段は、キャッシュヒットした場合の処理［ａ２］の処理時間を表している。すなわち、処理［ａ２］の処理開始時刻（＝３１８８０６）から処理［ａ３］の処理開始時刻（＝３１８８４６）までの時間を、キャッシュヒットした場合の処理時間（Ｈ）として表す。図５（ｂ）では、そのＨの値は「４０」である。
そして、図５（ｂ）のケースでは、独立化判定値Ｆは、Ｍ／Ｈ＝２６０／４０＝６．５として求まる。
【００３４】
図４へ戻って、ステップＳ４０６では、解析部１４は、独立化処理の候補の処理に含まれるスレッド数を閾値として、独立化判定値Ｆが、当該閾値より大きいか否かを判定する。なお、この閾値は、ステップＳ２０４のコンパイラレベルの解析において算出され、ステップＳ２０５の解析結果（分割プログラム）とともに記憶部１５に記憶される。
例えば、図５に示す例において、閾値が５である場合には、図５（ａ）の場合は、独立化判定値Ｆ＝４．５３＜閾値（＝５）であるので、独立化処理にしないと判定する。また、図５（ｂ）の場合は、独立化判定値Ｆ＝６．５＞閾値（＝５）であるので、独立化処理にすると判定する。
すなわち、この判定では、独立化判定値Ｆ＝閾値の場合は、元の並列度倍の高速化となることを意味している。そして、独立化判定値Ｆ＞閾値の場合であれば、独立化処理の候補は、１コアで捌ききることができ、コアを占有させる効果（処理速度の向上）を期待できる。
【００３５】
ステップＳ４０６において、独立化判定値Ｆが閾値以下の場合（ステップＳ４０６でＮｏ）、処理はステップＳ４１３へ進む。
また、独立化判定値Ｆが閾値より大きい場合（ステップＳ４０６でＮｏ）、ステップＳ４０７では、解析部１４は、当該候補を独立化処理に確定する。なお、独立化判定値Ｆが閾値より大きい場合は、確定した独立化処理におけるスレッドは、キャッシュ内に収まり得るデータを扱う高速処理可能なスレッドとなっている。
【００３６】
ステップＳ４０８では、解析部１４は、独立化処理が連続、かつＰが予め設定された所定の閾値(Ｔｈ１)より小さいか、またはそうでないかを判定する。なお、閾値（Ｔｈ１）は、独立化処理を連結するか否かの判定に用いる閾値であり、記憶部１５に記憶されている。
独立化処理が連続しており、かつＰが予め設定された所定の閾値(Ｔｈ１)より小さいと判定された場合（ステップＳ４０８でＹｅｓ）、ステップＳ４０９では、解析部１４は、連続する独立化処理を１つの独立化処理にまとめる。閾値(Ｔｈ１)に充分小さい値を設定した場合、その閾値(Ｔｈ１)より小さくなるということは、１つのコアにおけるＬ２キャッシュのサイズで領域が余り得ることを示唆している。したがって、このような独立化領域が連続する限り分割をせずに1つのスレッドとする。このような処理を行うことで、スレッドの粒度を大きくすることによって、パイプライン処理（後記）で発生し得るデメリットを低減できるようになる。すなわち、パイプライン処理において、処理間でのデータの入出力の調整のために設けられるキューにおける待ち時間を小さくすることができる。つまり、処理速度を向上させることができる。
また、ステップＳ４０８でＮｏの場合、処理は、ステップＳ４０９をスキップして、ステップＳ４１０へ進む。
【００３７】
ステップＳ４１０では、解析部１４は、独立化処理について、スループット係数ＴＨを算出する。
スループット係数ＴＨの算出の具体例について、図６を用いて説明する。なお、図６の例では、プロセッサのコアが１６であるとし、１コアに１スレッドを割り当てるものとする。
図６の上段は、通常処理（１６スレッド使用）における処理時間と、コア占有処理の場合における処理時間とを示している。なお、コア占有処理とは、ＣＰＵのコアを、独立化処理を占有的に配置する領域と、それ以外の領域とに分けてスレッドを割り当てるようにしたものである。例えば、図６の左下の図のように、１つの独立化処理を、１つの占有コア（斜め線を付したコア）に固定的に配置する。そして、それ以外の処理は、通常処理の分割スレッド用コアの領域（斜め線を付していないコア）に、特に制限なくスレッド配置するものとする。また、コア占有処理を用いる場合には、独立化処理と通常処理（分割スレッド処理）とが混在するため、図６中の右下に示す、パイプライン状に分割された処理が実行される。
【００３８】
このパイプライン状の処理は、分割したスレッドごとに、独立に次々に処理を実行していくため、並列処理を実行することができ、処理速度を向上させることができる。例えば、公知例（Matt Welsh, etal.,「SEDA:An Architecture for Well-Conditioned, Scalable Internet Services」,SOSP2001, October, 2001）に開示されている方法を用いて行うことができる。そこで、本実施形態では、コア占有処理を実行する場合に、図６に示すように、パイプライン状の処理を適用する。
【００３９】
図６に示すように、指定子の振られた処理ｂ０，ｂ１，ｂ２，ｂ３，ｂ４について、通常処理における処理時間は、それぞれ、８０，９０，８０，１００である。それに対して、コア占有処理における処理時間は、独立化処理スレッド０および独立化処理スレッド２をそれぞれ占有コアに割り当てて処理を行うことを想定した場合、接続遅延（処理間でのデータの入出力の調整のための待ち時間）を５と仮定すると、それぞれ５，５，９０，５，５，５，１００である。なお、独立化処理スレッドの処理時間には、キャッシュヒットした場合の処理時間を用いる。
ここで、スループット係数ＴＨは、コア数Ｃと、処理時間の合計Ｔとを用いて、コア数Ｃを処理時間の合計Ｔで除算する演算によって算出することができる。なお、コア数Ｃは、記憶部１５に記憶されている。
通常処理の場合のスループット係数ＴＨは、Ｃ／Ｔ＝（１６−０）／（８０＋９０＋８０＋１００）＝０．０４６となる。また、コア占有処理の場合のスループット係数ＴＨは、Ｃ／Ｔ＝ｍｉｎ{１／(５（スレッド０）＋５（接続遅延）)＝０．１，１／(５（スレッド２）＋５（接続遅延）)＝０．１，（１６−２）／(９０（スレッド１）＋５（接続遅延）＋１００（スレッド３）)＝０．０７２}＝０．０７２となる。ただし、ｍｉｎは、最小値を選択する関数である。この関数は、コア割り当てをした際に最もボトルネックとなる箇所が、最終的なスループットとなることを決定している。この例では、コア占有側ではない方でボトルネックが発生していることが分かる。
【００４０】
図４へ戻って、ステップＳ４１１では、解析部１４は、コア占有処理のスループット係数ＴＨが通常処理のスループット係数ＴＨより大きいか否かを判定する。
コア占有処理のスループット係数ＴＨが通常処理のスループット係数ＴＨより大きい場合（ステップＳ４１１でＹｅｓ）、ステップＳ４１２では、解析部１４は、コア占有処理（高速処理）のために、前記したコア割当情報を記憶部１５に記憶する。
また、コア占有処理のスループット係数ＴＨが通常処理のスループット係数ＴＨ以下の場合（ステップＳ４１１でＮｏ）、ステップＳ４１３では、解析部１４は、通常処理のために、コア割当情報を記憶部１５から消去する。なお、ステップＳ４１３において、記憶部１５にコア割当情報が記憶されていない状態であれば、解析部１４は、消去処理を行わない。
【００４１】
以上、本実施形態で説明したプログラム実行装置１０は、プロセッサの処理速度を向上させるように、スレッドを固定的に特定のコア（占有コア）に割り当てて実行させる独立化処理を決定する解析部１４を備えている。具体的には、解析部１４は、図４のステップＳ４０３において、キャッシュヒット係数Ｐを算出して、閾値と比較し、独立化処理の候補を絞る。解析部１４は、図４のステップＳ４０６では、独立化判定値Ｆを算出して、閾値と比較し、候補の中から独立化処理を確定する。図４のステップＳ４１１では、解析部１４は、スループット係数ＴＨを算出して、コア占有処理の方が通常処理よりスループット係数ＴＨが大きい場合に、コア占有処理を実行させるためのコア割当情報を作成する。そして、実行部１２は、そのコア割当情報に基づいて、コア割当処理（高速処理）を実行する。したがって、本実施形態におけるプログラム実行装置１０は、処理速度を向上させることができる。また、パイプライン状の処理を用いることによって、分割したスレッドごとに、独立に次々に処理を実行していくため、処理を並列に実行することができ、さらに処理速度を向上させることができる。
【００４２】
ここで、プログラム実行装置１０を呼処理に適用した例について、図７を用いて説明する。
図７に示すように、サーバまたはルータ５０がネットワーク２０内に配置されている。サーバまたはルータ５０は、ネットワーク２０に接続している端末３０Ａから接続要求を受け付けて、呼処理を行って、接続先の端末３０Ｂに接続要求を送信する。
図７では、サーバまたはルータ５０は、負荷分散装置４０と２台以上のプログラム実行装置１０とを備え、プログラム実行装置１０同士が並列に呼処理を実行する構成を備えている。なお、ネットワーク２０の管理者が操作する管理端末３１は、プログラム実行装置１０に対して、プログラムをデプロイするために用いられる。そして、プログラム実行装置１０は、デプロイされたプログラムに対して、前記した通常処理および高速処理を実行する。
【００４３】
なお、従来の呼処理のプログラムは、一般的に繰返し演算が少なく、逐次処理用に生成されている。したがって、呼処理は、スレッドがキャッシュヒットしたかどうかによって、処理速度が大きく異なっていた。それに対して、管理者等によってデプロイされたプログラムをプログラム実行装置１０に適用することによって、安定して高速処理を実現させることができる。また、２台以上のプログラム実行装置１０に対して、それぞれ担当する処理を決めておいて、それぞれのプログラム実行装置１０に跨ってパイプライン状に並列処理させることによって、分散かつ並列度を高めることができ、処理速度を向上させることができる。
【符号の説明】
【００４４】
１０  プログラム実行装置
１２  実行部
１４  解析部
１５  記憶部
Ｅ    データサイズ
Ｆ    独立化判定値
Ｈ    キャッシュヒット時の処理時間
Ｋ    異なるアドレスの数
Ｌ    配列長
Ｍ    通常処理時の処理時間
Ｐ    キャッシュヒット係数
ＴＨ  スループット係数
Ｔｈ０  閾値（第２の閾値）
Ｔｈ１  閾値
【図１】
0005379765.tif 000002
【図２】
0005379765.tif 000003
【図３】
0005379765.tif 000004
【図４】
0005379765.tif 000005
【図５】
0005379765.tif 000006
【図６】
0005379765.tif 000007
【図７】
0005379765.tif 000008