(57)【要約】【課題】ユーザーが、並列処理パターンを提供する装置を利用しながらも、その並列処理パターンを実行するスレッドに属性を設定すること。【解決手段】並列処理装置は、ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリ（１０Ａ）を備える。モデルライブラリ（１０Ａ）は、スレッドを管理するスレッド管理部（１０１）と、スレッド管理部（１０１）の管理下に置かれているスレッドを用いて、並列処理パターンを実行する並列処理パターン実行部（１０２）と、ユーザープログラムが作成したスレッドをスレッド管理部（１０１）の管理下に置くアタッチ部（１０３）と、を備える。【選択図】図３
2016224763.tif 000002
【特許請求の範囲】
【請求項１】
ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリを備え、
前記モデルライブラリは、
スレッドを管理するスレッド管理部と、
前記スレッド管理部の管理下に置かれているスレッドを用いて、前記並列処理パターンを実行する並列処理パターン実行部と、
前記ユーザープログラムが作成したスレッドを前記スレッド管理部の管理下に置くアタッチ部と、を備える、並列処理装置。
【請求項２】
前記モデルライブラリは、
前記スレッド管理部の管理下に置かれているスレッドを前記ユーザープログラムに戻すデタッチ部を更に備える、請求項１に記載の並列処理装置。
【請求項３】
前記モデルライブラリは、
前記ユーザープログラムからスレッドセーフコンテナを受信すると、受信したスレッドセーフコンテナを前記スレッド管理部に渡す受信部を更に備え、
前記スレッド管理部は、
前記スレッドセーフコンテナを用いて、スレッド間のデータの受け渡しを行う、請求項１又は２に記載の並列処理装置。
【請求項４】
前記モデルライブラリは、
前記ユーザープログラムからスレッドセーフキューを受信すると、受信したスレッドセーフキューを前記スレッド管理部に渡す受信部を更に備え
前記並列処理パターン実行部は、
前記ユーザープログラムからタスクを受信すると、受信したタスクを前記スレッドセーフキューに投入し、
前記スレッド管理部は、
前記アタッチ部により前記スレッド管理部の管理下にスレッドが置かれると、該スレッドに対し、前記スレッドセーフキューにタスクが無ければ待機し、前記スレッドセーフキューにタスクが投入されると、投入されたタスクを取り出して実行するというポーリングループを実行させる、請求項２に記載の並列処理装置。
【請求項５】
前記デタッチ部は、
前記スレッド管理部の管理下に置かれているスレッドを前記ユーザープログラムに戻す場合、前記並列処理パターンの実行の終了を示す終了タスクを前記スレッドセーフキューに投入し、該終了タスクを取り出したスレッドに前記ポーリングループの実行を終了させて、該スレッドを前記ユーザープログラムに戻す、請求項４に記載の並列処理装置。
【請求項６】
前記スレッド管理部は、
前記スレッド管理部の管理下に置かれているスレッド数を記録する記録部を備え、
前記デタッチ部は、
前記スレッド管理部の管理下に置かれているスレッドを前記ユーザープログラムに戻す場合、前記記録部に記録されているスレッド数分の前記終了タスクを、前記スレッドセーフキューに投入する、請求項５に記載の並列処理装置。
【請求項７】
ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリを備える並列処理装置による並列処理方法であって、
前記ユーザープログラムが作成したスレッドを前記モデルライブラリの管理下に置くアタッチ手順と、
前記モデルライブラリの管理下に置かれているスレッドを用いて、前記並列処理パターンを実行する並列処理パターン実行手順と、を備える、並列処理方法。
【請求項８】
前記モデルライブラリの管理下に置かれているスレッドを前記ユーザープログラムに戻すデタッチ手順を更に備える、請求項７に記載の並列処理方法。
【請求項９】
前記ユーザープログラムからスレッドセーフコンテナを受信する手順と、
前記スレッドセーフコンテナを用いて、スレッド間のデータの受け渡しを行う手順と、を更に備える、請求項７又は８に記載の並列処理方法。
【請求項１０】
ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリを備えるコンピュータに、
前記ユーザープログラムが作成したスレッドを前記モデルライブラリの管理下に置くアタッチ手順と、
前記モデルライブラリの管理下に置かれているスレッドを用いて、前記並列処理パターンを実行する並列処理パターン実行手順と、を実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列処理装置、並列処理方法、プログラムに関する。
【背景技術】
【０００２】
マルチコアプロセッサの普及に伴い、マルチスレッドを用いた並列処理が広く行われている。このような並列処理の一例は、特許文献１〜３に開示されている。マルチスレッドを用いた並列処理では、マルチスレッドが実行する並列処理パターンとして、典型的な並列処理パターンが利用されることがある。例えば、タスクキューは、図９に示すように、キューにタスクを投入すると、そのタスクを複数のスレッドのうちの１つのスレッドで実行する並列処理パターンである。複数のタスクをキューに投入することで、複数のスレッドによる並列処理を実行することができる。また、ループ並列処理は、図１０に示すように、ループのイタレーション空間を分割して、それぞれの空間を異なるスレッドで実行する並列処理パターンである。
【０００３】
このような典型的な並列処理パターンを提供するライブラリがある。また、コンパイラ指示文とランタイムライブラリとの組み合わせで、典型的な並列処理パターンが提供される場合もある。本明細書では、このように単独で又はコンパイラ指示文との組み合わせで並列処理パターンを提供するライブラリをまとめて、マルチスレッドプログラミングモデル又は並列モデルと適宜称する。このような並列モデルの例としては、Intel社のThread Building Block(TBB)やOpenMPなどが知られている。このようなライブラリを利用することで、ユーザープログラムは、並列処理を一から実装することなく、典型的な並列処理パターンを利用することができるという利点がある。
【０００４】
典型的なタスクキューを疑似的なプログラムで表した例を図１１に示す。本例では、キュー及びタスクを作成した後に、タスクの実行のための関数を呼び出している。本例では、この関数で指定されたタスクは、キューに結び付けられた複数のスレッドのうちの１つのスレッドによって実行される。このように、タスクを実行するときに、ユーザープログラムは、タスクをスレッドに割り当てるための処理を記述することなく、タスクキューを利用することができる。なお、本例では、キューの作成時にスレッドの作成が行われ、作成されたタスクがキューに結び付けられているとしている。
【０００５】
典型的な並列処理パターンを提供するライブラリ（以下、モデルライブラリと称す）の構成例を図１２に示す。図１２は、関連するモデルライブラリ６０を含む並列処理装置の構成を示しており、モデルライブラリ６０と、モデルライブラリ６０を利用するユーザープログラム７０と、スレッドライブラリ８０と、の関係が分かるようになっている。なお、スレッドライブラリ８０は、スレッドの作成や、スレッド間での排他制御などのマルチスレッドプログラムのための基本的な機能を提供するライブラリである。典型的なモデルライブラリ６０は、図１２に示すように、スレッド作成部６０１を備えており、スレッド作成部６０１は、スレッドライブラリ８０を呼び出してスレッドを作成する。典型的には、スレッド作成部６０１は、ユーザープログラム７０の初期化部７０１がモデルライブラリ６０を利用するときの初期化処理として呼び出される。新規に作成されたスレッドは、モデルライブラリ６０のスレッド管理部６０２で管理される。また、モデルライブラリ６０は、新規に作成されたスレッドに属性（例えば、そのスレッドを割り当てるコアなど）を設定する属性設定部６０４（一点鎖線で図示）を備えていても良い。並列処理パターン実行部６０３は、ユーザープログラム７０の並列処理部７０２から並列処理パターンの実行を要求されたときに、スレッド管理部６０２で管理されているスレッドを用いて、並列処理パターンの実行を行う。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平１０−１２４３３１号公報
【特許文献２】特開２００８−０４０９５１号公報
【特許文献３】特開２０１１−１３４１４５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
図１２に示すようなモデルライブラリを利用する場合、スレッドの作成はモデルライブラリによって行われる。これにより、ユーザーは、スレッドの作成を行う必要がなく、手軽に並列処理を行うことができるという利点がある。
【０００８】
一方で、ユーザープログラムの細かなチューニングを行う際などは、ユーザー自身でスレッドの属性を設定したい場合がある。しかし、図１２に示すようなモデルライブラリを利用する場合には、所望の属性をスレッドに設定することができないという問題がある。例えば、ユーザーは、図１３に示すように、処理の特性や性能要件などに応じて、複数のスレッドを同じ物理コア上の論理コアに割り当てたい場合（コア割り当て方法１）や、複数のスレッドを異なる物理コア上の論理コアに割り当てたい場合（コア割り当て方法２）があるが、こうした所望のコア割り当てを行うことができない。そのために、所望のコア割り当てとは異なるコア割り当てが行われ、その結果、性能に悪影響を及ぼすという問題がある。また、モデルライブラリが、スレッドの属性を設定するAPI（Application Programming Interface）を提供する場合もあるが、この場合には、プログラマは、モデルライブラリ固有のAPIを学習しなければならないという負担があるという問題もある。
【０００９】
また、特許文献１は、スレッドが、待機状態から並列処理を実行し、並列処理の実行後に待機状態に戻るというタスクキューの一般的な動作や、並列処理の実行後に規定個数を超えたスレッドを削除するという動作を開示しているに過ぎない。また、特許文献２は、マルチスレッドＯＳ（Operating System）上でスレッドの属性を管理することを開示しているに過ぎない。また、特許文献３は、モデルライブラリに相当する構成要素を開示しているものの、同様の構成要素は特許文献１，２には何ら開示されていない。そのため、特許文献１〜３に係る技術を適用しても、モデルライブラリが提供する並列処理パターンを実行するスレッドに属性を設定することは困難である。
【００１０】
そこで本発明の目的は、ユーザーが、並列処理パターンを提供するモデルライブラリを利用しながらも、その並列処理パターンを実行するスレッドに属性を設定することができる並列処理装置、並列処理方法、プログラムを提供することにある。
【課題を解決するための手段】
【００１１】
一態様において、並列処理装置は、ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリを備える。前記モデルライブラリは、スレッドを管理するスレッド管理部と、前記スレッド管理部の管理下に置かれているスレッドを用いて、前記並列処理パターンを実行する並列処理パターン実行部と、前記ユーザープログラムが作成したスレッドを前記スレッド管理部の管理下に置くアタッチ部と、を備える。
【００１２】
一態様において、並列処理方法は、ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリを備える並列処理装置による並列処理方法である。前記並列処理方法は、前記ユーザープログラムが作成したスレッドを前記モデルライブラリの管理下に置くアタッチ手順と、前記モデルライブラリの管理下に置かれているスレッドを用いて、前記並列処理パターンを実行する並列処理パターン実行手順と、を備える。
【００１３】
一態様において、プログラムは、ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリを備えるコンピュータに実行させるためのプログラムである。前記コンピュータに実行させる手順は、前記ユーザープログラムが作成したスレッドを前記モデルライブラリの管理下に置くアタッチ手順と、前記モデルライブラリの管理下に置かれているスレッドを用いて、前記並列処理パターンを実行する並列処理パターン実行手順と、を含む。
【発明の効果】
【００１４】
上記の態様によれば、ユーザーが、並列処理パターンを提供するモデルライブラリを利用しながらも、その並列処理パターンを実行するスレッドに属性を設定することができるという効果が得られる。
【図面の簡単な説明】
【００１５】
【図１】本発明の第１の実施形態に係るモデルライブラリの構成例を示す図である。
【図２】本発明の第１の実施形態に係るモデルライブラリを含む並列処理装置の構成例を示す図である。
【図３】本発明の第２の実施形態に係るモデルライブラリの構成例を示す図である。
【図４】本発明の第３の実施形態に係るモデルライブラリの構成例を示す図である。
【図５】本発明の第３の実施形態に係るモデルライブラリの具体例を示す図である。
【図６】本発明の第３の実施形態に係るモデルライブラリの具体例におけるポーリングループの機能を表す疑似的なプログラムの例を示す図である。
【図７】本発明の第３の実施形態に係るモデルライブラリの具体例におけるアタッチ部の機能の例を示す図である。
【図８】本発明の第３の実施形態に係るモデルライブラリの具体例におけるデタッチ部の機能の例を示す図である。
【図９】タスクキューの概要の例を示す図である。
【図１０】ループ並列処理の概要の例を示す図である。
【図１１】典型的なタスクキューを表す疑似的なプログラムの例を示す図である。
【図１２】関連するモデルライブラリの構成例を示す図である。
【図１３】スレッドのコアへの割り当て方法の例を示す図である。
【発明を実施するための形態】
【００１６】
以下に、発明を実施するための形態について図面を参照して詳細に説明する。
（１）第１の実施形態
（１−１）第１の実施形態の構成
まず、本発明の第１の実施形態について説明する。図１は、第１の実施形態に係るモデルライブラリ１０の構成例を示す図である。第１の実施形態に係るモデルライブラリ１０は、図１２のスレッド管理部６０２及び並列処理パターン実行部６０３と同様の機能を備えるスレッド管理部１０１及び並列処理パターン実行部１０２に加えて、アタッチ部１０３及びデタッチ部１０４を備える。スレッド管理部１０１は、並列処理パターンの実行を行うスレッドを管理する機能を備える。典型的には、スレッド管理部１０１は、並列処理パターンの実行の開始までスレッドを待機させる機能、並列処理パターンの実行時にスレッドの動作を開始させる機能などを備える。スレッド管理部１０１の備える機能は、モデルライブラリ１０が提供する並列処理パターンに応じて変更しても良い。並列処理パターン実行部１０２は、ユーザープログラム２０からの要求を受けて、スレッド管理部１０１の管理下に置かれているスレッドを用いて、並列処理パターンの実行を行う機能を備える。アタッチ部１０３は、ユーザープログラム２０が作成したスレッドをスレッド管理部１０１の管理下に置く機能を備える。デタッチ部１０４は、スレッド管理部１０１の管理下に置かれているスレッドをユーザープログラム２０に戻す機能を備える。
【００１７】
なお、本明細書では、スレッド管理部１０１がスレッドを管理下に置いている状態とは、そのスレッドを制御（スレッドを待機させたり、スレッドに動作を開始／停止させたりするなどの制御）の対象にしている状態を意味するものとする。
【００１８】
図２は、第１の実施形態に係るモデルライブラリ１０を含む並列処理装置の構成例を示す図である。この並列処理装置は、モデルライブラリ１０に加えて、モデルライブラリ１０を利用するユーザープログラム２０と、スレッドライブラリ３０と、を含む構成である。また、ユーザープログラム２０は、スレッド作成部２０１、属性設定部２０２、登録部２０３、並列処理部２０４、及び登録解除部２０５を備える。ユーザープログラム２０の機能の詳細は、後述の（１−２）において説明する。また、スレッドライブラリ３０の機能は、図１２のスレッドライブラリ８０と同様である。
【００１９】
（１−２）第１の実施形態の動作
次に、第１の実施形態の動作について詳しく説明する。ここでは、図２を用いて、第１の実施形態の典型的な動作を説明する。
１．まず、ユーザープログラム２０のスレッド作成部２０１は、スレッドライブラリ３０を呼び出してスレッドの作成を行う。スレッドの作成は複数回行って、任意の数のスレッドを作成して良い。
２．次に、ユーザープログラム２０の属性設定部２０２は、新しく作成されたスレッドに対して属性（例えば、そのスレッドを割り当てるコアなど）の設定を行う。典型的には、新しく作成された全てのスレッドに対して属性の設定を行う。
３．その後、ユーザープログラム２０の登録部２０３は、モデルライブラリ１０のアタッチ部１０３を呼び出す。これにより、新しく作成されたスレッドは、モデルライブラリ１０のスレッド管理部１０１の管理下に置かれる。この際に、スレッド管理部１０１の管理下に置くのは、新しく作成された全てのスレッドでも良いし、一部のスレッドのみでも良い。
ここまでが前処理に相当する。
【００２０】
４．ユーザープログラム２０の並列処理部２０４は、ユーザープログラム２０で実際に並列処理を行う部分である。並列処理を行う際に、モデルライブラリ１０が提供する並列処理パターンを利用する場合、並列処理部２０４は、モデルライブラリ１０の並列処理パターン実行部１０２を呼び出す。並列処理パターン実行部１０２は、スレッド管理部１０１の管理下に置かれているスレッドを用いて、並列処理パターンを実行する。
５．並列処理が終了して、もはや並列処理パターンの利用が不要となった場合、ユーザープログラム２０の登録解除部２０５は、モデルライブラリ１０のデタッチ部１０４を呼び出す。これにより、モデルライブラリ１０のスレッド管理部１０１の管理下に置かれていたスレッドはユーザープログラム２０側に戻される。
【００２１】
（１−３）第１の実施形態の効果
第１の実施形態によれば、モデルライブラリ１０において、アタッチ部１０３は、ユーザープログラム２０が作成したスレッドを、モデルライブラリ１０のスレッド管理部１０１の管理下に置く。そのため、ユーザープログラム２０は、自身が作成したスレッドに対して属性を設定した後に、そのスレッドをモデルライブラリ１０に渡せば、そのスレッドをモデルライブラリ１０の管理下に置くことができる。したがって、ユーザーは、モデルライブラリ１０を利用しながらも、モデルライブラリ１０が提供する並列処理パターンを実行するスレッドに属性を設定することができる。
【００２２】
（２）第２の実施形態
次に、本発明の第２の実施形態について説明する。図３は、第２の実施形態に係るモデルライブラリ１０Ａの構成例を示す図である。第２の実施形態に係るモデルライブラリ１０Ａは、第１の実施形態に係るモデルライブラリ１０の構成から、デタッチ部１０４を除去したものである。第２の実施形態に係るモデルライブラリ１０Ａは、モデルライブラリ１０Ａの管理下に一旦置かれたスレッドを、再びユーザープログラム２０の管理下に置いて利用することができないという欠点がある。しかし、その一方で、モデルライブラリ１０Ａの構成を簡潔にすることができるという利点がある。
【００２３】
（３）第３の実施形態
（３−１）第３の実施形態の構成及び動作
次に、本発明の第３の実施形態について説明する。図４は、第３の実施形態に係るモデルライブラリ１０Ｂの構成例を示す図である。第３の実施形態に係るモデルライブラリ１０Ｂは、第１の実施形態に係るモデルライブラリ１０の構成に、スレッドセーフコンテナ受信部１０５を追加したものである。
スレッドセーフコンテナは、複数のスレッドにより利用可能なデータコンテナである。スレッドセーフコンテナ受信部１０５は、ユーザープログラム２０からスレッドセーフコンテナを受信すると、受信したスレッドセーフコンテナをスレッド管理部１０１に渡す機能を備える。第３の実施形態によれば、スレッド管理部１０１は、スレッド間でのデータの受け渡しを、スレッドセーフコンテナを用いて行うことが可能になる。
モデルライブラリ１０Ｂのその他の構成要素は、第１の実施形態に係るモデルライブラリ１０と同様であるため、説明を省略する。また、モデルライブラリ１０Ｂの動作についても、同様であるため説明を省略する。スレッドセーフコンテナが、スレッド管理部１０１でどのように利用されるかは、モデルライブラリ１０Ｂが提供する具体的な並列処理パターンに依存するので、ここでは説明せずに、後述の（３−３）において詳細に説明する。
【００２４】
（３−２）第３の実施形態の効果
第３の実施形態によれば、モデルライブラリ１０Ｂにおいて、スレッドセーフコンテナ受信部１０５は、ユーザープログラム２０から受信したスレッドセーフコンテナをスレッド管理部１０１に渡し、スレッド管理部１０１は、スレッドセーフコンテナを用いて、スレッド間でのデータの受け渡しを行う。
そのため、特定のスレッドライブラリ３０が提供する、スレッド間の同期や排他処理の機能を利用することなく、スレッド間でのデータの受け渡しが可能となる。そのため、スレッド間でデータの受け渡しが必要な並列処理パターンを提供するモデルライブラリ１０Ｂも、特定のスレッドライブラリ３０に依存することがないという利点がある。
【００２５】
（３−３）第３の実施形態の具体例
（３−３−１）第３の実施形態の具体例の構成
次に、第３の実施形態の具体例を説明する。本具体例は、第３の実施形態において、スレッドセーフコンテナとして、スレッドセーフキューを用い、並列処理パターンとして、タスクキューを提供する例である。
図５は、本具体例に係るモデルライブラリ１０ｂの構成例を示す図である。本具体例に係るモデルライブラリ１０ｂは、並列処理パターンとしてタスクキューを提供する、タスクキューモデルとして動作する。モデルライブラリ１０ｂは、並列処理パターン実行部１０２に相当する構成要素として、タスク受信部１０２ｂを備え、また、スレッドセーフコンテナ受信部１０５に相当する構成要素として、スレッドセーフキュー受信部１０５ｂを備える。また、スレッド管理部１０１は、ポーリングループ１０６、スレッドセーフキュー１０７、及びスレッド数記録部１０８を備える。
【００２６】
スレッドセーフキュー１０７は、複数のスレッドによるタスクの投入とタスクの取り出しが可能なキューである。スレッドセーフキュー１０７は、当業者には一般的なものであるため、詳細な説明は省略する。なお、本具体例では、スレッド管理部１０１の管理下に置かれているスレッドは、スレッドセーフキュー１０７からタスクを取り出す際に、スレッドセーフキュー１０７にタスクが無い場合は、タスクが投入されるまで、動作を停止し、タスクが投入されると、そのタスクを実行するという動作をする。
【００２７】
スレッドセーフキュー受信部１０５ｂは、ユーザープログラム２０が作成したスレッドセーフキュー１０７を受信すると、受信したスレッドセーフキュー１０７をスレッド管理部１０１に渡す機能を備える。モデルライブラリ１０ｂは、特定のスレッドライブラリ３０に依存しないために、スレッドライブラリ３０が提供するスレッド間の同期や排他処理の方法を利用することができない。そこで、本具体例では、スレッド管理部１０１は、ユーザープログラム２０が作成したスレッドセーフキュー１０７を利用する。上述のように、スレッドセーフキュー１０７は、複数のスレッド間で共有可能である。本具体例では、タスクキューモデルを、同期や排他処理といった低レベルの処理を用いることなく、スレッドセーフキューのみを用いて実現している。
タスク受信部１０２ｂは、ユーザープログラム２０からタスクを受信すると、受信したタスクをスレッドセーフキュー１０７に投入する機能を備える。
【００２８】
ポーリングループ１０６の例を図６に示す。図６は、ポーリングループ１０６の機能を疑似的なプログラムで表した例である。ポーリングループ１０６は、スレッドセーフキュー１０７（図中のqueue）を指定して実行される。ポーリングループ１０６は、スレッドセーフキュー１０７からタスクを取り出して実行するという処理を繰り返すループを備えている。図中のqueue_popは、スレッドセーフキュー１０７からタスク（図中のtask）を取り出す動作を示している。上述したように、スレッド管理部１０１の管理下に置かれているスレッドは、スレッドセーフキュー１０７にタスクが無い場合は、動作を停止するため、並列処理パターンの実行開始までスレッドを待機させるという機能が実現されている。その後に、スレッドは、スレッドセーフキュー１０７からタスクを取り出すと、そのタスクがNULLでないかを確認し、NULLでなければ、そのタスクの実行を行う（図中のrun_task）。run_taskの詳細は本発明とは無関係であるため、詳細な説明は省略する。本具体例では、タスクがNULLであることは、並列処理パターンの実行の終了を示している。そのため、スレッドは、スレッドセーフキュー１０７から取り出したタスクがNULLであれば、ポーリングループ１０６を抜け出す動作を行う。これにより、スレッドは、ポーリングループ１０６の実行を終了し、ユーザープログラム２０に戻るための後続の処理を実行する。
【００２９】
スレッド数記録部１０８は、スレッド管理部１０１の管理下に置かれているスレッドのスレッド数を記録する機能を備える。スレッド数は、スレッドがスレッド管理部１０１の管理下に置かれた際に増加され、スレッドがスレッド管理部１０１の管理下から外された際に減少される。本具体例では、スレッド数の増加、減少は複数のスレッドで行われるとする。そのため、スレッド数記録部１０８は、複数のスレッドが同時に増減操作を行っても、値を正しく維持する機能を備える。このような機能が、プロセッサの備えるatomic操作を利用することで実現することができることは、当業者には一般的なことである。
【００３０】
図７は、本具体例に係るアタッチ部１０３の機能の例を示す図である。アタッチ部１０３は、ユーザープログラム２０の実行中に作成され、スレッド管理部１０１の管理下に置かれるスレッドによって呼び出され、実行される。アタッチ部１０３を実行するスレッドは、まず、スレッド数記録部１０８に記録されているスレッド数を１増やす（ステップＳ１１）。次に、そのスレッドは、ポーリングループ１０６を呼び出し、実行する（ステップＳ１２）。上述したように、ポーリングループ１０６を実行するスレッドは、タスクの実行待ち状態になり、スレッドセーフキュー１０７にタスクが投入されると、そのタスクの実行を行う。その後、そのスレッドは、ポーリングループ１０６の実行を終了すると、アタッチ部１０３の実行に戻り、スレッド数記録部１０８に記録されているスレッド数を１減らす（ステップＳ１３）。
【００３１】
図８は、本具体例に係るデタッチ部１０４の機能の例を示す図である。デタッチ部１０４は、ユーザープログラム２０のメインスレッドによって呼び出され、実行される。デタッチ部１０４を実行するメインスレッドは、まず、スレッド数記録部１０８に記録されているスレッド数分の終了タスク（並列処理パターンの実行の終了を示すタスク。本具体例ではNULL）をスレッドセーフキュー１０７に投入する（ステップＳ２１）。スレッドセーフキュー１０７に投入された終了タスクは、ポーリングループ１０６を実行しているスレッドによって取り出される。終了タスクを取り出したスレッドは、ポーリングループ１０６の実行を終了する。ポーリングループ１０６の実行を終了したスレッドは、アタッチ部１０３の実行に戻り、スレッド数記録部１０８に記録されているスレッド数を１減らし、その後、アタッチ部１０３の実行を終了して、ユーザープログラム２０の実行に戻る。以上の動作をスレッド管理部１０１の管理下に置かれた全てのスレッドが行うため、結果としてスレッド数記録部１０８に記録されているスレッド数は０となる。デタッチ部１０４を実行しているメインスレッドは、スレッド数記録部１０８に記録されているスレッド数が０になるのを待ち（ステップＳ２２）、その後、ユーザープログラム２０の実行に戻る。以上の動作により、スレッド管理部１０１の管理下に置かれていたスレッドが全てユーザープログラム２０に戻ったことになる。
【００３２】
デタッチ部１０４の別の態様として、デタッチ部１０４を実行しているメインスレッドは、スレッド数記録部１０８のスレッド数が０になるのを待たずに、ステップＳ２１での終了タスクの投入後に直ちにユーザープログラム２０の実行に戻るという態様を取っても良い。本別態様の場合は、ユーザープログラム２０は、すぐに他の処理の実行を開始できるという利点がある。ただし、本別態様の場合は、ユーザープログラム２０が、スレッド管理部１０１の管理下に置かれているスレッド数を調べることができる機能を備えることが望ましい。本別態様では、ユーザープログラム２０は、デタッチ部１０４の実行直後には、スレッド管理部１０１の管理下に置かれていたスレッドがモデルライブラリ１０ｂから戻ってきているかが不明である。そのため、ユーザープログラム２０は、この機能を利用し、スレッド管理部１０１の管理下に置かれているスレッド数が０になったことを確認することによって、並列処理パターンの実行が終了したことを知ることができる。
【００３３】
（３−３−２）第３の実施形態の具体例の動作
次に、本具体例の動作について詳しく説明する。ここでは、図５を用いて、本具体例の典型的な動作を説明する。なお、ここでは、モデルライブラリ１０ｂは適切に初期化されているとする。また、図５において、構成要素間の実線は、ユーザープログラム２０のメインスレッドの動作を表し、構成要素間の点線は、ユーザープログラム２０の実行中に作成され、スレッド管理部１０１の管理下に置かれるスレッドの動作を表している（上記の図１〜図４及び図１２において同じ）。そこで、ここでは、ユーザープログラム２０のメインスレッドの動作とスレッド管理部１０１の管理下に置かれるスレッドの動作とを区別して説明する。
１．まず、ユーザープログラム２０のメインスレッドは、スレッドセーフキュー１０７を作成し、作成したスレッドセーフキュー１０７をモデルライブラリ１０ｂのスレッドセーフキュー受信部１０５ｂに渡す。スレッドセーフキュー受信部１０５ｂに渡されたスレッドセーフキューは、スレッド管理部１０１に渡され、利用される。
２．次に、ユーザープログラム２０のメインスレッドは、図２のスレッド作成部２０１として動作し、スレッドライブラリ３０を呼び出してスレッドの作成を行う。
３．次に、新しく作成されたスレッドは、図２の属性設定部２０２として動作し、自身に対して属性の設定を行う。
４．その後、新しく作成されたスレッドは、図２の登録部２０３として動作し、モデルライブラリ１０ｂのアタッチ部１０３を呼び出し、実行する。アタッチ部１０３を実行するスレッドは、スレッド数記録部１０８に記録されているスレッド数を１増やし、その後、自身をスレッド管理部１０１の管理下に置いて、ポーリングループ１０６を呼び出し、実行する。ポーリングループ１０６を実行するスレッドは、初期にはタスクの実行待ち状態になる。
ここまでが前処理に相当する。
【００３４】
５．並列処理を行う際に、モデルライブラリ１０ｂが提供するタスクキューを利用する場合、ユーザープログラム２０のメインスレッドは、図２の並列処理部２０４として動作し、モデルライブラリ１０ｂのタスク受信部１０２ｂを呼び出し、タスクを渡す。この動作は、スレッドセーフキュー１０７に投入するタスクの数だけ繰り返す。タスク受信部１０２ｂに渡されたタスクは、スレッドセーフキュー１０７に投入される。スレッドセーフキュー１０７に投入されたタスクは、ポーリングループ１０６を実行するスレッドによって取り出され、実行される。
【００３５】
６．並列処理が終了して、もはやタスクキューの利用が不要となった場合、ユーザープログラム２０のメインスレッドは、図２の登録解除部２０５として動作し、モデルライブラリ１０ｂのデタッチ部１０４を呼び出し、実行する。デタッチ部１０４を実行するメインスレッドは、スレッド数記録部１０８に記録されているスレッド数分の終了タスクをスレッドセーフキュー１０７に投入する。スレッドセーフキュー１０７に投入された終了タスクは、ポーリングループ１０６を実行するスレッドによって取り出される。スレッドは、終了タスクを取り出すと、ポーリングループ１０６の実行を終了して、アタッチ部１０３の実行に戻り、スレッド数記録部１０８に記録されているスレッド数を１減らし、その後、ユーザープログラム２０の実行に戻る。以上の動作は、スレッド管理部１０１の管理下に置かれた全てのスレッドが行う。これにより、スレッド管理部１０１の管理下に置かれた全てのスレッドが、ユーザープログラム２０側に戻る。
【００３６】
上記の動作５は、典型的なタスクキューの動作と同様であり、本具体例のモデルライブラリ１０ｂが典型的なタスクキューを提供する機能を備えていることが分かる。また、上記の動作２，３では、ユーザープログラム２０がスレッドを作成して、そのスレッドに属性を設定している。スレッドの属性として、そのスレッドを割り当てるコアを設定することで、タスクキューの実行を行うスレッドを割り当てるコアを、ユーザープログラム２０が設定できることが分かる。
【００３７】
なお、本具体例では、ユーザープログラム２０がスレッドセーフキューを作成してモデルライブラリ１０ｂに渡していたが、別の態様として、ユーザープログラム２０が定義したスレッドセーフキューの作成関数（又は作成オブジェクト）を、ユーザープログラム２０からモデルライブラリ１０ｂに渡し、スレッドセーフキューの作成自体はモデルライブラリ１０ｂで行う態様を取っても良い。このような態様は、当業者には一般的な方式であり、この態様の場合もモデルライブラリ１０ｂが特定のスレッドライブラリ３０に依存しない。又は、ユーザープログラム２０が定義したスレッドセーフキューのテンプレートを、モデルライブラリ１０ｂが実装し、ユーザープログラム２０がスレッドセーフキューの型を指定することで、スレッドセーフキューの作成自体は、モデルライブラリ１０ｂが行う態様を取っても良い。このような態様は、C++のテンプレート機能などによって実現することができる。
【００３８】
なお、上記実施形態において、モデルライブラリにおける処理は、ＣＰＵ（Central Processing Unit）などのプロセッサにプログラムを実行させることにより実現することができる。このプログラムは、様々なタイプの非一時的なコンピュータ可読媒体（non-transitory computer readable medium）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（tangible storage medium）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えば、フレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば、光磁気ディスク）、ＣＤ−ＲＯＭ（Compact Disk-Read Only Memory）、ＣＤ−Ｒ（CD-Recordable）、ＣＤ−Ｒ／Ｗ（CD-ReWritable）、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Programmable ROM）、ＥＰＲＯＭ（Erasable PROM）、フラッシュＲＯＭ、ＲＡＭ（random access memory））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（transitory computer readable medium）によってコンピュータに供給されても良い。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバなどの有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【００３９】
更に、本発明は上記実施形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
また、本発明は、高性能なマルチスレッドプログラムの開発を容易にさせることができるため、データセンターから組み込み装置まで、マルチコアプロセッサが活用されている産業で利用することができる。
【００４０】
また、例えば、上記の実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
（付記１）
ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリを備え、
前記モデルライブラリは、
スレッドを管理するスレッド管理部と、
前記スレッド管理部の管理下に置かれているスレッドを用いて、前記並列処理パターンを実行する並列処理パターン実行部と、
前記ユーザープログラムが作成したスレッドを前記スレッド管理部の管理下に置くアタッチ部と、を備える、並列処理装置。
（付記２）
前記モデルライブラリは、
前記スレッド管理部の管理下に置かれているスレッドを前記ユーザープログラムに戻すデタッチ部を更に備える、付記１に記載の並列処理装置。
（付記３）
前記モデルライブラリは、
前記ユーザープログラムからスレッドセーフコンテナを受信すると、受信したスレッドセーフコンテナを前記スレッド管理部に渡す受信部を更に備え、
前記スレッド管理部は、
前記スレッドセーフコンテナを用いて、スレッド間のデータの受け渡しを行う、付記１又は２に記載の並列処理装置。
（付記４）
前記モデルライブラリは、
前記ユーザープログラムからスレッドセーフキューを受信すると、受信したスレッドセーフキューを前記スレッド管理部に渡す受信部を更に備え
前記並列処理パターン実行部は、
前記ユーザープログラムからタスクを受信すると、受信したタスクを前記スレッドセーフキューに投入し、
前記スレッド管理部は、
前記アタッチ部により前記スレッド管理部の管理下にスレッドが置かれると、該スレッドに対し、前記スレッドセーフキューにタスクが無ければ待機し、前記スレッドセーフキューにタスクが投入されると、投入されたタスクを取り出して実行するというポーリングループを実行させる、付記２に記載の並列処理装置。
（付記５）
前記デタッチ部は、
前記スレッド管理部の管理下に置かれているスレッドを前記ユーザープログラムに戻す場合、前記並列処理パターンの実行の終了を示す終了タスクを前記スレッドセーフキューに投入し、該終了タスクを取り出したスレッドに前記ポーリングループの実行を終了させて、該スレッドを前記ユーザープログラムに戻す、付記４に記載の並列処理装置。
（付記６）
前記スレッド管理部は、
前記スレッド管理部の管理下に置かれているスレッド数を記録する記録部を備え、
前記デタッチ部は、
前記スレッド管理部の管理下に置かれているスレッドを前記ユーザープログラムに戻す場合、前記記録部に記録されているスレッド数分の前記終了タスクを、前記スレッドセーフキューに投入する、付記５に記載の並列処理装置。
（付記７）
ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリを備える並列処理装置による並列処理方法であって、
前記ユーザープログラムが作成したスレッドを前記モデルライブラリの管理下に置くアタッチ手順と、
前記モデルライブラリの管理下に置かれているスレッドを用いて、前記並列処理パターンを実行する並列処理パターン実行手順と、を備える、並列処理方法。
（付記８）
前記モデルライブラリの管理下に置かれているスレッドを前記ユーザープログラムに戻すデタッチ手順を更に備える、付記７に記載の並列処理方法。
（付記９）
前記ユーザープログラムからスレッドセーフコンテナを受信する手順と、
前記スレッドセーフコンテナを用いて、スレッド間のデータの受け渡しを行う手順と、を更に備える、付記７又は８に記載の並列処理方法。
（付記１０）
前記ユーザープログラムからスレッドセーフキューを受信する手順を更に備え、
前記並列処理パターン実行手順では、
前記ユーザープログラムからタスクを受信すると、受信したタスクを前記スレッドセーフキューに投入し、
前記アタッチ手順により前記モデルライブラリの管理下にスレッドが置かれると、該スレッドに対し、前記スレッドセーフキューにタスクが無ければ待機し、前記スレッドセーフキューにタスクが投入されると、投入されたタスクを取り出して実行するというポーリングループを実行させる、付記８に記載の並列処理方法。
（付記１１）
前記デタッチ手順では、
前記モデルライブラリの管理下に置かれているスレッドを前記ユーザープログラムに戻す場合、前記並列処理パターンの実行の終了を示す終了タスクを前記スレッドセーフキューに投入し、該終了タスクを取り出したスレッドに前記ポーリングループの実行を終了させて、該スレッドを前記ユーザープログラムに戻す、付記１０に記載の並列処理方法。
（付記１２）
前記モデルライブラリの管理下に置かれているスレッド数を記録部に記録する手順を更に備え、
前記デタッチ手順では、
前記モデルライブラリの管理下に置かれているスレッドを前記ユーザープログラムに戻す場合、前記記録部に記録されているスレッド数分の前記終了タスクを、前記スレッドセーフキューに投入する、付記１１に記載の並列処理方法。
（付記１３）
ユーザープログラムに対して、複数のスレッドで実行する並列処理パターンを提供するモデルライブラリを備えるコンピュータに、
前記ユーザープログラムが作成したスレッドを前記モデルライブラリの管理下に置くアタッチ手順と、
前記モデルライブラリの管理下に置かれているスレッドを用いて、前記並列処理パターンを実行する並列処理パターン実行手順と、を実行させるためのプログラム。
【符号の説明】
【００４１】
１０，１０Ａ，１０Ｂ，１０ｂ  モデルライブラリ
１０１  スレッド管理部
１０２  並列処理パターン実行部
１０２ｂ  タスク受信部
１０３  アタッチ部
１０４  デタッチ部
１０５  スレッドセーフコンテナ受信部
１０５ｂ  スレッドセーフキュー受信部
２０  ユーザープログラム
２０１  スレッド作成部
２０２  属性設定部
２０３  登録部
２０４  並列処理部
２０５  登録解除部
３０  スレッドライブラリ
【図１】
2016224763.tif 000003
【図２】
2016224763.tif 000004
【図３】
2016224763.tif 000005
【図４】
2016224763.tif 000006
【図５】
2016224763.tif 000007
【図６】
2016224763.tif 000008
【図７】
2016224763.tif 000009
【図８】
2016224763.tif 000010
【図９】
2016224763.tif 000011
【図１０】
2016224763.tif 000012
【図１１】
2016224763.tif 000013
【図１２】
2016224763.tif 000014
【図１３】
2016224763.tif 000015