(57)【要約】【課題】ヘテロジニアス・マルチコアプロセッサにおいて、クリティカルセクションをコンプレックスコアにて実行させるためのスレッド実行制御方法およびシステムを提供すること。【解決手段】複数のシンプルコア３０−ｎと少なくとも１つのコンプレックスコアとを搭載するヘテロジニアス・マルチコアプロセッサを用いたスレッド実行制御方法は、複数のシンプルコア３０−ｎまたは少なくとも１つのコンプレックスコア５０にて実行されているスレッドのうち、一のスレッドがクリティカルセクションのロックを取得していることにより、他のスレッド６０がロック競合に遭遇したことに応じて、ロック競合に遭遇した他のスレッド６０をコンプレックスコア５０に移送するステップと、コンプレックスコア５０に移送された他のスレッド６０がロックを取得した後、コンプレックスコア５０が他のスレッド６０のクリティカルセクション実行するステップと、を含む。【選択図】図２
2010128895.tif 000002
【特許請求の範囲】
【請求項１】
ヘテロジニアス・マルチコアプロセッサのスレッド実行制御方法であって、
前記ヘテロジニアス・マルチコアプロセッサは、複数のシンプルコアと少なくとも１つのコンプレックスコアとを搭載し、
前記複数のシンプルコアそれぞれまたは前記少なくとも１つのコンプレックスコアそれぞれにて実行されているスレッドのうち、一のスレッドがクリティカルセクションのロックを取得している際に、前記複数のシンプルコアにて実行されている他のスレッドが同一の前記ロックの取得を試み、前記他のスレッドが前記一のスレッドとのロック競合に遭遇したことに応じて、ロック競合に遭遇した前記他のスレッドを前記コンプレックスコアに移送するステップと、
前記コンプレックスコアに移送された前記他のスレッドがロックを取得した後、前記コンプレックスコアが前記他のスレッドのクリティカルセクションを実行するステップと、
を含むスレッド実行制御方法。
【請求項２】
前記シンプルコアの負荷と前記コンプレックスコアの負荷との比較結果に基づいて、前記シンプルコアから前記コンプレックスコアへのスレッド移送を許可するか否かを許可情報として記憶するステップを更に含み、
ロック競合に遭遇した前記他のスレッドを前記コンプレックスコアに移送するステップは、前記許可情報がスレッド移送可となっている場合に、ロック競合に遭遇した前記他のスレッドを前記コンプレックスコアに移送する、請求項１に記載のスレッド実行制御方法。
【請求項３】
ロック競合に遭遇した前記他のスレッドが前記コンプレックスコアに移送された後、前記コンプレックスコアに移送された前記他のスレッドがロック取得を行うステップを更に含む請求項１に記載のスレッド実行制御方法。
【請求項４】
前記スレッドはネストカウンタを有し、
ロック競合に遭遇した前記他のスレッドを前記コンプレックスコアに移送する際に、
移送する前記他のスレッドの前記ネストカウンタを１にセットするステップと、
移送する前記他のスレッドが存在するシンプルコアを特定する情報を前記スレッドのスタック領域に記憶するステップと、
を更に含む請求項１に記載のスレッド実行制御方法。
【請求項５】
前記コンプレックスコアにてスレッドのクリティカルセクションが完了したことに応じて、ロックを解放するステップと、
前記クリティカルセクションが完了したスレッドを、当該スレッドのスタック領域に記憶されている移送元のシンプルコアを特定する情報に基づいて、前記移送元のシンプルコアに移送するステップと、
を更に含む請求項４に記載のスレッド実行制御方法
【請求項６】
前記ロックを解放するステップの後、前記ネストカウンタが０であるか否か判断するステップと、
前記判断するステップにて、ネストカウンタが０でない場合に、デクリメントするステップと、
前記判断するステップにて、ネストカウンタが０である場合に、前記クリティカルセクションが完了したスレッドを前記移送元のシンプルコアに移送するステップと、
を更に含む請求項５に記載のスレッド実行制御方法。
【請求項７】
ヘテロジニアス・マルチコアプロセッサのスレッド実行制御方法であって、
前記ヘテロジニアス・マルチコアプロセッサは、複数のシンプルコアと少なくとも１つのコンプレックスコアとを搭載し、
前記シンプルコアの負荷と前記コンプレックスコアの負荷との比較結果に基づいて、前記シンプルコアから前記コンプレックスコアへのスレッド移送を許可するか否かを許可情報として記憶するステップと、
前記複数のシンプルコアそれぞれまたは前記少なくとも１つのコンプレックスコアそれぞれにて実行されているスレッドのうち、一のスレッドがクリティカルセクションのロックを取得している際に、前記複数のシンプルコアにて実行されている他のスレッドが同一の前記ロックの取得を試み、前記他のスレッドが前記一のスレッドとのロック競合に遭遇したことに応じて、前記許可情報がスレッド移送可となっている場合に、ロック競合に遭遇した前記他のスレッドを前記コンプレックスコアに移送するステップと、
ロック競合に遭遇した前記他のスレッドが前記コンプレックスコアに移送された後、前記コンプレックスコアに移送された前記他のスレッドがロック取得を行うステップと、
前記コンプレックスコアに移送された前記他のスレッドがロックを取得した後、前記コンプレックスコアが前記他のスレッドのクリティカルセクションを実行するステップと、
前記コンプレックスコアにてスレッドのクリティカルセクションが完了したことに応じて、ロックを解放するステップと、
前記クリティカルセクションが完了したスレッドを、当該スレッドのスタック領域に記憶されている移送元のシンプルコアを特定する情報に基づいて、前記移送元のシンプルコアに移送するステップと、
を含むスレッド実行制御方法。
【請求項８】
ヘテロジニアス・マルチコアプロセッサを備えるコンピュータのスレッド実行制御プログラムであって、
前記ヘテロジニアス・マルチコアプロセッサは、複数のシンプルコアと少なくとも１つのコンプレックスコアとを搭載し、
前記コンピュータをして、
前記複数のシンプルコアそれぞれまたは前記少なくとも１つのコンプレックスコアそれぞれにて実行されているスレッドのうち、一のスレッドがクリティカルセクションのロックを取得している際に、前記複数のシンプルコアにて実行されている他のスレッドが同一の前記ロックの取得を試み、前記他のスレッドが前記一のスレッドとのロック競合に遭遇したことに応じて、ロック競合に遭遇した前記他のスレッドを前記コンプレックスコアに移送するステップと、
前記コンプレックスコアに移送された前記他のスレッドがロックを取得した後、前記コンプレックスコアが前記他のスレッドのクリティカルセクションを実行するステップと、
を実行させるスレッドプログラム。
【請求項９】
ヘテロジニアス・マルチコアプロセッサを備えるコンピュータにおける、スレッド実行制御システムであって、
前記ヘテロジニアス・マルチコアプロセッサは、複数のシンプルコアと少なくとも１つのコンプレックスコアとを搭載し、
前記シンプルコアの負荷と前記コンプレックスコアの負荷とを比較し、許可情報を設定する移送制御部を備え、
前記複数のシンプルコアにて実行されるスレッドは、
前記許可情報がスレッド移送可となっているか否かを確認する確認部と、
前記スレッドがロック競合に遭遇した際に、前記確認部にて前記許可情報がスレッド移送可となっていることが確認されたことに応じて、前記スレッドを前記コンプレックスコアに移送する移送部と、
を備えるスレッド実行制御システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ヘテロジニアス・マルチコアプロセッサにおけるスレッド実行制御方法、プログラム、およびシステムに関する。特に、スレッドのクリティカルセクションを効率的に実行するための方法およびシステムに関する。
【背景技術】
【０００２】
パーソナル・コンピュータ上での動画再生等のアプリケーションの普及に伴い、プロセッサの性能向上が求められている。プロセッサの性能は、プロセッサの動作周波数の増加やキャッシュメモリの容量サイズの増加により向上する。しかし、それに伴いプロセッサの消費電力や発熱量が増大する等の問題が生じるため、動作周波数の増加等により性能を向上させることは困難であった。そこで２つ以上のプロセッサコア（以下、簡略化のため「コア」という）を搭載したマルチコアプロセッサが登場した。マルチコアプロセッサは、複数の処理を並列に実行することができることから、消費電力や発熱量の問題を回避しながら性能向上を実現することが可能である。
【０００３】
マルチコアプロセッサには、ホモジニアス・マルチコアプロセッサとヘテロジニアス・マルチコアプロセッサとがある。ホモジニアス・マルチコアプロセッサは、同じアーキテクチャのコアを複数搭載しており、例えば、動作周波数やキャッシュメモリの容量を抑え、かつ投機実行等に必要な複雑なハードウェア機構を省いたシンプルコアを単一チップ上に複数搭載することができる。一方、ヘテロジニアス・マルチコアプロセッサは、異なる種類のコアを搭載しており、例えば、Ｃｅｌｌ（Ｃｅｌｌ  Ｂｒｏａｄｂａｎｄ  Ｅｎｇｉｎｅ（登録商標））がある。Ｃｅｌｌは、ＯＳ等の処理に適した１個のプロセッサコア（ＰＰＥ）と、メディア処理に適した８個のプロセッサコア（ＳＰＥ）、を搭載している。
【０００４】
マルチコアプロセッサは、複数の処理を並列に実行することができる。しかし、並列度の高いアプリケーションプログラムにおいても、並列に実行できないクリティカルセクションが存在する場合が多い。クリティカルセクションでは、ロックを用いた排他制御が行われ、ロックを取得した単一のスレッドのみが実行できる。そのため、ロックを取得できなかったスレッドのクリティカルセクションはロックが取得できるまで、待たなければならず、アプリケーションプログラムの実行性能が低下してしまうという問題点がある。
【０００５】
特に、シンプルコアを複数搭載したホモジニアス・マルチコアプロセッサは、クリティカルセクションを低速かつ逐次的に実行するため、多数のロック待ち状態のスレッドを生み出し、アプリケーションプログラムの実行性能を低下させてしまう。
【０００６】
ところで、複数の異なる種類のプロセッサコアを搭載したヘテロジニアス・マルチコアプロセッサにおいては、タスクを効率的に実行するために、並列する複数のタスクを適切なコアに割り当てる手法がある（特許文献１）。特許文献１に記載の手法は、各タスクのＩＰＣ（Ｉｎｓｔｒｕｃｔｉｏｎｓ  Ｐｅｒ  Ｃｙｃｌｅ）やキャッシュミス率等を測定し、実行時間が短くなるように各タスクをプロセッサコアに割り当てる。例えば、キャッシュミスが頻発するタスクはキャッシュの大きなプロセッサコアに割り当てる。
【特許文献１】特開２００８−９０５４６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
特許文献１に記載の手法は、キャッシュミス率等のタスクの実行状況に応じてタスクをコアに割り当てる手法であって、スレッド（タスク）のクリティカルセクションを考慮して、スレッド（タスク）を割り当てるわけではない。そのため、スレッドのクリティカルセクションのロック待ちによる、アプリケーションプログラムの実行性能の低下を解決することはできない。
【０００８】
また、特許文献１に記載の手法は、コアの性能に応じてタスクを割り当てるわけではない。そのため、スレッド（タスク）は、自身に合った性能を有するコアに割り当てられるとは限らない。
【０００９】
本発明は、ヘテロジニアス・マルチコアプロセッサにおいて、スレッドのロック取得待ち時間を短縮することにより、アプリケーションプログラムの実行性能の低下を防ぐことを目的とする。
【課題を解決するための手段】
【００１０】
本発明は、上記課題に鑑み、以下のような解決手段を提供する。本発明は、複数のシンプルコアと少なくとも１つのコンプレックスコアとを搭載したヘテロジニアス・マルチコアプロセッサを用い、クリティカルセクションをコンプレックスコアにて高速に実行し、アプリケーションの性能低下を防ぐためのスレッド実行制御方法およびシステムを提供する。
【００１１】
ここで、「コンプレックスコア」とは、動作周波数が高く、キャッシュメモリの容量が大きく、かつ投機実行等の機能を備え、スレッドを高速で実行することができるコアである。また、「クリティカルセクション」とは、スレッド内に含まれる処理のうち、同時に１つのスレッドしか実行できない処理を意味する。
【００１２】
本発明の１つの態様によると、スレッド実行制御方法は、前記複数のシンプルコアそれぞれまたは前記少なくとも１つのコンプレックスコアそれぞれにて実行されているスレッドのうち、一のスレッドがあるクリティカルセクションのロックを取得している際に、前記複数のシンプルコアにて実行されている他のスレッドが同一のロックの取得を試み、前記他のスレッドが前記一のスレッドとのロック競合に遭遇したことに応じて、前記他のスレッドを前記コンプレックスコアに移送するステップと、前記コンプレックスコアに移送された前記他のスレッドがロックを取得した後、前記コンプレックスコアが前記他のスレッドのクリティカルセクションを実行するステップと、を含む。
【００１３】
本態様によると、まず、ヘテロジニアス・マルチコアプロセッサに搭載されているコアにて実行されているスレッドのうちの一のスレッドがクリティカルセクションのロックを取得している際に、シンプルコアにて実行されている他のスレッドが同一のロックの取得を試みた際にロック競合に遭遇したことに応じて、ロック競合に遭遇した他のスレッドをコンプレックスコアに移送する。ロック競合に遭遇した他のスレッドは、ロックが取得できないため、ロック取得待ちとなる。次に、移送された他のスレッドがロックを取得した後、コンプレックスコアが他のスレッドのクリティカルセクションを実行する。
【００１４】
それにより、並列に実行できないクリティカルセクションを高速に実行できるコンプレックスコアにて実行して、クリティカルセクションの実行時間を短縮することができる。ロック競合に遭遇したスレッドはロックが取得できるまで待つ。その待ち時間は、そのスレッドより前に実行されるスレッドのクリティカルセクションの実行時間である。そのため、スレッドのクリティカルセクションの実行時間を短縮することにより、スレッドのロック取得の待ち時間を削減することができる。なお、ロックとは、他のスレッドを排他制御する排他ロックを意味する。
【００１５】
また、本態様は、シンプルコアの負荷とコンプレックスコアの負荷との比較結果に基づいて、シンプルコアからコンプレックスコアへのスレッド移送を許可するか否かを許可情報として記憶するステップを更に含み、ロック競合に遭遇した前記他のスレッドを前記コンプレックスコアに移送するステップは、前記許可情報がスレッド移送可となっている場合に、ロック競合に遭遇した前記他のスレッドを前記コンプレックスコアに移送する。
【００１６】
それにより、コンプレックスコアに負荷がかかり過ぎていて、シンプルコアでクリティカルセクションを実行したほうが早く処理が終わる場合に、クリティカルセクションをシンプルコアにて実行するようにすることができる。その結果、スレッドのロック取得の待ち時間を短くなるように、クリティカルセクションを実行するコアを選択することができる。
【００１７】
本発明は、ＦｒｅｅＢＳＤやＬｉｎｕｘ等の、既存の技術と組み合わせることができ、そのように組み合わせた技術もまた、本発明の技術範囲に含まれる。同様に、本発明の技法を含むパーソナル・コンピュータや携帯端末（ＰＤＡ）等も、本発明の技術範囲に含まれる。更に、本発明の技法は、スレッド実行制御方法の諸段階を、ＦＰＧＡ（現場でプログラム可能なゲートアレイ）、ＡＳＩＣ（特定用途向け集積回路）、これらと同等のハードウェアロジック素子、プログラム可能な集積回路、またはこれらの組み合わせが記憶し得るプログラムの形態、すなわちプログラム製品として提供し得る。具体的には、データ入出力、データバス、メモリバス、システムバス等を備えるカスタムＬＳＩ（大規模集積回路）の形態として、本発明に係るスレッド実行制御システムを提供でき、そのように集積回路に記憶されたプログラム製品の形態も、本発明の技術範囲に含まれる。
【発明の効果】
【００１８】
本発明によれば、複数のシンプルコアと少なくとも１つのコンプレックスコアとを搭載したヘテロジニアス・マルチコアプロセッサを用い、クリティカルセクションをコンプレックスコアにて実行し、アプリケーションの性能低下を防ぐためのスレッド実行制御方法およびシステムを提供することができる。また、ロック競合に遭遇したスレッドのクリティカルセクションをコンプレックスコアにて実行することにより、スレッドのロック取得の待ち時間を削減することができ、アプリケーションプログラムの実行性能の低下を防ぐことができる。
【発明を実施するための最良の形態】
【００１９】
以下、本発明の実施形態について図を参照しながら説明する。なお、これらはあくまでも一例であって、本発明の技術的範囲はこれらに限られるものではない。なお、以下の説明において、ヘテロジニアス・マルチコアプロセッサは１つのコンプレックスコアと複数のシンプルコアを備える。
【００２０】
図１は、ロック競合に遭遇したスレッドのタイムチャートを示す図である。図１を用いて、本発明の一実施形態係るスレッドの実行制御方法の概要について、従来技術と対比して説明する。
【００２１】
図１（ａ）は、従来技術に係るホモジニアス・マルチコアプロセッサにおける、ロック競合に遭遇したスレッドのタイムチャートである。一方、図１（ｂ）は、本発明の一実施形態に係るヘテロジニアス・マルチコアプロセッサにおける、ロック競合に遭遇したスレッドのタイムチャートである。
【００２２】
図１（ａ）および（ｂ）では３つのスレッド、スレッドＡ、スレッドＢ、およびスレッドＣがそれぞれシンプルコア１、シンプルコア２、シンプルコア３で実行され、各スレッドはクリティカルセクションにおいて、それぞれロックの取得を試みる。なお、スレッドのロック取得における優先順位は、スレッドＡ、スレッドＢ、スレッドＣの順であるとする。
【００２３】
図１（ａ）に示すように、最初にスレッドＡがロックを取得する（ｌｏｃｋ）と、スレッドＢおよびスレッドＣはロックが解放されるのを待つ（ｗａｉｔ）。スレッドＡのクリティカルセクションが完了し、ロックを解放する（ｕｎｌｏｃｋ）と、次に、スレッドＢがロックを取得し（ｌｏｃｋ）、スレッドＣは更にロックが解放されるのを待つ（ｗａｉｔ）。スレッドＡはロック解放後、クリティカルセクション以外の処理をスレッドＢのクリティカルセクションと平行して実行し、全ての処理が完了するとスレッドＡは完了する。スレッドＢおよびスレッドＣも同様である。
【００２４】
図１（ａ）に示すように、スレッドＡがロックを解放してからスレッドＢがロックを取得するまでには、時間差Ｔ１がある。スレッドＡとスレッドＢとはシンプルコアが異なるため、スレッドＡがロックを解放したことをスレッドＢが認識するまで時間がかかるためである。同様に、スレッドＢがロックを解放してからスレッドＣがロックを取得するまでには、時間差Ｔ２がある。
【００２５】
図１（ａ）に示す従来技術に係るホモジニアス・マルチコアプロセッサにおいて、スレッドＣがロック競合に遭遇してからロックを取得するまでには、シンプルコアによるスレッドＡのクリティカルセクションの実行時間と、時間差Ｔ１と、シンプルコアによるスレッドＢのクリティカルセクションの実行時間Ｔ１０と、時間差Ｔ２との合計時間、待たなければならない。
【００２６】
一方、図１（ｂ）に示すように、本発明の一実施形態に係るヘテロジニアス・マルチコアプロセッサにおいては、図１（ａ）と同様に、最初にスレッドＡがロックを取得し（ｌｏｃｋ）、スレッドＢおよびスレッドＣはロックが解放されるのを待つ（ｗａｉｔ）。それと同時に、スレッドＢおよびスレッドＣは、それぞれ自身をコンプレックスコアへ移送（ｍｉｇｒａｔｅ）する。ここで、移送とは、明示的にスレッドに実行するコアを指定することをいう。
【００２７】
スレッドＡがロックを解放する（ｕｎｌｏｃｋ）と、スレッドＢはコンプレックスコア上でロックを取得し（ｌｏｃｋ）、クリティカルセクションを実行する。スレッドＢは、クリティカルセクション完了すると、完了と同時に自身を元のシンプルコア２へ移送する。シンプルコア２に移送されたスレッドＢはクリティカルセクション以外の処理をスレッドＣのクリティカルセクションと平行して実行し、全ての処理が完了するとスレッドＢは完了する。スレッドＣも同様である。
【００２８】
コンプレックスコアでのクリティカルセクションの実行時間は、シンプルコアでの実行時間に比べ短い。また、図１（ｂ）に示すように、コンプレックスコアにおいて、スレッドＢがロックを解放して（ｕｎｌｏｃｋ）からスレッドＣがロックを取得する（ｌｏｃｋ）までには、図１（ａ）の場合と異なり時間差がない。これは、スレッドＢとスレッドＣとが同じコンプレックスコア上にあるので、スレッドＢがロックを解放したことをスレッドＣが認識するまで時間がかからないためである。
【００２９】
図１（ｂ）に示す本発明の一実施形態に係るヘテロジニアス・マルチコアプロセッサにおいて、スレッドＣがロック競合に遭遇してからロックを取得するまでには、シンプルコアによるスレッドＡのクリティカルセクションの実行時間と、時間差Ｔ１と、コンプレックスコアによるスレッドＢのクリティカルセクションの実行時間Ｔ１１０と、の合計時間、待たなければならない。
【００３０】
本発明の一実施形態に係るヘテロジニアス・マルチコアプロセッサを用いることにより、スレッドＣがロック競合に遭遇してからロック取得までの待ち時間は、従来技術と比較して、シンプルコアとコンプレックスコアとのスレッドＢのクリティカルセクションの実行時間の差Ｔ１０−Ｔ１１０と、スレッドＢがロックを解放してからスレッドＣがロックを取得するまでの時間差Ｔ２との分、短縮される。
【００３１】
このように、ロックが競合しロックを取得できなかったスレッドをコンプレックスコアに移送し、スレッドのクリティカルセクションの実行をコンプレックスコア上で行うことにより、シンプルコア上で行うよりも実行時間を短縮することができる。また、ロック待ちのスレッドをコンプレックスコア上にまとめることにより、スレッド間のロックの解放とロックの取得との時間差を無くすことができる。その結果、各スレッドのクリティカルセクションをそれぞれのシンプルコアで実行する場合に比べ、ロック競合が生じているスレッドのロック競合に遭遇してからロック取得までの待ち時間を削減することができ、クリティカルセクションにより生じるアプリケーションプログラムの実行性能の低下を防ぐことができる。
【００３２】
図２は、本発明の一実施形態に係る、スレッド移送システム１を示す図である。図１（ｂ）にて概要を示した、本発明の一実施形態におけるスレッドの実行制御方法を実現するためのスレッド移送システムについて図２を用いて説明する。
【００３３】
スレッド移送システム１は、シンプルコア３０−ｎ（図２においては、ｎ＝１〜４）とコンプレックスコア５０とを搭載したヘテロジニアス・マルチコアプロセッサを利用する。スレッド移送システム１は、移送制御部２０と、ＯＳカーネル４０と、スレッド６０−ｍ（図２においては、ｍ＝１〜３）と、にて構成される。移送制御部２０は、シンプルコア３０−４にて実行されるスレッドである。なお、コンプレックスコアを複数搭載するヘテロジニアス・マルチコアプロセッサの場合には、コンプレックスコアにて実行されてもよい。スレッド６０−ｎはシンプルコア３０−ｎまたはコンプレックスコア５０にて実行される。なお、シンプルコア、スレッドは複数あるが、以下の説明において、移送対象をスレッド６０とし、そのスレッド６０が実行されているコアをシンプルコア３０とする。
【００３４】
移送制御部２０は、シンプルコア３０上のスレッド６０をコンプレックスコア５０へ移送可能か否かの判断を行い、その判断結果（許可情報）を保持する。シンプルコア３０上のスレッド６０をコンプレックスコア５０へ移送可能か否かの判断は、一定間隔、例えば１０秒毎、に行う。移送制御部２０に保持されている許可情報は、スレッド６０にスレッド移送が生じた際にスレッド６０にて参照される。ここで、スレッド移送が生じた際とは、スレッドがロック競合に遭遇した際のことである。
【００３５】
シンプルコア３０上のスレッド６０をコンプレックスコア５０へ移送可能か否かの判断は、複数のシンプルコア３０−ｎそれぞれの負荷とコンプレックスコア５０の負荷とをサンプリングし、複数のシンプルコア３０−ｎの平均負荷とコンプレックスコア５０の負荷とを比較して行う。コンプレックスコア５０の負荷が複数のシンプルコア３０−ｎの平均負荷に比べて高い場合には、許可情報を移送不可とする。一方、それ以外の場合には、許可情報を移送可とする。
【００３６】
シンプルコア３０上のスレッド６０は、ロック競合に遭遇すると自身をコンプレックスコア５０へ移送する処理を行う。なお、ロック競合に遭遇しない場合には、スレッド６０はロックを取得し、シンプルコア３０にて実行される。スレッド６０は、移送制御部２０に保持されている許可情報を確認する確認部と、後述する処理３を行う移送部とを備える。ロック競合に遭遇するとシンプルコア３０上のスレッド６０は、まず、コンプレックスコア５０へスレッド移送が可能か否かの判断を行うために、移送制御部２０に保持されている許可情報を確認する（１０１）。許可情報が「移送可」となっている場合には、スレッド６０はスレッド移送するための処理を行う。一方、許可情報が「移送不可」となっている場合には、スレッド６０はロックが取得できるまで、シンプルコア３０上にて待つ。
【００３７】
ここで、スレッドがロック競合に遭遇するとは、スレッドがロックを取得しようとした際に、他のスレッドによってそのロックが取得されていることである。
【００３８】
シンプルコア３０上のスレッド６０はスレッド移送するための処理を行う前に、まずスレッド６０は自身が既にコンプレックスコア５０上にいるか否かを判断する。既に、スレッド６０がコンプレックスコア５０にいる場合には、スレッド移送を行う必要がないためである。
【００３９】
一方、スレッド６０がコンプレックスコア５０にいない場合には、スレッド６０は以下の３つの処理を行う。
処理１：現在のシンプルコア３０を特定する情報を、スレッドローカルな記憶領域（スタック領域）に記憶する（１０２）。
処理２：スレッドローカルな記憶領域に記憶されているネストカウンタを１にセットする（１０３）。
処理３：スレッド６０が自身をコンプレックスコア５０へ移送する（１０５）。
【００４０】
コンプレックスコア５０に移送されたスレッド６０はコンプレックスコアにて処理が完了すると、元のシンプルコア３０へ再移送される（１０６）。そのため、再移送の際の移送先である、現在のシンプルコア３０をスレッドローカルな記憶領域に記憶する処理１を行う。
【００４１】
ネストカウンタは、クリティカルセクションがネストしている場合、コンプレックスコア５０に移送されたスレッド６０のクリティカルセクションが完了した時に、スレッドを移送元のシンプルコア３０に再移送するために用いられる。ネストカウンタが０である場合には、ネストカウンタを１にセットする処理２を行う。なお、ネストカウンタが０よりも大きい場合には、スレッド６０はコンプレックスコア５０へ移送されず、クリティカルセクション開始時にネストカウンタをインクリメントする。
【００４２】
処理３にて、スレッド６０はコンプレックスコア５０へ移送するためのシステムコールを呼び出し（１０４）、ＯＳカーネルが提供する機能を利用して自身をコンプレックスコア５０へ移送する（１０５）。スレッド６０のスレッド移送が完了した後、スレッド６０はロック取得を再び試みる。これは、スレッド６０がコンプレックスコアに移送された後、スレッド６０が実行されるまでのある程度の時間が経過する間にロックが解放されている場合を考慮して、一度のみロックの取得を試みる。この時点でロックの取得が成功すれば、スレッド６０はそのままクリティカルセクションをコンプレックスコア５０上で実行する。一方、ロックの取得に失敗した場合、スレッド６０は、コンプレックスコア５０の実行キューの中に置かれ、ロックが取得できるまで待つ。
【００４３】
コンプレックスコア５０上のスレッド６０は、クリティカルセクションが完了すると、ロックを解放し、自身を元のシンプルコアへ再移送する処理を行う。コンプレックスコア５０上のスレッド６０はスレッドローカルな記憶領域のネストカウンタをデクリメントした後、ネストカウンタが０であるか否かの判断を行う。ネストカウンタが０である場合には、スレッド６０のクリティカルセクションは全て完了したと判断し、自身を元のシンプルコアへ再移送するためのシステムコールを呼び出す（図示せず）。システムコール内で、コンプレックスコア５０上のスレッド６０は、自身をシンプルコア３０へ移送する（１０６）。一方、ネストカウンタが０でない場合には、スレッド６０には、コンプレックスコア５０にて実行するクリティカルセクションが残っていると判断し、自身を元のシンプルコアへ再移送する処理を行わない。
【００４４】
上述したスレッド移送システム１を用いることにより、ロック競合に遭遇したスレッドをコンプレックスコアにて実行することできる。その結果、ロック競合に遭遇したスレッドがロックを取得するまでの待ち時間を短縮することができる。
【００４５】
図３は、本発明の一実施形態に係る、ロック取得時のスレッド移送アルゴリズムを示す図である。シンプルコア上のスレッドがロック競合に遭遇すると処理が開始する。
【００４６】
Ｓ１０：スレッドは、スレッドローカルな記憶領域のネストカウンタが０であるか否か判断する。判断結果が、ＹＥＳの場合にはステップＳ３０へ処理を移し、ＮＯの場合にはステップＳ２０へ処理を移す。
Ｓ２０：スレッドは、ネストカウンタをインクリメントし、ステップＳ７０へ処理を移す。
【００４７】
Ｓ３０：スレッドは、移動制御部の許可情報を参照し、コンプレックスコアへのスレッド移送が可能であるか否かを判断する。判断結果が、ＹＥＳの場合にはステップＳ４０へ処理を移す。一方、ＮＯの場合には、スレッドはそのままシンプルコアに残り、ステップＳ７０へ処理を移す。
Ｓ４０：スレッドは、自身がすでにコンプレックスコアにいるか否かを判断する。判断結果が、ＹＥＳの場合にはすでにコンプレックスコアにいるスレッドについてステップＳ７０へ処理を移し、ＮＯの場合にはステップＳ５０へ処理を移す。
【００４８】
Ｓ５０：スレッドは、現在のシンプルコアを特定する情報を、スレッドローカルな記憶領域に記憶し（処理１）、スレッドローカルな記憶領域に記憶されているネストカウンタを１にセットし（処理２）、その後、自身をコンプレックスコアへ移送する（処理３）。
Ｓ６０：スレッドは、ロックの取得を試みる。スレッドがロックの取得に成功した場合には、処理は完了し、コンプレックスコアにてクリティカルセクションが実行される。一方、スレッドがロックの取得に失敗した場合には、ステップＳ７０へ処理を移す。
【００４９】
Ｓ７０：スレッドは、ロックが取得できるまで待つ。なお、ステップＳ２０、Ｓ３０から処理が移ってきた場合には、スレッドはコンプレックスコアにてロック取得を待ち、ステップＳ４０、Ｓ６０から移ってきた場合には、スレッドはシンプルコアにてロック取得を待つ。
【００５０】
図４は、本発明の一実施形態に係る、ロック解放時のスレッド移送アルゴリズムを示す図である。スレッドは、クリティカルセクションの実行を完了した後、処理を開始する。
【００５１】
Ｓ１１０：スレッドは、ロックを解放する。
Ｓ１２０：スレッドは、スレッドローカルな記憶領域のネストカウンタが０であるか否かの判断を行う。判断結果が、ＹＥＳの場合には処理を完了し、ＮＯの場合にはステップＳ１３０へ処理を移す。
Ｓ１３０：スレッドは、ネストカウンタをデクリメントする。
【００５２】
Ｓ１４０：スレッドは、再度、ネストカウンタが０であるか否かの判断を行う。判断結果が、ＹＥＳの場合にはＳ１５０へ処理を移し、ＮＯの場合には処理を完了する。
Ｓ１５０：スレッドは、スレッドローカルな記憶領域に記憶されている元のシンプルコアを特定する情報に基づいて、システムコールを呼び出す。システムコール内で、システムコールを呼び出したスレッドは、自身を元のシンプルコアへ移送する。
【００５３】
［実装例］
本発明の実装例として、Ｊａｖａ（登録商標）のｓｙｎｃｈｒｏｎｉｚｅｄブロックにおけるロック取得待ち時間を削減するために、Ｌｉｎｕｘ２．６が提供するスレッド移送のためのシステムコールを用いるプログラム例について説明する。
【００５４】
現在の多くのＪａｖａ実行環境において、スレッドは、ロックの取得に失敗しても、すぐにｃｏｎｄｉｔｉｏｎａｌ  ｗａｉｔすることはなく、しばらくの間ｓｐｉｎ−ｗａｉｔしながらロックの取得を試みる。ｓｐｉｎ−ｗａｉｔ中にロックが取得できない場合にのみ、スレッドはｃｏｎｄｉｔｉｏｎａｌ  ｗａｉｔする。ここで、ｃｏｎｄｉｔｉｏｎａｌ  ｗａｉｔとは、あるスレッドを他のスレッドがあることを終えるまで停止することをいう。また、ｓｐｉｎ−ｗａｉｔとは２つのスレッドが別々なプロセッサ上で走っていて、片方のスレッドがある処理を終えるまでもう片方のスレッドを待たせておきたい場合等に、待つ方のスレッドはループに入って、もう片方のスレッドが、処理を終えるまで意味のないループ処理を継続することをいう。
【００５５】
ｓｐｉｎ−ｗａｉｔ中に取得可能なロックに対して本発明を適用すると、スレッド移送のためのシステムコールに要する時間が、ロック取得のための待ち時間を超えてしまい性能が低下する可能性がある。そのため、ｓｐｉｎ−ｗａｉｔ中に取得できないロックに対してのみ本発明を適用する。
【００５６】
次の式（Ｉ）に、本発明の実装例に係るロック取得時にスレッド移送を行うコードを示す。式（Ｉ）を用いて、ロック取得時のスレッド移送処理について説明する。式（Ｉ）の１１行目に示すように、スレッド移送は、スレッドが使用するコアを指定することができるｓｃｈｅｄ＿ｓｅｔａｆｆｉｎｉｔｙシステムコールを通して行われる。スレッド移送完了後、１３行目に示すように、ｐｔｈｒｅａｄ＿ｍｕｔｅｘ＿ｔｒｙｌｏｃｋシステムコールを通して、１度だけロックの取得を試みる。ｐｔｈｒｅａｄ＿ｍｕｔｅｘ＿ｔｒｙｌｏｃｋシステムコールは、ロックの取得を試み、他のスレッドによってロックが取得されていない場合にはロックを取得し、他のスレッドによってロックが取得されている場合にはロックを取得しない。
【００５７】
ｐｔｈｒｅａｄ＿ｍｕｔｅｘ＿ｔｒｙｌｏｃｋシステムコールにて、ロックの取得に成功すれば、スレッドはｃｏｎｄｉｔｉｏｎａｌ  ｗａｉｔすることなしに、クリティカルセクションをコンプレックスコア上で実行する。一方、ロック取得に失敗した場合には、ｐｔｈｒｅａｄ＿ｍｕｔｅｘ＿ｔｒｙｌｏｃｋシステムコールを通してスレッドをｃｏｎｄｉｔｉｏｎａｌ  ｗａｉｔとする。
【００５８】
【数１】
2010128895.tif 000003
【００５９】
次の式（ＩＩ）にロック解放時にスレッド移送を行うコードを示す。式（ＩＩ）を用いて、ロック解放時のスレッド移送処理について説明する。３行目に示すように、ロックの解放は、ｐｔｈｒｅａｄ＿ｍｕｔｅｘ＿ｕｎｌｏｃｋシステムコールを通して行われる。続いて、７行目にて、ｓｃｈｅｄ＿ｓｅｔａｆｆｉｎｉｔｙシステムコールを通して、スレッドを元のシンプルコアに移送した後、１１行目にて再度ｓｃｈｅｄ＿ｓｅｔａｆｆｉｎｉｔｙシステムコールを呼び出す。これは、元のシンプルコアに移送されたスレッドのａｆｆｉｎｉｔｙ値を元の値に戻すことにより、このスレッドの実行を１つのコアに限定するのを避けるためである。ただし、２回目のｓｃｈｅｄ＿ｓｅｔａｆｆｉｎｉｔｙシステムコールでは、既にスレッドがａｆｆｉｎｉｔｙの付いたコアで実行されているため、スレッドの移送は起こらずオーバヘッドは少ない。これにより、後続のスレッドに対して速やかに複雑コアを明け渡すことが可能になる。なお、ａｆｆｉｎｉｔｙ値とは、スレッドを実行するコアを指定したものである。
【００６０】
【数２】
2010128895.tif 000004
【００６１】
上述した、本発明の実装例において、図２に示した移送制御部が移送許可の情報をセット、リセットする手法について説明する。なお、移送許可の情報をセットするとは「移送可」とすることを意味し、一方、リセットするとは「移送不可」とすることを意味する。
【００６２】
Ｌｉｎｕｘ  ２．６では、コア毎に実行キューが存在する。本手法では、各コアの負荷を、スレッドがｃｏｎｄｉｔｉｏｎａｌ  ｗａｉｔから復帰してから実際にコア上で実行されるまでの時間を実行キューの長さで見積もり、その時間に応じて移送許可の情報をセット、リセットする。移送制御部は、各コアの実行キューの長さをサンプリングし、次の式（ＩＩＩ）が成り立つ場合には移送許可の情報をセットし、成り立たない場合には移送許可の情報をリセットする。
【００６３】
【数３】
2010128895.tif 000005
【００６４】
ここで、Ｌｓｉｍｐｌｅはシンプルコアの実行キューの長さの平均、Ｌｃｏｍｐｌｅｘは複雑コアの実行キューの長さ、Ｒはコンプレックスコアとシンプルコアの処理速度の比である。ここでは、Ｒを動作周波数の比として次の式（ＩＶ）のように定義する。
【００６５】
【数４】
2010128895.tif 000006
【００６６】
ここでＦｃｏｍｐｌｅｘおよびＦｓｉｍｐｌｅはそれぞれコンプレックスコアとシンプルコアの動作周波数である。ただし、コアの処理速度は、アプリケーションに依存するため、典型的なベンチマークを使って処理速度を計測しておき、その処理速度の比を使うことも可能である。また、本手法では、シンプルコアの実行キューの平均長を用いているが、移送をより保守的に行いたい場合は、シンプルコアの実行キューの長さの最小値を用いることもできる。このようにして、スレッドがシンプルコアからコンプレックスコアへ移送する際に参照する移送許可の情報を、移送制御部がセット、リセットすることができる。
【００６７】
以上、本発明を実施形態に則して説明したが、本発明は上述した実施形態に限るものではない。また、本発明の実施形態に記載された効果は、本発明から生じる最も好適な効果を列挙したに過ぎず、本発明による効果は、本発明の実施形態または実施例に記載されたものに限定されるものではない。
【図面の簡単な説明】
【００６８】
【図１】ロック競合に遭遇したスレッドのタイムチャートを示す図である。
【図２】本発明の一実施形態に係る、スレッド移送システムを示す図である。
【図３】本発明の一実施形態に係る、ロック取得時のスレッド移送アルゴリズムを示す図である。
【図４】本発明の一実施形態に係る、ロック解放時のスレッド移送アルゴリズムを示す図である。
【符号の説明】
【００６９】
１  スレッド移送システム
１０  ヘテロジニアス・マルチコアプロセッサ
２０  移動制御部
３０  シンプルコア
４０  ＯＳカーネル
５０  コンプレックスコア
６０  スレッド
【図１】
2010128895.tif 000007
【図２】
2010128895.tif 000008
【図３】
2010128895.tif 000009
【図４】
2010128895.tif 000010