(57)【特許請求の範囲】
【請求項１】
マルチコアＣＰＵが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出する検出部と、
前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように設定された第１の記憶領域と、
前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報が記憶された第２の記憶領域と、
前記検出部により検出された切り替え対象となるスレッドで呼び出された関数に含まれる命令を、該切り替え対象となるスレッドで今後実行されることが推定される命令として推定し、前記第１の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定すると共に、前記第２の記憶領域を参照して、特定した前記関数に含まれる前記命令の位置情報を特定する、特定部と、
前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える書換部と、
を含む演算装置。
【請求項２】
前記第２の記憶領域には、前記各関数に含まれる命令のうち、分岐命令の位置情報が記憶される請求項１記載の演算装置。
【請求項３】
前記検出部は、前記スレッドの各々の実行状態として、該スレッドがコアを占有している時間を取得し、前記コアを占有している時間が予め定めた閾値以上となるスレッドを、前記切り替え対象となるスレッドとして検出する請求項１または請求項２記載の演算装置。
【請求項４】
実行されているスレッドの各々に対してコアが割り当てられた時刻が記憶された第３の記憶領域をさらに含み、
前記検出部は、前記第３の記憶領域に記憶された時刻を参照して、前記スレッドがコアを占有している時間を取得する
請求項３記載の演算装置。
【請求項５】
前記書換部は、前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるためのスケジューラを呼び出す命令に書き換える請求項１〜請求項４のいずれか１項記載の演算装置。
【請求項６】
マルチコアＣＰＵが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように第１の記憶領域を設定し、
前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報を第２の記憶領域に記憶し、
検出された切り替え対象となるスレッドで呼び出された関数に含まれる命令を、該切り替え対象となるスレッドで今後実行されることが推定される命令として推定し、前記第１の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定すると共に、前記第２の記憶領域を参照して、特定した前記関数に含まれる前記命令の位置情報を特定し、
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
ことを含む処理を演算装置に実行させるスレッド切替方法。
【請求項７】
マルチコアＣＰＵが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように第１の記憶領域を設定し、
前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報を第２の記憶領域に記憶し、
検出された切り替え対象となるスレッドで呼び出された関数に含まれる命令を、該切り替え対象となるスレッドで今後実行されることが推定される命令として推定し、前記第１の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定すると共に、前記第２の記憶領域を参照して、特定した前記関数に含まれる前記命令の位置情報を特定し、
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
ことを含む処理を演算装置に実行させるためのマルチスレッドプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
開示の技術は、演算装置、スレッド切替方法、及びマルチスレッドプログラムに関する。
【背景技術】
【０００２】
従来、複数のスレッドを切り替えながらプログラムを実行するマルチスレッディングに関する技術として、タイムアウトレジスタを有するマルチスレッド式プロセッサが提案されている。このマルチスレッド式プロセッサでは、アクティブ・スレッドの実行がプログラム可能な時間期間を超える時にスレッド切り替えが強制される。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特表２００１−５２１２１６号公報
【特許文献２】特表２００１−５２１２１５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
マルチスレッディングにおいて、Ｉ／Ｏ処理などにより暇になるＣＰＵ資源を最大限活用するための手法であり、各スレッドあたりの処理が比較的少ない軽量スレッド（ＬＷＴ：Light Weight Thread）を実行させる方法がある。ＬＷＴでは、ハードウェアで同時に実行可能なスレッド数よりも遥かに多いスレッドを生成し、実行されるスレッドを切り換えながら高多重に処理を進めるため、スレッドの切り替え頻度が高い。
【０００５】
従来技術のように、タイムアウト時に割り込みを発生させる手法は、スレッドの切り替えに時間がかかる。特に、スレッドの切り替え頻度が高いＬＷＴでは、プログラムの実行時間全体に対して、スレッドの切り替え時間が重い負荷となる。
【０００６】
開示の技術は、一つの側面として、マルチスレッディングにおけるスレッドの切り替え時間を短縮することを目的とする。
【課題を解決するための手段】
【０００７】
開示の技術は、一つの態様として、マルチコアＣＰＵが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理に関する。開示の技術は、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出する検出部を備える。また、開示の技術は、前記検出部により検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定する特定部を備える。さらに、開示の技術は、前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える書換部を備える。
【発明の効果】
【０００８】
一つの側面として、マルチスレッディングにおけるスレッドの切り替え時間を短縮することができる、という効果を有する。
【図面の簡単な説明】
【０００９】
【図１】マルチスレッディングにおけるスレッドの切り替えを説明するための図である。
【図２】割り込み処理を利用したスレッドの切り替えを説明するための図である。
【図３】第１実施形態に係るマルチスレッド処理装置の概略構成を示すブロック図である。
【図４】第１実施形態に係るマルチスレッド処理装置として機能するコンピュータの概略構成を示すブロック図である。
【図５】監視処理の一例を示すフローチャートである。
【図６】検出部での処理を説明するための図である。
【図７】特定部での処理を説明するための図である。
【図８】書換部での処理を説明するための図である。
【図９】スケジューラの呼び出しを説明するための図である。
【図１０】切替処理の一例を示すフローチャートである。
【図１１】ディスパッチ部での処理を説明するための図である。
【図１２】第２実施形態に係るマルチスレッド処理装置の概略構成を示すブロック図である。
【図１３】第２実施形態の変形例に係るマルチスレッド処理装置の概略構成を示すブロッ
【発明を実施するための形態】
【００１０】
以下、図面を参照して、開示の技術に関する実施形態の一例を詳細に説明する。
【００１１】
まず、実施形態の詳細を説明する前に、軽量スレッド（ＬＷＴ：Light Weight Thread）によるプログラムの実行、及びＬＷＴにおけるスレッド切り替えの問題点について説明する。
【００１２】
例えば、マルチコアＣＰＵによりＬＷＴを実行させる場合、ＬＷＴでは、コア数よりも遥かに多いスレッドを生成し、各コアで実行されるスレッドを切り替えながらプログラムを実行する。例えば、図１に示すように、あるコアでスレッドＡが実行されており、スレッドＢ、スレッドＣ、・・・が実行待ちであるとする。スレッドＡにおいて、Ｉ／Ｏ処理が発生するなどして、コアがメモリやディスクでの処理待ち状態となる場合がある。この場合、このコアを有効活用するために、そのコアにおけるスレッドＡの実行を停止し、そのコアを実行待ちのスレッドのいずれか（図１の例では、スレッドＢ）に割り当てる。
【００１３】
ここで、例えば、スレッドＡがあるコアを長時間占有して実行されている場合には、他の実行待ちのスレッドの実行が滞ってしまうため、強制的にスレッドを切り替える必要がある。このような場合のスレッドの切り替え方法としては、図２に示すように、タイマで設定された所定タイミングなどで割り込み信号を発生させ、強制的にスレッドを切り替える方法が考えられる。この方法では、例えば、以下の手順により、スレッドの切り替えが実現される。
【００１４】
１．割り込み信号を受信したコアが、割り込みハンドラを呼び出し
２．割り込みハンドラが、スレッドＡのコンテキストをコンテキスト保存領域に保存
３．割り込みハンドラが、スケジューラを呼び出すためのシグナルを生成
４．割り込みハンドラが、生成したシグナルを送出して、スケジューラを呼び出し
５．スケジューラが、次に実行するスレッドを決定し（スレッドＢ）、ディスパッチャが、スレッドＢのコンテキストをコンテキスト保存領域から読み出し
６．ディスパッチャが、読み出したコンテキストをコアに設定
【００１５】
これにより、対象のコアにおいて、スレッドＢが実行される。すなわち、対象のコアにおいて実行されるスレッドが、スレッドＡからスレッドＢに切り替わる。
【００１６】
しかし、割り込み処理によるスレッドの切り替えは、上記のように手順が多く、時間がかかる。ＬＷＴは、スレッド切り替え頻度が高いため、スレッドの切り替えに多くの時間を要すると、ＬＷＴにより実行されるプログラム全体の性能が低下する。
【００１７】
そこで、以下の各実施形態では、コアを長時間占有して実行されているスレッドで今後実行される命令箇所を、スケジューラ呼出命令に書き換えることで、スレッド切り替えの手順を少なくし、スレッド切り替え時間の短縮を図る。以下、各実施形態について詳述する。以下の各実施形態では、マルチコアＣＰＵを実装したコンピュータにおいて、ＬＷＴによるマルチスレッディングでアプリケーションプログラムを実行する場合に、開示の技術を適用した例について説明する。
【００１８】
＜第１実施形態＞
図３に示すように、第１実施形態に係るマルチスレッド処理装置１０は、監視部２０と、スケジューラ３０とを含む。
【００１９】
スケジューラ３０は、ＬＷＴ用に最適化されたスケジューラであり、実行されるスレッドと同じプロセス内でメモリを切り替えることなく呼び出せるユーザレベルのスケジューラである。スケジューラ３０は、コンテキスト保存部３１と、実行スレッド決定部３２と、ディスパッチ部３３とを含む。
【００２０】
コンテキスト保存部３１は、スケジューラ３０を呼び出した対象のコアで実行されているスレッド（実行中スレッド５１）のコンテキストを保存する。具体的には、コンテキスト保存部３１は、対象のコアのレジスタに記憶されたデータをスタック領域に保存する。また、コンテキスト保存部３１は、対象のコアのスタックポインタレジスタに記憶されたスタックポインタを専用の保存領域に保存する。
【００２１】
実行スレッド決定部３２は、コンテキスト保存領域に保存された実行待ちのスレッドのコンテキスト５２を参照して、次に実行するスレッドを決定する。具体的な決定方法は、実行されるアプリケーションプログラムによる。なお、コンテキスト保存領域とは、上記のスタック領域及びスタックポインタが保存された専用の保存領域である。
【００２２】
ディスパッチ部３３は、実行スレッド決定部３２で決定されたスレッドに対象のコアをディスパッチする。具体的には、ディスパッチ部３３は、決定されたスレッドのコンテキストをコンテキスト保存領域から読み出し、対象のコアにセットする。より具体的には、ディスパッチ部３３は、決定されたスレッドについて、専用の保存領域に記憶されたスタックポインタを読み出し、対象のコアのスタックポインタレジスタにセットする。また、ディスパッチ部３３は、決定されたスレッドについてスタック領域に記憶されたデータを読み出して、対象のコアのレジスタにセットする。
【００２３】
また、ディスパッチ部３３は、現在実行中のスレッドに対してコアがディスパッチされた時刻を記録するディスパッチ時刻テーブル４１に、決定されたスレッドに対象のコアをディスパッチした時刻を記録する。ディスパッチ時刻テーブル４１は、メモリ領域の所定の記憶領域（第３の記憶領域）に保存される。
【００２４】
監視部２０は、アプリケーションプログラムを実行するコアとは別に、専用のコアで実行される機能部である。監視部２０は、検出部２１と、特定部２２と、書換部２３とを含む。なお、監視部２０は、開示の技術の演算装置の一例である。
【００２５】
検出部２１は、ディスパッチ時刻テーブル４１を常時又は十分短い周期で繰り返し参照し、ディスパッチ時刻テーブル４１に記録された時刻と現在時刻との差が、規定時間以上となるスレッドを、長時間コアを占有しているスレッドとして検出する。検出部２１は、検出したスレッドを、実行待ちの他のスレッドへ切り替える対象となる切り替え対象スレッドとして、特定部２２に通知する。
【００２６】
特定部２２は、検出部２１から通知された切り替え対象スレッドで実行中又は過去に実行された命令に基づいて、切り替え対象スレッドで今後実行される命令を推定し、推定した命令が保存されているメモリ領域のアドレスを特定する。
【００２７】
ここで、実行中のアプリケーションプログラムでは、アプリケーションプログラムに含まれる関数の呼び出し命令の実行前又は実行後に、実行中関数アドレス４２を第１の記憶領域に保存する。実行中関数アドレス４２とは、実行中のスレッドにおいて直近で呼び出された関数が保存されているメモリ領域のアドレスである。アプリケーションプログラムのコンパイル時に、実行中関数アドレス４２を第１の記憶領域に保存するように設定することができる。また、アプリケーションプログラムのコンパイル時に、アプリケーションプログラムに含まれる各関数に含まれる分岐命令が保存されているメモリ領域のアドレスが取得される。取得された分岐命令のアドレスは、その分岐命令を含む関数のアドレスに対応付けて、分岐命令アドレステーブル４３として、メモリ領域の第２の記憶領域に保存される。
【００２８】
そこで、特定部２２は、第１の記憶領域に保存された実行中関数アドレス４２を参照して、切り替え対象スレッドで呼び出された関数のアドレスを特定する。また、特定部２２は、第２の記憶領域に保存された分岐命令アドレステーブル４３を参照して、特定した関数に含まれる分岐命令のアドレスを特定する。特定部２２は、特定した分岐命令のアドレスを、書換部２３に通知する。
【００２９】
なお、切り替え対象スレッドで今後実行される命令として分岐命令を特定するのは、分岐命令により処理がループしていることにより、切り替え対象スレッドがコアを長時間占有する結果になっているとの考えに基づく。分岐命令により処理がループしている場合には、再びその分岐命令が実行される可能性が高いため、今後実行される命令として、分岐命令を推定するものである。ただし、特定した関数に含まれる命令であれば、切り替え対象スレッドで今後実行される可能性はあるため、分岐命令以外の命令を切り替え対象スレッドで今後実行される命令として特定してもよい。また、上記のように、処理のループを想定して切り替え対象スレッドで今後実行される命令を推定するため、分岐命令の中でもループエンドに限定して特定するようにしてもよい。
【００３０】
書換部２３は、特定部２２により特定された分岐命令のアドレスに基づいて、メモリ領域において特定された分岐命令が保存されている箇所を、スケジューラ３０の呼び出し命令に書き換える。特定部２２で複数の分岐命令のアドレスが特定されている場合には、書換部２３は、特定された全ての分岐命令を書き換えてもよいし、特定された一部の分岐命令を書き換えてもよい。一部の分岐命令を書き換える場合は、例えば、特定された分岐命令のうち、実行順が後ろの方から順に所定個の分岐命令を書き換えることができる。実行順が前の方の分岐命令は、既に実行中のスレッドにおいて実行済みである可能性があり、実行順が後ろの方が、今後実行される分岐命令である可能性が高いからである。
【００３１】
マルチスレッド処理装置１０は、例えば、図４に示すコンピュータ６０で実現することができる。コンピュータ６０は、複数のコア６１０、６１１、・・・を有するＣＰＵ６１、一時記憶領域としてのメモリ６２、及び不揮発性の記憶部６３を備える。また、コンピュータ６０は、表示装置及び入力装置等の入出力装置６８が接続される入出力インターフェース（Ｉ／Ｆ）６４を備える。また、コンピュータ６０は、記録媒体６９に対するデータの読み込みと書き込みとを制御するｒｅａｄ／ｗｒｉｔｅ（Ｒ／Ｗ）部６５、及びインターネット等のネットワークに接続されるネットワークＩ／Ｆ６６を備える。ＣＰＵ６１、メモリ６２、記憶部６３、入出力Ｉ／Ｆ６４、Ｒ／Ｗ部６５、及びネットワークＩ／Ｆ６６は、バス６７を介して互いに接続される。
【００３２】
記憶部６３は、ＨＤＤ（Hard Disk Drive）、ＳＳＤ（solid state drive）、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部６３には、コンピュータ６０をマルチスレッド処理装置１０として機能させるためのマルチスレッドプログラム７０が記憶される。
【００３３】
マルチスレッドプログラム７０は、ＣＰＵ６１のいずれかのコアを監視部２０として機能させるための監視プログラム７１を含む。また、マルチスレッドプログラム７０は、ＣＰＵ６１のいずれかのコアをスケジューラ３０として機能させるための切替プログラム７２と、アプリケーションプログラム７３とを含む。本実施形態では、監視部２０として機能するコアをコア６１０、アプリケーションプログラムを実行し、かつスケジューラ３０として機能するコアを６１１とする。
【００３４】
コア６１０は、監視プログラム７１を記憶部６３から読み出してメモリ６２に展開し、監視プログラム７１が有するプロセスを順次実行する。また、コア６１１は、アプリケーションプログラム７３を記憶部６３から読み出してメモリ６２に展開し、アプリケーションプログラム７３が有するプロセスを順次実行する。また、コア６１１は、切替プログラム７２を記憶部６３から読み出してメモリ６２に展開し、アプリケーションプログラム７３が有するプロセスを順次実行する。
【００３５】
監視プログラム７１は、検出プロセス７１Ａと、特定プロセス７１Ｂと、書換プロセス７１Ｃとを有する。コア６１０は、検出プロセス７１Ａを実行することで、図３に示す検出部２１として動作する。また、コア６１０は、特定プロセス７１Ｂを実行することで、図３に示す特定部２２として動作する。また、コア６１０は、書換プロセス７１Ｃを実行することで、図３に示す書換部２３として動作する。
【００３６】
切替プログラム７２は、コンテキスト保存プロセス７２Ａと、実行スレッド決定プロセス７２Ｂと、ディスパッチプロセス７２Ｃとを有する。コア６１１は、コンテキスト保存プロセス７２Ａを実行することで、図３に示すコンテキスト保存部３１として動作する。また、コア６１１は、実行スレッド決定プロセス７２Ｂを実行することで、図３に示す実行スレッド決定部３２として動作する。また、コア６１１は、ディスパッチプロセス７２Ｃを実行することで、図３に示すディスパッチ部３３として動作する。
【００３７】
また、上述した実行待ちスレッドのコンテキスト５２を保存するコンテキスト保存領域がメモリ６２に設けられる。また、ディスパッチ時刻テーブル４１が保存される第３の記憶領域、実行中関数アドレス４２が保存される第１の記憶領域、及び分岐命令アドレステーブル４３が保存される第２の記憶領域もメモリ６２に設けられる。
【００３８】
これにより、マルチスレッドプログラム７０を実行したコンピュータ６０が、マルチスレッド処理装置１０として機能することになる。
【００３９】
なお、マルチスレッドプログラム７０により実現される機能は、例えば半導体集積回路、より詳しくはＡＳＩＣ（Application Specific Integrated Circuit）等で実現することも可能である。
【００４０】
次に、第１実施形態に係るマルチスレッド処理装置１０の作用について説明する。マルチスレッド処理装置１０において、アプリケーションプログラム７３の実行が開始されると、監視部２０が図５に示す監視処理を実行する。なお、監視処理は、開示の技術のスレッド切替方法の一例である。
【００４１】
図５に示す監視処理のステップＳ１１で、検出部２１は、図６に示すように、第３の記憶領域６２３に記憶されたディスパッチ時刻テーブル４１を常時又は十分短い周期で繰り返し参照する。なお、ディスパッチ時刻テーブル４１には、後述する切替処理において、スケジューラ３０のディスパッチ部３３により、実行中のスレッドにコアがディスパッチされた時刻が保存されている。また、図６に示すディスパッチ時刻テーブル４１では、「コア」、「スレッド」、及び「ディスパッチ時刻」の項目を含む例を示しているが、この例に限定されず、実行中のスレッドにコアがディスパッチされてからの時間を把握可能な形態であればよい。検出部２１は、ディスパッチ時刻テーブル４１に記録されたディスパッチ時刻と現在時刻との差、すなわち、各スレッドにコアがディスパッチされてからの時間を取得する。
【００４２】
次に、ステップＳ１２で、検出部２１が、コアを長時間占有しているスレッドが存在するか否かを判定する。上記ステップＳ１１で取得した時間が予め定めた規定時間以上となるスレッドが存在する場合には、検出部２１が、該当のスレッドを切り替え対象スレッドとして検出し、特定部２２に通知して、処理はステップＳ１３へ移行する。コアを長時間占有しているスレッドが存在しない場合には、処理はステップＳ１１に戻る。
【００４３】
ステップＳ１３では、特定部２２が、図７に示すように、第１の記憶領域６２１に保存された実行中関数アドレス４２を参照して、検出部２１から通知された切り替え対象スレッドで呼び出された関数のアドレスを取得する。第１の記憶領域６２１には、アプリケーションプログラム７３のコンパイル時に、実行中のスレッドにおいて直近で呼び出された関数のアドレスが保存されるよう設定されている。
【００４４】
次に、ステップＳ１４で、特定部２２が、第２の記憶領域６２２に保存された分岐命令アドレステーブル４３において、上記ステップＳ１３で取得した関数のアドレスに対応付けられている分岐命令のアドレスを全て取得する。特定部２２は、取得した分岐命令のアドレスを、書換部２３に通知する。
【００４５】
次に、ステップＳ１５で、書換部２３が、図８に示すように、特定部２２から通知された分岐命令のアドレスに基づいて、メモリ領域において特定された分岐命令が保存されている箇所を、スケジューラ３０の呼び出し命令に書き換える。そして、監視処理はステップＳ１１に戻る。
【００４６】
切り替え対象スレッドにおいて、上記監視処理のステップＳ１５で書き換えられたスケジューラ３０の呼び出し命令が実行されると、図９に示すように、実行中のスレッドから、直接スケジューラ３０が呼び出される。そして、スケジューラ３０が、図１０に示す切替処理を実行する。
【００４７】
図１０に示す切替処理のステップＳ２１で、コンテキスト保存部３１が、切り替え対象スレッドを実行している対象のコアのレジスタに記憶されたデータをスタック領域に保存する。次に、ステップＳ２２で、コンテキスト保存部３１が、対象のコアのスタックポインタレジスタに記憶されたスタックポインタを専用の保存領域に保存する。
【００４８】
次に、ステップＳ２３で、実行スレッド決定部３２が、コンテキスト保存領域に保存された実行待ちのスレッドのコンテキスト５２を参照して、次に実行するスレッドを決定する。
【００４９】
次に、ステップＳ２４で、ディスパッチ部３３が、実行スレッド決定部３２で決定されたスレッドについて、専用の保存領域に記憶されたスタックポインタを読み出し、対象のコアのスタックポインタレジスタにセットする。次に、ステップＳ２５で、ディスパッチ部３３が、決定されたスレッドについてスタック領域に記憶されたデータを読み出して、対象のコアのレジスタにセットする。
【００５０】
次に、ステップＳ２６で、ディスパッチ部３３が、図１１に示すように、第３の記憶領域６２３に記憶されたディスパッチ時刻テーブル４１に、決定されたスレッドに対象のコアをディスパッチした時刻として、現在時刻を記録する。そして、切替処理は終了する。
【００５１】
以上説明したように、第１実施形態に係るマルチスレッド処理装置１０によれば、長時間コアを占有しているスレッドで今後実行される命令箇所を、スケジューラ呼び出し命令に書き換える。そして、書き換えられた命令が実行されることにより、切り替え対象のスレッドから直接スケジューラを呼び出すことができる。これにより、割り込み処理によりスレッドの切り替えを実行する場合に比べ、スレッド切り替えのための処理が少ないため、マルチスレッディングにおけるスレッド切り替え時間を短縮することができる。
【００５２】
＜第２実施形態＞
次に、第２実施形態について説明する。第２実施形態では、切り替え対象スレッドで今後実行される命令の特定方法が、第１実施形態と異なる。なお、第２実施形態に係るマルチスレッド処理装置について、第１実施形態に係るマルチスレッド処理装置１０と同様の部分については、同一符号を付して、詳細な説明を省略する。
【００５３】
図１２に示すように、第２実施形態に係るマルチスレッド処理装置２１０は、監視部２２０と、スケジューラ３０とを含む。監視部２２０は、検出部２１と、特定部２２２と、書換部２３とを含む。
【００５４】
ここで、第２実施形態におけるマルチスレッド処理装置２１０では、マルチコアＣＰＵが有する各コアは、図１２に示すように、ハードウェア構成として、ＬＢＲ（Last Branch Record）用レジスタ９１と、ＰＥＢＳ（Precise Event Based Sampling）機能部９２と、ＰＥＢＳ用カウンタ９３とを含む。ＬＢＲ用レジスタ９１には、該当のコアで実行中のスレッドで直近に実行された分岐命令のアドレスが、ＬＢＲ機能により取得され、保存される。ＰＥＢＳ機能部９２は、ハードウェア領域に記憶された情報を取り出し、ソフトウェア領域で参照可能にする機能部である。ＰＥＢＳ用カウンタ９３は、ＰＥＢＳ機能部９２で取り出すデータを指定する情報（ここでは、ＬＢＲ用レジスタ９１を指定する情報）が保存される。このＬＢＲ機能とＰＥＢＳ機能との連携により、該当のコアで実行中のスレッドで直近に実行された分岐命令のアドレスが定期的に取得され、ＬＢＲ情報４４として、メモリ領域の所定領域（第４の記憶領域）に保存される。
【００５５】
そこで、特定部２２２は、第４の記憶領域に保存されたＬＢＲ情報４４を参照して、ＬＢＲ情報が示すアドレスを、切り替え対象スレッドで今後実行される命令のアドレスとして特定する。
【００５６】
マルチスレッド処理装置２１０は、例えば、図４に示すコンピュータ２６０で実現することができる。コンピュータ２６０は、複数のコア２６１０、２６１１、・・・を有するＣＰＵ２６１、メモリ６２、及び記憶部６３を備える。また、コンピュータ２６０は、入出力装置６８が接続される入出力Ｉ／Ｆ６４、記録媒体６９に対するデータの読み込みと書き込みとを制御するＲ／Ｗ部６５、及びネットワークＩ／Ｆ６６を備える。ＣＰＵ２６１、メモリ６２、記憶部６３、入出力Ｉ／Ｆ６４、Ｒ／Ｗ部６５、及びネットワークＩ／Ｆ６６は、バス６７を介して互いに接続される。なお、コア２６１０、２６１１、・・・の各々は、上述したように、ＬＢＲ用レジスタ９１と、ＰＥＢＳ機能部９２と、ＰＥＢＳ用カウンタ９３とを含む。本実施形態では、監視部２２０として機能するコアをコア２６１０、アプリケーションプログラムを実行し、かつスケジューラ３０として機能するコアを２６１１とする。
【００５７】
記憶部６３には、コンピュータ２６０をマルチスレッド処理装置２１０として機能させるためのマルチスレッドプログラム２７０が記憶される。マルチスレッドプログラム２７０は、監視プログラム２７１と、切替プログラム７２と、アプリケーションプログラム７３とを含む。監視プログラム２７１は、検出プロセス７１Ａと、特定プロセス２７１Ｂと、書換プロセス７１Ｃとを有する。コア２６１０は、特定プロセス２７１Ｂを実行することで、図１２に示す特定部２２２として動作する。その他のプロセスについては、第１実施形態におけるマルチスレッドプログラム７０と同様である。
【００５８】
また、上述したＬＢＲ情報４４が保存される第４の記憶領域がメモリ６２に設けられる。これにより、マルチスレッドプログラム２７０を実行したコンピュータ２６０が、マルチスレッド処理装置２１０として機能することになる。
【００５９】
なお、マルチスレッドプログラム２７０により実現される機能は、例えば半導体集積回路、より詳しくはＡＳＩＣ等で実現することも可能である。
【００６０】
第２実施形態に係るマルチスレッド処理装置２１０の作用は、切り替え対象スレッドで今後実行される命令の特定方法が第１実施形態と異なるだけである。具体的には、第２実施形態では、第１実施形態における監視処理（図５）のステップＳ１３及びＳ１４において、特定部２２２が、第４の記憶領域に保存されたＬＢＲ情報４４を参照して、ＬＢＲ情報が示すアドレスを、切り替え対象スレッドで今後実行される命令のアドレスとして特定する。
【００６１】
以上説明したように、第２実施形態に係るマルチスレッド処理装置２１０では、ハードウェア構成が有する既存の機能を利用して、切り替え対象スレッドで今後実行される命令を特定することで、第１実施形態と同様の効果を得られる。
【００６２】
第２実施形態の変形例として、図１３に、ハードウェア構成が有する機能を利用した他の例を示す。
【００６３】
図１３に示すマルチスレッド処理装置２１０Ａの監視部２２０Ａは、検出部２１と、特定部２２２Ａと、書換部２３とを含む。
【００６４】
また、スレッドを実行するコア２６６１Ａは、ハードウェア構成として、ＬＢＲ用レジスタ９１を含む。また、監視部２２０Ａとして機能するコア２６６０Ａは、ハードウェア構成として、他のコアが有するレジスタに保存されたデータを参照する参照部９５を含む。参照部９５は、本変形例では、スレッドを実行中のコア２６６１Ａ内のＬＢＲ用レジスタ９１を参照する。
【００６５】
特定部２２２Ａは、検出部２１から切り替え対象スレッドを通知されると、参照部９５を機能させ、切り替え対象スレッドを実行しているコア２６６１Ａ内のＬＢＲ用レジスタ９１を参照し、ＬＢＲ情報４４を取得する。他の処理については、第２実施形態と同様である。
【００６６】
この変形例によれば、切り替え対象スレッドを実行しているコア２６６１Ａ内のＬＢＲ用レジスタ９１を直接参照して、今後実行される命令を特定することができるため、ＬＢＲ情報４４を保存するための記憶領域をメモリ領域に確保する必要がない。
【００６７】
なお、上記では、マルチスレッドプログラム７０、２７０が記憶部６３に予め記憶（インストール）されている態様を説明したが、これに限定されない。開示の技術に係るプログラムは、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ＵＳＢメモリ等の記録媒体に記録された形態で提供することも可能である。
【００６８】
以上の各実施形態に関し、更に以下の付記を開示する。
【００６９】
（付記１）
マルチコアＣＰＵが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出する検出部と、
前記検出部により検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定する特定部と、
前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える書換部と、
を含む演算装置。
【００７０】
（付記２）
前記特定部は、前記切り替え対象のスレッドで呼び出された関数に含まれる命令を、前記今後実行される命令として推定する付記１記載の演算装置。
【００７１】
（付記３）
前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように設定された第１の記憶領域と、
前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報が記憶された第２の記憶領域と、をさらに含み、
前記特定部は、前記第１の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定すると共に、前記第２の記憶領域を参照して、特定した前記関数に含まれる命令の位置情報を特定する
付記２記載の演算装置。
【００７２】
（付記４）
前記第２の記憶領域には、前記各関数に含まれる命令のうち、分岐命令の位置情報が記憶される付記３記載の演算装置。
【００７３】
（付記５）
前記特定部は、前記切り替え対象のスレッドで直近に実行された分岐命令の位置情報であって、前記切り替え対象のスレッドに割り当てられているコアで取得された分岐命令の位置情報を、前記今後実行されることが推定される命令の位置情報として特定する付記１記載の演算装置。
【００７４】
（付記６）
前記特定部は、前記切り替え対象のスレッドに割り当てられているコアにおいて、Last Branch Record、及びPrecise Event Based Sampling機能を利用して取得された分岐命令の位置情報が記憶された第４の記憶領域を参照して、前記今後実行されることが推定される命令の位置情報を特定する付記５記載の演算装置。
【００７５】
（付記７）
前記検出部は、前記スレッドの各々の実行状態として、該スレッドがコアを占有している時間を取得し、前記コアを占有している時間が予め定めた閾値以上となるスレッドを、前記切り替え対象となるスレッドとして検出する付記１〜付記６のいずれか１項記載の演算装置。
【００７６】
（付記８）
実行されているスレッドの各々に対してコアが割り当てられた時刻が記憶された第３の記憶領域をさらに含み、
前記検出部は、前記第３の記憶領域に記憶された時刻を参照して、前記スレッドがコアを占有している時間を取得する
付記７記載の演算装置。
【００７７】
（付記９）
前記書換部は、前記特定部により特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるためのスケジューラを呼び出す命令に書き換える付記１〜付記８のいずれか１項記載の演算装置。
【００７８】
（付記１０）
付記１〜付記９のいずれか１項記載の演算装置と、
前記書換部により書き換えられた命令により呼び出される前記スケジューラと、
を含むマルチスレッド処理装置。
【００７９】
（付記１１）
前記スケジューラは、実行されているスレッドの各々に対してコアが割り当てられた時刻を、前記第３の記憶領域に記録する記録部を含む付記１０記載のマルチスレッド処理装置。
【００８０】
（付記１２）
マルチコアＣＰＵが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定し、
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
ことを含む処理を演算装置に実行させるスレッド切替方法。
【００８１】
（付記１３）
前記切り替え対象のスレッドで呼び出された関数に含まれる命令を、前記今後実行される命令として推定する付記１２記載のスレッド切替方法。
【００８２】
（付記１４）
前記今後実行されることが推定される命令の位置情報を特定する際に、
前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように設定された第１の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定し、
前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報が記憶された第２の記憶領域を参照して、特定した前記関数に含まれる命令の位置情報を特定する
付記１３記載のスレッド切替方法。
【００８３】
（付記１５）
前記第２の記憶領域には、前記各関数に含まれる命令のうち、分岐命令の位置情報が記憶される付記１４記載のスレッド切替方法。
【００８４】
（付記１６）
前記切り替え対象のスレッドで直近に実行された分岐命令の位置情報であって、前記切り替え対象のスレッドに割り当てられているコアで取得された分岐命令の位置情報を、前記今後実行されることが推定される命令の位置情報として特定する付記１２記載のスレッド切替方法。
【００８５】
（付記１７）
前記今後実行されることが推定される命令の位置情報を特定する際、前記切り替え対象のスレッドに割り当てられているコアにおいて、Last Branch Record、及びPrecise Event Based Sampling機能を利用して取得された分岐命令の位置情報が記憶された第４の記憶領域を参照して、前記今後実行されることが推定される命令の位置情報を特定する付記１６記載のスレッド切替方法。
【００８６】
（付記１８）
前記スレッドの各々の実行状態として、該スレッドがコアを占有している時間を取得し、前記コアを占有している時間が予め定めた閾値以上となるスレッドを、前記切り替え対象となるスレッドとして検出する付記１２〜付記１７のいずれか１項記載のスレッド切替方法。
【００８７】
（付記１９）
前記切り替え対象となるスレッドを検出する際、実行されているスレッドの各々に対してコアが割り当てられた時刻が記憶された第３の記憶領域に記憶された時刻を参照して、前記スレッドがコアを占有している時間を取得する付記１８記載のスレッド切替方法。
【００８８】
（付記２０）
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるためのスケジューラを呼び出す命令に書き換える付記１２〜付記１９のいずれか１項記載のスレッド切替方法。
【００８９】
（付記２１）
マルチコアＣＰＵが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定し、
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
ことを含む処理を演算装置に実行させるためのマルチスレッドプログラム。
【００９０】
（付記２２）
前記切り替え対象のスレッドで呼び出された関数に含まれる命令を、前記今後実行される命令として推定する付記２１記載のマルチスレッドプログラム。
【００９１】
（付記２３）
前記今後実行されることが推定される命令の位置情報を特定する際に、
前記プログラムのコンパイル時に、関数の呼び出しを実行する前又は後に、呼び出す関数の位置情報が保存されるように設定された第１の記憶領域を参照して、前記切り替え対象のスレッドで呼び出された関数を特定し、
前記プログラムのコンパイル時に取得された該プログラムに含まれる各関数に含まれる命令の位置情報が記憶された第２の記憶領域を参照して、特定した前記関数に含まれる命令の位置情報を特定する
付記２２記載のマルチスレッドプログラム。
【００９２】
（付記２４）
前記第２の記憶領域には、前記各関数に含まれる命令のうち、分岐命令の位置情報が記憶される付記２３記載のマルチスレッドプログラム。
【００９３】
（付記２５）
前記切り替え対象のスレッドで直近に実行された分岐命令の位置情報であって、前記切り替え対象のスレッドに割り当てられているコアで取得された分岐命令の位置情報を、前記今後実行されることが推定される命令の位置情報として特定する付記２１記載のマルチスレッドプログラム。
【００９４】
（付記２６）
前記今後実行されることが推定される命令の位置情報を特定する際、前記切り替え対象のスレッドに割り当てられているコアにおいて、Last Branch Record、及びPrecise Event Based Sampling機能を利用して取得された分岐命令の位置情報が記憶された第４の記憶領域を参照して、前記今後実行されることが推定される命令の位置情報を特定する付記２５記載のマルチスレッドプログラム。
【００９５】
（付記２７）
前記スレッドの各々の実行状態として、該スレッドがコアを占有している時間を取得し、前記コアを占有している時間が予め定めた閾値以上となるスレッドを、前記切り替え対象となるスレッドとして検出する付記２１〜付記２６のいずれか１項記載のマルチスレッドプログラム。
【００９６】
（付記２８）
前記切り替え対象となるスレッドを検出する際、実行されているスレッドの各々に対してコアが割り当てられた時刻が記憶された第３の記憶領域に記憶された時刻を参照して、前記スレッドがコアを占有している時間を取得する付記２７記載のマルチスレッドプログラム。
【００９７】
（付記２９）
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるためのスケジューラを呼び出す命令に書き換える付記２１〜付記２８のいずれか１項記載のマルチスレッドプログラム。
【００９８】
（付記３０）
マルチコアＣＰＵが有する各コアで複数のスレッドを切り替えながらプログラムを実行するマルチスレッド処理において、実行中のスレッドの各々の実行状態に基づいて、実行待ちのスレッドへの切り替え対象となるスレッドを検出し、
検出された切り替え対象となるスレッドで実行中又は過去に実行された命令に基づいて、該切り替え対象となるスレッドで今後実行されることが推定される命令の位置情報を特定し、
特定された命令の位置情報が示すプログラムの箇所を、スレッドを切り替えるための命令に書き換える
ことを含む処理を演算装置に実行させるためのマルチスレッドプログラムを記憶した記憶媒体。
【符号の説明】
【００９９】
１０、２１０、２１０Ａ      マルチスレッド処理装置
２０、２２０、２２０Ａ      監視部
２１   検出部
２２、２２２、２２２Ａ      特定部
２３   書換部
３０   スケジューラ
３１   コンテキスト保存部
３２   実行スレッド決定部
３３   ディスパッチ部
４１   ディスパッチ時刻テーブル
４２   実行中関数アドレス
４３   分岐命令アドレステーブル
４４   ＬＢＲ情報
５１   実行中スレッド
５２   実行待ちスレッドのコンテキスト
６０、２６０  コンピュータ
６１、２６１  ＣＰＵ
６１０、６１１、２６６０、２６６１、２６６０Ａ、２６６１Ａ     コア
６２   メモリ
６３   記憶部
７０、２７０  マルチスレッドプログラム
７１、２７１  監視プログラム
７２   切替プログラム
７３   アプリケーションプログラム
９１   ＬＢＲ用レジスタ
９２   ＰＥＢＳ機能部
９３   ＰＥＢＳ用カウンタ
９５   参照部
６２１ 第１の記憶領域
６２２ 第２の記憶領域
６２３ 第３の記憶領域
【図１】
0006477216.tif 000002
【図２】
0006477216.tif 000003
【図３】
0006477216.tif 000004
【図４】
0006477216.tif 000005
【図５】
0006477216.tif 000006
【図６】
0006477216.tif 000007
【図７】
0006477216.tif 000008
【図８】
0006477216.tif 000009
【図９】
0006477216.tif 000010
【図１０】
0006477216.tif 000011
【図１１】
0006477216.tif 000012
【図１２】
0006477216.tif 000013
【図１３】
0006477216.tif 000014