(57)【要約】【課題】スレッドスケジューラのスケジューリング戦略によらず、マスタースレッドによる処理割り当てがワーカースレッドによって妨げられることなく、ワーカースレッドの動作開始を遅延させない処理割り当て装置を提供する。【解決手段】複数のコアを持つ中央演算装置に処理を割り当てる処理割り当て装置であって、複数のコアに割り当てられて処理を実行する複数の処理部と、処理部に処理を割り当てる割り当て部と、を備え、割り当て部は、割り当て部及び処理部がいずれのコアに割り当てられているのかを検出するコア割り当て検出部と、割り当て部が動作するコアに割り当てられている処理部よりも先に、割り当て部が動作するコアとは異なるコアに割り当てられている処理部を起床する起床部と、を有する処理割り当て装置とする。【選択図】      図１
2014238683.tif 000002
【特許請求の範囲】
【請求項１】
複数のコアを持つ中央演算装置に処理を割り当てる処理割り当て装置であって、
複数の前記コアに割り当てられて前記処理を実行する複数の処理部と、
前記処理部に前記処理を割り当てる割り当て部と、を備え、
前記割り当て部は、
前記割り当て部及び前記処理部がいずれの前記コアに割り当てられているのかを検出するコア割り当て検出部と、
前記割り当て部が動作する前記コアに割り当てられている前記処理部よりも先に、前記割り当て部が動作する前記コアとは異なる前記コアに割り当てられている前記処理部を起床する起床部と、を有することを特徴とする処理割り当て装置。
【請求項２】
前記処理部への前記処理の割り当てを決定し、前記割り当て部が動作する前記コアに割り当てられている前記処理部よりも先に、前記割り当て部が動作する前記コアとは異なる前記コアに割り当てられている前記処理部のうち指定された一つを起床することを前記起床部に指示する割り当て決定部を有し、
前記起床部は、前記割り当て決定部の指示に応じて前記処理部を起床することを特徴とする請求項１に記載の処理割り当て装置。
【請求項３】
複数の前記処理部のそれぞれに対応するように設けられ、前記割り当て決定部を介して前記割り当て部から複数の前記処理部へと処理を転送する複数の転送部を備えることを特徴とする請求項１又は２に記載の処理割り当て装置。
【請求項４】
前記コア割り当て検出部は、
前記割り当て部及び前記処理部を割り当てる前記コアを記録した表を用いて、前記割り当て部が動作する前記コアと、前記処理部の割り当てられている前記コアと、を調べることを特徴とする請求項１乃至３のいずれか一項に記載の処理割り当て装置。
【請求項５】
前記コア割り当て検出部は、
一意に決められた前記処理部の識別子と前記コアの割り当てを基に、前記識別子から前記処理部が割り当てられている前記コアを調べることを特徴とする請求項１乃至３のいずれか一項に記載の処理割り当て装置。
【請求項６】
前記割り当て部は、
複数の前記処理部の起床を前記起床部に指示する処理投入部を有し、
指定された複数の前記処理部の中から待ち状態にあると同時に前記割り当て部とは異なる前記コアに割り当てられている前記処理部があることが前記コア割り当て検出部によって判明した場合、
前記起床部は、
前記処理投入部の指示に応じて、前記割り当て部が動作する前記コアとは異なる前記コアに割り当てられている前記処理部の中から一つの前記処理部を起床することを特徴とする請求項１に記載の処理割り当て装置。
【請求項７】
前記処理投入部を介して前記割り当て部から複数の前記処理部へと前記処理を転送する処理転送部を備えることを特徴とする請求項６に記載の処理割り当て装置。
【請求項８】
前記処理投入部は、
条件変数に対するシグナルの送信を待っている処理部の全てを起床する指示を前記起床部に出し、
前記起床部は、
前記処理投入部の指示に応じて一つの前記処理部を起床し、起床した前記処理部が確保したロックに対して、起床させていない前記処理部を待ち状態とすることを特徴とする請求項６又は７に記載の処理割り当て装置。
【請求項９】
複数のコアを持つ中央演算装置に処理を割り当てる処理割り当て方法であって、
複数の前記コアに割り当てられて前記処理を実行する処理実行工程と、
前記処理部に前記処理を割り当てる処理割り当て工程と、を含み、
前記処理割り当て工程において、
前記割り当て工程及び前記処理実行工程がいずれの前記コアに割り当てられているのかを検出するコア割り当て検出工程と、
前記割り当て工程を実行する前記コアに割り当てられている前記処理実行工程よりも先に、前記割り当て工程を実行する前記コアとは異なる前記コアに割り当てられている前記処理実行工程を起床する起床工程と、を含むことを特徴とする処理割り当て方法。
【請求項１０】
複数のコアを持つ中央演算装置に処理を割り当てる処理割り当てプログラムであって、
複数の前記コアに割り当てられて前記処理を実行する処理実行処理と、
前記処理部に前記処理を割り当てる処理割り当て処理と、を含み、
前記処理割り当て処理において、
前記割り当て処理及び前記処理実行処理がいずれの前記コアに割り当てられているのかを検出するコア割り当て検出処理と、
前記割り当て処理を実行する前記コアに割り当てられている前記処理実行処理よりも先に、前記割り当て処理を実行する前記コアとは異なる前記コアに割り当てられている前記処理実行処理を起床する起床処理と、をコンピュータに実行させることを特徴とする処理割り当てプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マスタースレッドからワーカースレッドに処理を割り当てる処理割り当て装置、処理割り当て方法及び処理割り当てプログラムに関する。特に、マルチコアプロセッサ上での並列処理に関する。
【背景技術】
【０００２】
マルチコアシステムでは、複数のスレッドを複数のＣＰＵコア（以下コア）上で動作させるマルチスレッド処理が行われる（ＣＰＵ：Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）。
【０００３】
マルチスレッド処理では、スレッドスケジューラが、どのＣＰＵコア（以下、コア）にスレッドを割り当てるか、同じコアに割り当てられた複数のスレッドのうちどのスレッドをコアで実行するか、といったスケジューリング処理を行う。典型的には、ＯＳがスレッドスケジューラを備えている（ＯＳ：Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）。
【０００４】
一般に、スレッドスケジューラは、スレッドをコアにバインドする機能を提供する。スレッドをコアにバインドすると、スレッドスケジューラは、そのスレッドを常にバインドされたコアに割り当てる。バインドを行うと、スレッドの動作するコアが変わるスレッドマイグレーションによるオーバーヘッドを削減することや、ＣＰＵキャッシュを効率的に利用できるといった利点がある。このため、マルチスレッド処理の性能を向上させるために、スレッドとコアとをバインドすることがしばしば利用される。
【０００５】
一方で、マルチスレッド処理で利用される処理方式の一つに、マスターワーカーモデルがある。マスターワーカーモデルでは、マスタースレッドＭが複数のワーカースレッドに処理を割り当て、ワーカースレッドが割り当てられた処理を行う、という方式によって並列処理が行われる。
【０００６】
マスターワーカーモデルでは、利用可能なコア数と同数のワーカースレッドを用いることで、コアを最大限に使って処理するという方式をとることができる。マスターワーカーモデルにおいてスレッドのコアへのバインドを用いる場合、マスタースレッドは、ワーカースレッドの一つと同じコアにバインドされることになる。
【０００７】
図１２に、マスタースレッドによるワーカースレッドへの処理の割り当ての例を示す。図１２の例は、４コアを利用する場合の例であり、一つのマスタースレッドＭと４つのワーカースレッドＷ０〜Ｗ３を用いている。なお、マスタースレッドＭとワーカースレッドＷ０とは、同じコア０にバインドされている。
【０００８】
処理が割り当てられる前、各ワーカーはスリープ状態にある。したがって、ワーカーのみが割り当てられたコア１〜３はアイドル状態である。
【０００９】
マスタースレッドＭは、４つの処理Ｊ０〜Ｊ３をワーカースレッドＷ０〜Ｗ３に割り当てる。図１２の例では、マスタースレッドＭは、まず処理Ｊ０をワーカースレッドＷ０に、次に処理Ｊ１をワーカースレッドＷ１に、次に処理Ｊ２をワーカースレッドＷ２に、次に処理Ｊ３をワーカースレッドＷ３に、という順番に割り当てている。処理の割り当ては、スレッドライブラリやＯＳが提供するＡＰＩによって行うことができる（ＡＰＩ：Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）。
【００１０】
処理が割り当てられると、各ワーカースレッドは、スリープ状態から実行可能状態になる。スレッドスケジューラは、実行可能状態になったスレッドをコアに割り当てて実行させる。ワーカースレッドＷ１、Ｗ２及びＷ３がバインドされているコアは、処理の割り当て前はアイドル状態にあるので、各ワーカースレッドは処理が割り当てられると直ちに実行を開始する。
【００１１】
一方、コア０では、マスタースレッドＭも実行可能状態にある。そのため、ワーカースレッドＷ０が実行可能状態となって、マスタースレッドＭ及びワーカースレッドＷ０の二つのスレッドが実行可能状態にあるときに、いずれのスレッドをコアで実行するかは、スレッドスケジューラによるスレッドスケジューリングによって決められる。
【００１２】
図１２の例では、スレッドスケジューラは、マスタースレッドＭをコア０で実行させる。したがって、ワーカースレッドＷ０は、マスタースレッドＭの割り当て処理が終わり、スリープ状態になった後に実行される。なお、マスタースレッドＭの割り当て処理に要する時間に比べて、各ワーカースレッドで実行されるジョブの処理時間は十分長い場合は、割り当て処理に要する時間が性能に及ぼす影響は無視できる程度である。
【００１３】
図１３は、スレッドスケジューラが異なるスケジューリング戦略をとった場合の処理割り当て例である。図１３の例では、ワーカースレッドＷ０に処理が割り当てられ実行可能になった時点で、スレッドスケジューラが、マスタースレッドＭではなく、ワーカースレッドＷ０をコアで実行させるというスケジューリングを行う。この場合は、マスタースレッドＭがワーカースレッドＷ１〜３に処理を割り当てる前に、ワーカースレッドＷ０の実行が始まってしまう。そのため、ワーカースレッドＷ０への処理の割り当てが遅れ、コア１〜３はアイドル状態が続く。
【００１４】
一般に、スレッドスケジューラは、同一コアで複数のスレッドが実行可能状態にある場合、タイムスライスと呼ばれるスケジューリングをとることがある。タイムスライスでは、特定のスレッドのみがコアで実行され続けて、他のスレッドが全く実行されないという事態を防ぐために、一定時間が経過すると、別のスレッドをコアで実行するというスケジューリングが行われる。
【００１５】
図１３の例では、ワーカースレッドＷ０がタイムスライスを使い果たした時点で、再びマスタースレッドＭがコアで実行され、処理割り当てを継続し、ワーカースレッドＷ１〜３に処理が割り当てられる。その結果、それぞれのワーカースレッドが実行を開始する。
【００１６】
特許文献１には、複数のプロセッサを備えるマルチプロセッサ・システムにおいて、プリエンティブ優先度スケジューリングに基づいてスレッドをスケジューリングする方法が開示されている。特許文献１の方法では、ローカル・ディスパッチ・キュー及びグローバル・キューの中に含まれる優先度の高いスレッドがある場合、そのスレッドを最優先して選択する。
【先行技術文献】
【特許文献】
【００１７】
【特許文献１】特開平１０−５５２８４号公報
【発明の概要】
【発明が解決しようとする課題】
【００１８】
図１３に示した処理割り当ての場合は、図１２の例に比べて、タイムスライスの分だけ最後のジョブが終わる時間が遅くなる。タイムスライスの長さがジョブの実行時間に比べて無視できるほど短くない場合は、この遅延が性能劣化を招くことになる。タイムスライスの長さは、スレッドスケジューラや設定によって異なるが、ミリ秒オーダーの時間が用いられることが多く、ジョブの実行時間に比べて無視できない場合も多い。すなわち、図１３のようなマスターワーカーモデルでは、スレッドスケジューラのスケジューリング戦略によっては、マスタースレッドからワーカースレッドへの処理の割り当て時に遅延が発生し、性能が低下するという課題がある。
【００１９】
特許文献１の方法では、高優先度のタスクがバグのために無限ループした際にＣＰＵを占有し続けたり、優先度の設定に間違いや変更があった場合に想定外の動作をしたりするという課題がある。
【００２０】
本発明の目的は、スレッドスケジューラのスケジューリング戦略によらず、マスタースレッドによる処理割り当てがワーカースレッドによって妨げられることなく、ワーカースレッドの動作開始を遅延させない処理割り当て装置を提供することである。
【課題を解決するための手段】
【００２１】
本発明の処理割り当て装置は、複数のコアを持つ中央演算装置に処理を割り当てる処理割り当て装置であって、複数のコアに割り当てられて処理を実行する複数の処理部と、処理部に処理を割り当てる割り当て部と、を備え、割り当て部は、割り当て部及び処理部がいずれのコアに割り当てられているのかを検出するコア割り当て検出部と、割り当て部が動作するコアに割り当てられている処理部よりも先に、割り当て部が動作するコアとは異なるコアに割り当てられている処理部を起床する起床部と、を有する。
【００２２】
本発明の処理割り当て方法は、複数のコアを持つ中央演算装置に処理を割り当てる処理割り当て方法であって、複数のコアに割り当てられて処理を実行する処理実行工程と、処理部に処理を割り当てる処理割り当て工程と、を含み、処理割り当て工程において、割り当て工程及び処理実行工程がいずれのコアに割り当てられているのかを検出するコア割り当て検出工程と、割り当て工程を実行するコアに割り当てられている処理実行工程よりも先に、割り当て工程を実行するコアとは異なるコアに割り当てられている処理実行工程を起床する起床工程と、を含む。
【００２３】
本発明の処理割り当てプログラムは、複数のコアを持つ中央演算装置に処理を割り当てる処理割り当てプログラムであって、複数のコアに割り当てられて処理を実行する処理実行処理と、処理部に処理を割り当てる処理割り当て処理と、を含み、処理割り当て処理において、割り当て処理及び処理実行処理がいずれのコアに割り当てられているのかを検出するコア割り当て検出処理と、割り当て処理を実行するコアに割り当てられている処理実行処理よりも先に、割り当て処理を実行するコアとは異なるコアに割り当てられている処理実行処理を起床する起床処理と、をコンピュータに実行させる。
【発明の効果】
【００２４】
本発明によれば、スレッドスケジューラのスケジューリング戦略によらず、マスタースレッドによる処理割り当てがワーカースレッドによって妨げられることなく、ワーカースレッドの動作開始を遅延させない処理割り当て装置を提供することができる。
【図面の簡単な説明】
【００２５】
【図１】本発明の第１の実施形態に係る処理割り当て装置の構成を示すブロック図である。
【図２】本発明の第１の実施形態に係る処理割り当て装置における処理部の動作に関するフローチャートである。
【図３】本発明の第１の実施形態に係る処理割り当て装置における割り当て部の動作に関するフローチャートである。
【図４】本発明の第２の実施形態に係る処理割り当て装置の構成を示すブロック図である。
【図５】本発明の第２の実施形態に係る処理割り当て装置における割り当て部の動作に関するフローチャートである。
【図６】本発明の実施例１に係る処理割り当て装置の構成を示す図である。
【図７】本発明の実施例１に係るスレッド接続を説明するための図である。
【図８】本発明の実施例１に係るマスタースレッドの構成を示す図である。
【図９】本発明の実施例１に係るワーカースレッドの構成を示す図である。
【図１０】本発明の実施例１における処理の割り当てを説明するための図である。
【図１１】本発明の実施例２に係るスレッド接続を説明するための図である。
【図１２】マスタースレッドからワーカースレッドへの処理の割り当てを説明するための図である。
【図１３】マスタースレッドからワーカースレッドへの処理の割り当てにおいて、スレッドスケジューラが異なるスケジューリング戦略をとった場合の例を説明するための図である。
【発明を実施するための形態】
【００２６】
以下に、本発明を実施するための形態について図面を用いて説明する。但し、以下に述べる実施形態には、本発明を実施するために技術的に好ましい限定がされているが、発明の範囲を以下に限定するものではない。
【００２７】
なお、本発明の実施形態及び実施例においては、スレッドを例として説明しているが、本発明の実施形態及び実施例の手法は、プロセスに関しても適用可能である。
【００２８】
（第１の実施形態）
（構成）
まず、本発明の第１の実施形態に係る処理割り当て装置１について、図面を参照して詳細に説明する。
【００２９】
図１は、本発明の第１の実施形態に係る処理割り当て装置１の構成を示す図である。
【００３０】
本実施形態に係る処理割り当て装置１は、割り当て部１０と、複数の処理部２０と、処理部２０と同数の転送部３０と、を備える。
【００３１】
割り当て部１０は、割り当て決定部１１と、起床部１２と、コア割り当て検出部１３と、を備える。
【００３２】
割り当て決定部１０は、処理を割り当てる処理部２０を決定する機能及び転送部３０を通して処理を処理部２０に渡す機能を有する。
【００３３】
起床部１２は、指定された一つもしくは複数の処理部２０の中から待機中の一つもしくは全部をスリープ状態から起床する機能を有する。
【００３４】
コア割り当て検出部１３は、割り当て部１０又は処理部２０が割り当てられているコアを検出する機能を有する。
【００３５】
処理部２０は、待機部２１と、受信部２２と、実行部２３と、を備える。複数の処理部２０は、それぞれ同じ構成を有する。
【００３６】
待機部２１は、処理が割り当てられるまでスリープする機能を有する。なお、スリープするとは、スレッドスケジューラによってコアへ割り当てられることがない状態となることである。
【００３７】
受信部２２は、転送部３０から処理を受信して実行部２３を呼び出す機能及び、転送部３０から処理を受信できない場合に待機部２１を呼び出す機能を有する。
【００３８】
実行部２３は、受信部２２から処理を受け取り、処理を実行する機能を有する。
【００３９】
転送部３０は、処理を割り当て部１０から処理部２０に転送する機能を有する。なお、本実施形態では、転送部３０は処理部２０と同数だけあり、各転送部３０は、特定の一つの処理部２０との転送において専用に利用される。したがって、割り当て部１０は、処理を処理部２０に割り当てる際には、対応する転送部３０を利用して処理を受け渡す。
【００４０】
以上が、本発明の第１の実施形態に係る処理割り当て装置１の構成についての説明である。
【００４１】
次に、本実施形態の動作について説明する。
【００４２】
（処理部の動作）
まず、図２を用いて、処理部２０の動作を説明する。処理部２０は、以下のように、待機と実行を繰り返す。
【００４３】
処理部２０は、待機部２１を呼び出して、処理の割り当て待ちのためのスリープ状態に入る（ステップＳ１）。
【００４４】
処理部２０は、起床部１２によって起床される（ステップＳ２でＹｅｓ）と、受信部２２を呼び出す（ステップＳ３）。
【００４５】
なお、気象部１２によって起床されていない場合（ステップＳ２でＮｏ）、ステップＳ１のまま待機する。
【００４６】
ここで、受信部２２は、転送部３０から処理を受信可能か調べる（ステップＳ４）。
【００４７】
受信不可能な場合（ステップＳ４でＮｏ）、ステップＳ１に戻る。
【００４８】
処理を受信可能な場合（ステップＳ４でＹｅｓ）、受信部２２は、転送部３０から処理を受信する（ステップＳ５）。
【００４９】
処理を受信後、受信部２２は、実行部２３を呼び出す（ステップＳ６）。
【００５０】
実行部２３は、処理を実行する（ステップＳ７）。
【００５１】
処理の実行が終了したら、処理部２０は、ステップＳ３に戻り受信部２２を呼び出す。
【００５２】
以上が、処理部２０の動作である。
【００５３】
（割り当て部の動作）
次に、図３を用いて、割り当て部１０の動作について説明する。割り当て部１０は、割り当てる処理の集合と、割り当て先の処理部２０の集合を指定して呼び出される。典型的には、処理の数と処理部２０の数はともに利用可能なコア数と等しい。
【００５４】
図３において、割り当て決定部１１は、コア割り当て検出部１３を呼び出し、自身と処理部２０とが割り当てられているコアとを調べる（ステップＳ１１）。なお、本実施形態で呼ぶ自身とは、割り当て部１０が動作するコアを意味する。
【００５５】
コア割り当て検出部１３は、自身とは異なるコアに割り当てられている処理部２０が存在するかどうか調べる（ステップＳ１２）。
【００５６】
自身とは異なるコアに割り当てられている処理部２０が存在する場合（ステップＳ１２でＹｅｓ）、下記のステップＳ１３〜Ｓ１６のフローで動作する。
【００５７】
割り当て決定部１１は、異なるコアに割り当てられている処理部２０中の一つを選ぶ（ステップＳ１３）。なお、ステップＳ１３において複数の処理部２０の中から一つのスレッドを選ぶ方法としては、任意の方法を用いることができる。
【００５８】
割り当て決定部１１は、選ばれた処理部２０に対応する転送部３０を用いて処理の転送を行う（ステップＳ１４）。
【００５９】
起床部１２は、選択した処理部２０の待機部２１に対して、起床するように指示する（ステップＳ１５）。
【００６０】
ここで、起床しようとする処理部２０がスリープ状態にある場合、スリープ状態にある処理部２０が起床される。なお、対象となる処理部２０がスリープ状態にない場合は何も起こらない。また、本実施形態では、起床部１２に選択された一つの処理部２０の起床を指示するため、選択された処理部２０のみが起床されることに注意する必要がある。
【００６１】
処理が終了した後に、割り当て先の処理部２０の集合から、割り当てた処理部２３を削除する（ステップＳ１６）。
【００６２】
割り当てる処理が残っている場合（ステップＳ１７でＹｅｓ）、ステップＳ１２に戻り、ステップＳ１６までの処理を繰り返す。
【００６３】
ここで、割り当てる処理が残っていない場合（ステップＳ１７でＮｏ）、図３のフローチャートに従った動作を終了する。
【００６４】
なお、処理の数と処理部の数がともに利用可能なコア数と等しく設定されていた場合は、ステップＳ１７を省くことも可能である。
【００６５】
また、割り当て部１０自身と異なるコアに割り当てられている処理部２０が存在しない場合（ステップＳ１２でＮｏ）、割り当て処理部１１は、割り当て部１０自身と同じコアに割り当てられている処理部２０があれば、処理を割り当てる（ステップＳ１８）。この後の動作は、ステップＳ１４〜Ｓ１６と同様である。
【００６６】
自身と同じコアに割り当てられている処理部２０に処理を割り当てた後には、異なるコアに割り当てられた処理は存在しない。そのため、ステップＳ１４〜Ｓ１６を経た後に、ステップＳ１７でＮｏとなるため、割り当て部１０の動作を終了する。
【００６７】
以上の動作では、処理部２０の数よりも処理の数が多い場合には、以上の動作が終了した際に、割り当てられていない処理が残ることになる。この場合は、直ちに再び上記の割り当て動作を行って割り当てを行っても良いし、割り当てた処理が終了するのを待ってから、割り当て動作を行ってもよい。
【００６８】
以上が、本発明の第１の実施形態に係る処理割り当て装置１の動作についての説明である。
【００６９】
また、図２及び図３の動作フローを用いる処理割り当て方法も、本実施形態の範囲に含まれる。本実施形態の処理割り当て方法においては、複数の処理を処理部に割り当てる場合に、割り当て部が、割り当て部及び処理部が割り当てられているコアを調べる。そして、割り当て部が、割り当て部自身の割り当てられたコアとは異なるコアに割り当てられている処理部に対して優先的に処理を割り当てることを特徴とする。なお、第１の実施形態に係る処理割り当て方法は、必ずしも図１に示した処理割り当て装置１の構成に限定されず、図２及び図３の動作フローを用いた処理割り当て方法であれば、本実施形態の範囲に含まれる。この際、図２及び図３の動作フローの一部を変更しても、本実施形態と同様の効果が得られれば、本実施形態の範囲に含まれる。さらに、本実施形態の処理割り当て方法を用いた処理をコンピュータに実行させる処理割り当てプログラムも、本実施形態の範囲に含まれる。
【００７０】
（効果）
本発明の第１の実施形態によれば、割り当て部と同じコアに割り当てられている処理部２０に対しては最後に処理が割り当てられる。したがって、割り当て部の割り当て動作中に、他のコアがあいているにも関わらず、同じコアで実行部の動作が開始し、割り当て部の動作が中断してしまうということがない。
【００７１】
（第２の実施形態）
（構成）
次に、本発明の第２の実施形態に係る処理割り当て装置１について、図面を参照して詳細に説明する。
【００７２】
図４は、本発明の第２の実施形態に係る処理割り当て装置２の構成を示す図である。なお、ここでは、第１の実施形態と同様の構成については説明を省略し、第２の実施形態に係る処理割り当て装置２において特徴的な構成について説明する。
【００７３】
本実施形態に係る処理割り当て装置２は、第１の実施形態の転送部３０と同様の機能を有する処理転送部３５を一つ備える。すなわち、全ての処理部２０は、同一の処理転送部３５から処理を受信する。
【００７４】
また、本実施形態では、第１の実施形態に係る割り当て決定部１１の代わりに、処理投入部１６が利用される。
【００７５】
処理投入部１６は、指定された処理を処理転送部３５に投入し、起床部１７に対して複数の処理部２０の中から一つを起床するように指示する機能を有する。
【００７６】
本実施形態の起床部１７は、第１の実施形態に係る起床部１２と同様に、指定された一つもしくは複数の処理部２０の中から、待機中の一つ又は全部をスリープ状態から起床する機能を有する。起床部１７は、待機中である複数の処理部２０の中から一つの処理部２０を起床する場合に、コア割り当て検出部１８を呼び出して、自身が割り当てられているコアと異なるコアに割り当てられている処理部２０を起床するという機能を有する。
【００７７】
（割り当て部の動作）
次に、図５を用いて本実施形態の動作について説明する。処理部２０の動作は、第１の実施形態と同様であるので、割り当て部１５の動作について詳細に説明する。割り当て部１５は、割り当てる処理の集合と、割り当て先の処理部２０の集合を指定して呼び出される。典型的には、コア数と同数の処理部２０と一つの処理が指定される。
【００７８】
図５において、処理投入部１６は、指定された処理を全て処理転送部３５に投入する（ステップＳ２１）。
【００７９】
以下のステップＳ２２〜Ｓ２７の動作は、処理の数だけ繰り返される。
【００８０】
処理投入部１６は、起床部１７に対して割り当て先の処理部２０の中から一つを起床するように指示する（ステップＳ２２）。
【００８１】
起床部１７は、対象となる処理部２０の中に待機中（スリープ中）の処理部２０があれば（ステップＳ２３でＹｅｓ）、その待機中の処理部２０を候補処理部とする（ステップＳ２４）。なお、待機中の処理部２０がなければ（ステップＳ２３でＮｏ）、ステップＳ２９に進む。
【００８２】
起床部１７は、コア割り当て検出部１８を呼び出し、候補処理部が割り当てられているコア及び自身が割り当てられているコアをコア割り当て検出部１８に調べさせる（ステップＳ２５）。
【００８３】
コア割り当て検出部１８は、自身と異なるコアに割り当てられている候補処理部が存在するか調べる（ステップＳ２６）。
【００８４】
自身と異なるコアに割り当てられている候補処理部が存在する場合（ステップＳ２６でＹｅｓ）、対象となる処理部２０を起床する（ステップＳ２７）。
【００８５】
ステップＳ２７の後、ステップＳ２３に戻り、割り当てが終了するまで処理を繰り返す。
【００８６】
自身と異なるコアに割り当てられている候補処理部が存在しない場合（ステップＳ２６でＮｏ）、自身と同じコアに割り当てられている処理部２０を起床する（ステップＳ２８）。
【００８７】
割り当てる処理が残っている場合（ステップＳ２９でＹｅｓ）、ステップＳ２２に戻り、割り当てが終了するまで処理を繰り返す。
【００８８】
割り当てる処理が残っていない場合（ステップＳ２９でＮｏ）、図５のフローは終了となる。
【００８９】
なお、処理の数と処理部の数がともに利用可能なコア数と等しく設定されていた場合は、ステップＳ２９を省くことも可能である。
【００９０】
以上が、本発明の第２の実施形態に係る処理割り当て装置２の動作についての説明である。また、図２及び図５の動作フローを用いる処理割り当て方法も、本実施形態の範囲に含まれる。なお、第２の実施形態に係る処理割り当て方法は、必ずしも図１に示した処理割り当て装置１の構成に限定されず、図２及び図５の動作フローを用いた処理割り当て方法であれば、本実施形態の範囲に含まれる。この際、図２及び図５の動作フローの一部を変更しても、本実施形態と同様の効果が得られれば、本実施形態の範囲に含まれる。さらに、本実施形態の処理割り当て方法を用いた処理をコンピュータに実行させる処理割り当てプログラムも、本実施形態の範囲に含まれる。
【００９１】
（効果）
本発明の第２の実施形態によれば、割り当て部とは異なるコアに割り当てられている処理部に先に処理が割り当てられる。そのため、スリープ状態の処理部があるにも関わらず、割り当て部の動作が中断して、同じコアで処理部が動作するということがない。
【００９２】
さらに、第２の実施形態によれば、処理部が一つの処理転送部から処理を受け取るような構成の場合にも適用できる。
【００９３】
（実施例１）        
次に、具体的な実施例を用いて本発明の実施形態に係る処理割り当て装置の動作について説明する。
【００９４】
図６は、本発明の実施例１の構成を説明するための図面である。
【００９５】
実施例１では、メモリ４１を構成した４コアのＣＰＵ４２（コア０〜３）上に、単一のＯＳ４３が搭載されている（ＣＰＵ：Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）。また、ＯＳ４３上には、一つのマスタースレッド４０（Ｍ）と４つのワーカースレッド５０（Ｗ０〜Ｗ３）が乗っている。なお、ＯＳ４３は、スレッドスケジューリング機能を備えている。
【００９６】
図７は、実施例１のマスタースレッドＭとワーカースレッドＷ０〜Ｗ３の接続を説明するための図面である。
【００９７】
実施例１では、各ワーカースレッドＷ０〜Ｗ３に対して、対応する専用のキュー６０〜６３を用いている。
【００９８】
マスタースレッドＭがワーカースレッドＷ０〜Ｗ３のそれぞれに対応する専用のキュー６０〜６３に処理を投入すると、ワーカースレッドＷ０〜Ｗ３は、専用のキュー６０〜６３に投入された処理を実行するという方式をとる。
【００９９】
専用のキュー６０〜６３は、複数のスレッドからアクセスさせるため、排他処理を用いてアクセスされる。
【０１００】
また、ワーカースレッドＷ０〜Ｗ３は、対応するキュー６０〜６３が空の場合は、割り当て待ち状態に入る。
【０１０１】
一般に、スレッド機能を提供するスレッドライブラリは、スレッド間での排他処理や待ち状態を実現するための機能を提供している。例えば、ＰＯＳＩＸスレッド（ｐｔｈｒｅａｄ）は、ｍｕｔｅｘと呼ばれる排他処理を実現できる機能や、条件変数と呼ばれる待ち状態を実現できるＡＰＩを提供している（ＰＯＳＩＸ：Ｐｏｒｔａｂｌｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅ、ｍｕｔｅｘ：ｍｕｔｕａｌ  ｅｘｃｌｕｓｉｏｎ）。
【０１０２】
ｍｕｔｅｘは、ロック変数に対するロック・アンロックによって排他処理を行うことができる。条件変数は、条件変数に対するシグナルが送信されるまでスリープ状態で待つ機能と、シグナルを送信して条件変数を待っているスレッドを起床する機能によって、待ち状態を実現することができる。なお、これらのスレッドに関する機能は一般的なものであるので、ここでは詳細な説明は省略する。
【０１０３】
図８は、実施例１のマスタースレッドＭの構成を示した図である。
【０１０４】
マスタースレッドＭは、本発明の第１の実施形態に係る割り当て部１０（図１）と同じ構成の割り当て部１０を備えている。関連する構成要素の機能は、第１の実施形態と同様であるために同一の符号を付し、詳細な説明は省略する。
【０１０５】
割り当て決定部１１は、ワーカースレッドＷ０〜Ｗ３のそれぞれに対応する専用のキュー６０〜６３に接続されている。なお、起床部１２は、スレッドライブラリが提供する機能であるが、マスタースレッドＭによって実行されるため、マスタースレッドＭの中に記載している。
【０１０６】
図９は、実施例１に係るワーカースレッドＷ０〜Ｗ３の一つの構成を示した図である。なお、全てのワーカースレッドＷ０〜Ｗ３は同じ構成である。ワーカースレッドＷ０〜Ｗ３は、本発明の第１の実施形態に係る処理部２０と同じ構成の処理部を備えている。関連する構成要素の機能は、第１の実施形態と同様であるために同一の符号を付し、詳細な説明は省略する。
【０１０７】
受信部２２は、スレッド毎の専用のキュー６０〜６３に接続されている。
【０１０８】
実施例１では、キュー６０〜６３毎にロック変数と条件変数を用いて、キュー６０〜６３毎の排他処理と待ち処理を行う。なお、これらは図面では省略されている。
【０１０９】
次に、本実施例の動作について説明する。まず、ワーカースレッドＷ０〜Ｗ３の動作について説明する。
【０１１０】
ワーカースレッドＷ０〜Ｗ３の受信部２２は、対応する専用のキュー６０〜６３に処理が格納されているか調べる。キュー６０〜６３に処理が格納されている場合は、その処理を取り出して実行する。
【０１１１】
実行が終わると、ワーカースレッドＷ０〜Ｗ３の受信部２２は、再びキュー６０〜６３に処理が格納されているか調べる。
【０１１２】
処理が格納されていない場合、すなわちキュー６０〜６３が空の場合、ワーカースレッドＷ０〜Ｗ３は、キュー６０〜６３毎に用意された条件変数に対する待ち状態に入る。
【０１１３】
この待ち状態からは、マスタースレッドＭがシグナルを送信すると起床され、その後再度キュー６０〜６３のチェックを行う。
【０１１４】
マスタースレッドＭの特徴的な動作は、下記の２点である。
【０１１５】
一つは、割り当て決定部１１が、割り当ての決定後に、処理を割り当てワーカースレッドに対応するキューに処理を投入することである。
【０１１６】
もう一つは、割り当て決定部１１が、スレッドライブラリの提供する条件変数に対するシグナルを送信するＡＰＩを呼び出すことによって、起床部１２を呼び出すことである。
【０１１７】
本実施例１では、ワーカースレッドＷ０〜Ｗ３毎に条件変数が容易されているため、割り当て決定部１１は、起床するワーカースレッドＷ０〜Ｗ３を指定して起床部１２を呼び出すことができる。
【０１１８】
次に、具体的な割り当ての例を用いて本実施例の動作について説明する。
【０１１９】
この動作例では、４つの処理Ｊ０〜Ｊ３をワーカースレッドＷ０〜Ｗ３に割り当てる場合の例について示す。なお、本動作例においては、Ｊ０はＷ０、Ｊ１はＷ１、Ｊ２はＷ２、Ｊ３はＷ３というように対応して割り当てる場合について説明するが、これに限らない場合にも容易に応用できる。
【０１２０】
本動作例では、マスタースレッドＭはコア０に、ワーカースレッドＷ０はコア０に、ワーカースレッドＷ１はコア１に、ワーカースレッドＷ２はコア２に、というようにバインドされている。
【０１２１】
スレッドのコアへの割り当ては、ＯＳ４３のスレッドスケジューラによって行われる。スレッドのコアへのバインドには、ＯＳ４３が適用するＡＰＩを用いることができる。
【０１２２】
例えば、Ｌｉｎｕｘ（登録商標）では、ｓｃｈｅｄ＿ｓｅｔａｆｆｉｎｉｔｙ関数を用いることができる。これは、スレッドを割り当てることが可能なコアを指定するＡＰＩで、ただ一つのコアを指定することによって、特定のコアにバインドすることができる。
【０１２３】
割り当て処理が開始されると、マスタースレッドＭの割り当て決定部１１は、コア割り当て検出部１３を用いて、各スレッドが割り当てられているコアを調べる。なお、コアを調べるためには、ＯＳ４３のＡＰＩを利用することができる。
【０１２４】
例えば、Ｌｉｎｕｘでは、ｓｃｈｅｄ＿ｇｅｔａｆｆｉｎｉｔｙ関数によって、スレッドを割り当て可能なコア集合を得ることができる。このコア集合がただ一つのコアを含む場合は、スレッドが割り当てられているコアはただ一つに特定することができる。集合が複数のコアを含む場合は、含まれる全てのコアに割り当てられる可能性があるとする方法をとることができる。
【０１２５】
次に、割り当て決定部１１は、調べたスレッドとコアの関係から、マスタースレッドＭと異なるコアに割り当てられたスレッドの集合を求める。本動作例では、ワーカースレッドＷ１、Ｗ２、Ｗ３である。
【０１２６】
次に、この中から処理の割り当てを行うワーカースレッドを一つ決める。本動作例では、スレッド番号が小さい順番に選ぶ。この場合、はじめにワーカースレッドＷ１が選ばれる。割り当て決定部１１は、ワーカースレッドＷ１に割り当てる処理Ｊ１をワーカースレッドＷ１に対応するキュー６１に投入する。
【０１２７】
次に、ワーカースレッドＷ１を起床するために起床部１２を呼び出し、キュー６１に対応する条件変数に対してシグナルを送る。
【０１２８】
このスレッドによって、ワーカースレッドＷ１が起床し、前述したように処理が実行される。なお、ワーカースレッドＷ１が待ち状態にない場合、シグナルは無視されるものの、キュー６１に処理は入れられるため、ワーカースレッドＷ１が次にキュー６１を確認した際に、割り当てられた処理が見つけられ実行される。
【０１２９】
次に、割り当て決定部１１は、ワーカースレッドＷ２を割り当て対象に選び、同様に割り当て処理が行われる。
【０１３０】
その後、ワーカースレッドＷ３に割り当てを行った後に、マスタースレッドＭとは異なるコアのワーカースレッドはないため、同じコアに割り当てられたワーカースレッドＷ０に処理を割り当てる。以上によって、割り当て処理は完了する。
【０１３１】
図１０に、以上の動作によって割り当てが行われた場合の、割り当て結果を示す。
【０１３２】
図１０に示されているように、ワーカースレッドＷ０に最後に割り当てが行われるために、コア１−３でワーカースレッドＷ１〜Ｗ３の動作の開始が遅れていない。
【０１３３】
なお、本動作例では、各処理を割り当てるワーカースレッドはあらかじめ決められていたが、割り当て決定部１１が決めるという構成としても良い。第１の実施形態の特徴は、処理を割り当てるスレッドの順番に関するものであるから、この場合の処理を割り当てるスレッドの決め方は本実施形態の特徴とは独立している。
【０１３４】
（変形例）
実施例１の変形例１として、割り当て部１０及び処理部２０を割り当てるコアとスレッドをあらかじめ表に記録し、コア割り当て検出部１３がその表を参照することによって、コア割り当てを調べる構成としてもよい。
【０１３５】
この場合、処理割り当て時に毎回ＯＳ４３を呼び出してコア割り当てを調べるオーバーヘッドが発生しないという効果がある。
【０１３６】
また、実施例１の変形例２として、スレッド（処理部）の識別子（例えばスレッド番号）とコアの割り当てを一意に決めておき、コア割り当て検出部１３がスレッド識別子から割り当てられているコアを調べる方式としても良い。
【０１３７】
例えば、ワーカースレッドＷ０はコア０、ワーカースレッドＷ１はコア１、といったように割り当てが決められているといった場合である。この場合は、ＯＳ４３を呼び出すオーバーヘッドや表を参照するオーバーヘッドが発生しないという利点がある。また、この場合で、マスタースレッドＭをコア０に割り当てた場合、割り当て決定部１１は、スレッド番号の大きいワーカースレッドから順番に割り当てるという方法をとることができる。これは、異なるコアに割り当てられた複数のワーカースレッドの中から一つのスレッドを選ぶ方法の一つの例である。
【０１３８】
（実施例２）
次に本発明に係る実施例２について説明する。実施例２は、本発明の第２の実施形態に対応する実施例である。実施例２のワーカースレッド５０（Ｗ０〜Ｗ３）の構成は、ＯＳ４３、４コアのＣＰＵ４２（コア０〜３）の構成は、実施例１と同じである。また、スレッドとコアのバインドも実施例１と同様である。なお、実施例２のマスタースレッドＭ４０の構成は、図４に示した第２の実施形態に係る割り当て部１１に対応する。
【０１３９】
図１１に、実施例２のスレッドの接続関係を示す。実施例２では、マスタースレッドＭ４０と各ワーカースレッドＷ０〜Ｗ３とが単一のキュー６５で接続されていることを特徴とする。また、この場合は、キュー６５に対応した一つのロック変数と条件変数を用いて全てのスレッドが排他制御と待ち状態とを実現する。
【０１４０】
実施例２のような構成は、ワーカースレッドの数よりも多数の処理を割り当てる際に、各処理の処理時間がばらつく場合において用いられることがある。処理とワーカースレッドの割り当てを固定化すると、処理時間のばらつきにより、各コアの負荷バランスが悪くなる。そのため、一つにキュー６５に処理を投入し、処理の実行を終えたワーカースレッドが次の処理を取得するという方法がとられる。
【０１４１】
なお、実施例２のような構成であっても、実施例２によらない場合の全てのワーカースレッドＷ０〜Ｗ３がアイドル状態にあるときの処理の割り当てにおいては、ワーカースレッドへＷ０〜Ｗ３の処理の割り当て順によっては、マスタースレッドの処理割り当てが中断されてしまう。その結果、ワーカースレッドの処理が遅れて、コア４２のいずれかがアイドル状態となるという問題がある。
【０１４２】
実施例２で特徴的な動作は、条件変数が一つであるため、起床するスレッドは、割り当て決定部１１によって指定することができず、起床部１７（図４）によって決定されることである。実施例２では、４つのワーカースレッドＷ０〜Ｗ３が全てスリープ状態、すなわち条件変数に対する待ち状態にあるときに、マスタースレッドＭが一つの処理を割り当てる場合の動作について説明する。
【０１４３】
まず、処理投入部１６は、処理をキュー６５に投入後、起床部１７に対して条件変数を待っているスレッドのうち一つを起床するように指示する。
【０１４４】
起床部１７は、コア割り当て検出部１８を用いて、マスタースレッドＭとワーカースレッドＷ０〜Ｗ３が割り当てられているコアを調べる。
【０１４５】
起床部１７は、条件変数を待っているワーカースレッド５０のうち、マスタースレッドＭと異なるコアのワーカースレッド５０があればそれを起床し、なければ同じコアのワーカースレッドを起床する。
【０１４６】
この動作により、マスタースレッドＭと異なるコアのワーカースレッド５０が起床されるため、マスタースレッドＭは、後続の処理を継続することができるという効果がある。そのため、続いて複数の処理を割り当てる場合は、その割り当て処理が妨げられることがない。
【０１４７】
実施例２によらない場合は、最初の割り当てによって、マスタースレッドＭと同じコア０のワーカースレッドＷ０が起床された場合、後続の割り当て処理の実行が遅れることは明らかである。
【０１４８】
（変形例）
実施例２の変形例として、処理投入部１６は、起床部１７に対して条件変数に対するシグナルの送信を待っているスレッド（処理部）の全てを起床するように指示をしても良い。起床部１７は、全てのスレッドの起床を指示された場合も、まず、最初に一つのスレッドを起床し、その他のスレッドは、起床したスレッドが確保したロックに対する待ち状態にすることができる。
【０１４９】
このとき、最初に起床するスレッドを選択する際に、実施例２にあるように、マスタースレッドＭとワーカースレッド５０のコア割り当てを調べて、マスタースレッドＭとは異なるワーカースレッド５０を選ぶことができる。一般に、条件変数は、ロック変数とともに利用されるため、変形例のような動作をとることが可能である。
【０１５０】
以上、実施形態及び実施例を参照して本発明を説明してきたが、本発明は上記実施形態及び実施例に限定されるものではない。本発明の構成や詳細には、本発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【産業上の利用可能性】
【０１５１】
本発明は、科学技術計算において、マスタースレッドが大規模な配列を分割し、ワーカースレッドが行列計算を行うといった用途に利用することができる。また、本発明は、画像処理において、マスタースレッドが画像を分割して、ワーカースレッドが画像処理を行うといった処理に利用することができる。
【符号の説明】
【０１５２】
１、２    処理割り当て装置
１０、１５    割り当て部
１１    割り当て決定部
１２、１７    起床部
１６    処理投入部
１３、１８    コア割り当て検出部
２０    処理部
２１    待機部
２２    受信部
２３    実行部
３０    転送部
３５    処理転送部
４０    マスタースレッド
４１    メモリ
４２    コア
４３    ＯＳ
５０    ワーカースレッド
６０    キュー
【図１】
2014238683.tif 000003
【図２】
2014238683.tif 000004
【図３】
2014238683.tif 000005
【図４】
2014238683.tif 000006
【図５】
2014238683.tif 000007
【図６】
2014238683.tif 000008
【図７】
2014238683.tif 000009
【図８】
2014238683.tif 000010
【図９】
2014238683.tif 000011
【図１０】
2014238683.tif 000012
【図１１】
2014238683.tif 000013
【図１２】
2014238683.tif 000014
【図１３】
2014238683.tif 000015