(57)【要約】  冗長な同期処理によって発生する性能劣化を回避する。ＣＰＵ（＃０）は、時刻ｔ１にて同期ポイントに到達すると、ＣＰＵ（＃１）、ＣＰＵ（＃２）に対して同期信号を送信する。なお、ＣＰＵ（＃１）、ＣＰＵ（＃２）は、時刻ｔ１にてクリティカルセクション中であるため、同期信号を受信できない。次に、時刻ｔ２にて、ＣＰＵ（＃２）が、同期信号を受信すると、ＣＰＵ（＃０）とＣＰＵ（＃１）にレディ信号を送信しつつ、共有メモリ領域（１０３）を複製した複製先共有メモリ領域（１０４）をアクセス先として投機実行を行う。時刻ｔ３にて、ＣＰＵ（＃１）が同期信号を受信すると、ＣＰＵ（＃０）とＣＰＵ（＃２）にレディ信号を送信する。レディ信号を受信したＣＰＵ（＃２）は、共有メモリ領域（１０３）と複製先共有メモリ領域（１０４）とのデータを比較することで、冗長な同期処理であったか否かを判定する。
2012124078.tif 000002
【特許請求の範囲】
【請求項１】
第１ＣＰＵによって発行された同期命令に基づいて、同期する複数のＣＰＵと前記複数のＣＰＵ数とを特定のテーブルに登録し、
前記複数のＣＰＵのそれぞれが前記第１ＣＰＵからの同期信号に基づいて、同期ポイントへの到達数をカウントするとともに前記複数のＣＰＵが実行する処理によってアクセスされる第１共有メモリ領域の複製である第２共有メモリ領域を作成し、
前記同期ポイントへの到達数が前記複数のＣＰＵ数に到達したときに、前記第１共有メモリ領域と前記第２共有メモリ領域とを比較し、
前記比較結果に基づいて前記複数のＣＰＵが実行した処理を判定すること
を特徴とする同期方法。
【請求項２】
前記複数のＣＰＵの少なくとも一部は、前記同期信号受信後に処理の実行を継続すること
を特徴とする請求項１に記載の同期方法。
【請求項３】
一致を示す比較結果を有するＣＰＵは比較後に処理を継続すること
を特徴とする請求項１または請求項２に記載の同期方法。
【請求項４】
不一致を示す比較結果を有するＣＰＵが前記同期信号受信後に実行した処理を中断すること
を特徴とする請求項１乃至請求項３の何れか一に記載の同期方法。
【請求項５】
処理とＣＰＵとの関連を示すテーブルに基づいて前記特定のテーブルに登録すること
を特徴とする請求項１乃至請求項４の何れか一に記載の同期方法。
【請求項６】
前記第２共有メモリ領域を作成する処理は、
さらに、前記第１共有メモリ領域の複製である第３共有メモリ領域を作成し、
前記第１共有メモリ領域と前記第２共有メモリ領域とを比較する処理は、
前記第２共有メモリ領域と前記第３共有メモリ領域とを比較すること
を特徴とする請求項１乃至請求項５の何れか一に記載の同期方法。
【請求項７】
複数のＣＰＵ間で共有する第１共有メモリ領域と、
前記同期命令に基づく同期信号を受信する第１受信部と、
前記同期信号に基づいて同期ポイントへの到達数をカウントするカウント部と、
前記同期ポイントへの到達数に基づいて前記第１共有メモリ領域を複製して第２共有メモリ領域を作成する作成部と、
前記同期ポイントへの到達数が所定値に到達したときに、前記第１共有メモリ領域と前記第２共有メモリ領域とを比較する第１比較部と、
を含むことを特徴とするマルチコアプロセッサシステム。
【請求項８】
前記複数のＣＰＵは前記同期命令に基づいて同期されるＣＰＵであり、
前記所定値は前記複数のＣＰＵ数であること
を特徴とする請求項７に記載のマルチコアプロセッサシステム。
【請求項９】
前記同期ポイントへの到達数と前記所定値とを比較する第２比較部と、
前記複数のＣＰＵ内の少なくとも一のＣＰＵからの信号に基づいて、前記第２比較部を活性化する第２受信部と、
を含むことを特徴とする請求項７または請求項８に記載のマルチコアプロセッサシステム。
【請求項１０】
前記第１受信部は、前記同期信号の受信後に非活性化されること
を特徴とする請求項７乃至請求項９の何れか一に記載のマルチコアプロセッサシステム。
【請求項１１】
前記第１比較部の比較結果に基づいて、前記同期信号受信後の処理を継続または中断することを通知する通知部、
を含むことを特徴とする請求項９または請求項１０に記載のマルチコアプロセッサシステム。
【請求項１２】
少なくとも第１ＣＰＵと第２ＣＰＵとを含む複数のＣＰＵと、
前記複数のＣＰＵ間で共有する第１共有メモリ領域と、
と含み、
前記第１ＣＰＵは、前記複数のＣＰＵ間での同期処理を指示する同期命令に基づく同期信号を前記第２ＣＰＵに供給し、
前記第２ＣＰＵは、前記同期信号に基づいて、前記第１共有メモリ領域を複製して第２共有メモリ領域を作成するとともに、所定の処理を実行し、
前記複数のＣＰＵが同期するときに、前記第１共有メモリ領域と前記第２共有メモリ領域とを比較し、
前記比較結果に基づいて実行された前記所定の処理の処遇を決定すること
を特徴とする同期システム。
【請求項１３】
比較結果が一致を示すときは、前記所定の処理の続きが実行されること
を特徴とする請求項１２に記載の同期システム。
【請求項１４】
比較結果が不一致を示すとき、前記所定の処理が再実行されること
を特徴とする請求項１２または請求項１３に記載の同期システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、同期処理を行う同期方法、マルチコアプロセッサシステム、および同期システムに関する。
【背景技術】
【０００２】
従来から、１つのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）に対して、複数のプログラムを動作させるマルチプログラミング技術が存在する。具体的に、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）は、ＣＰＵの処理時間を分割する機能を有し、分割された時間にプロセスやスレッドを割り当てることにより、ＣＰＵが同時に複数のプロセスやスレッドを動作する。ここで、プロセスやスレッドはプログラムの実行単位である。ソフトウェアは、プロセスやスレッドの集まりとなる。また一般的に、プロセス間ではメモリ空間が独立しており、スレッド間ではメモリ空間を共有する。【０００３】
また、近年、ＣＰＵが１つ搭載されたコンピュータであるシングルコアプロセッサシステムに代わって、ＣＰＵが複数搭載されたコンピュータであるマルチコアプロセッサシステムをとる装置が増えている。複数のＣＰＵに複数のスレッドを並列に割り当てることで、高速に処理を実行することができる。【０００４】
このように複数のスレッドが並列に実行される場合、スレッド間の同期をとるために、同期処理が頻繁に実行される。同期処理としては、排他制御処理とバリア同期処理が存在する。【０００５】
排他制御処理は、一方のスレッドがリソース等の使用権を獲得すると、一方のスレッドがリソースの使用権を解放するまで、他のスレッドを待機させる処理である。たとえば、複数のスレッド間が共有のデータにアクセスする際には、排他制御処理がプログラム内に追加される。バリア同期処理は、複数のスレッドの処理を特定のコード位置までで一旦停止させ、全てのスレッドが特定のコード位置に到達した際に、次の処理を継続する処理である。たとえば、複数のスレッドを特定の位置から同時に実行させたい場合、バリア同期処理がプログラム内に追加される。【０００６】
ＯＳは、同期処理を行う同期命令をライブラリ等でアプリケーションソフトウェア（以下、アプリと称す。）に提供する。たとえば、排他制御処理を行う同期命令として、Ｍｕｔｅｘ、バリア同期処理を行う同期命令としてバリア同期命令などが存在する。【０００７】
なお、同期処理の開始を宣言するＣＰＵは、同期命令によって同期信号を同期処理の受信側となるＣＰＵに通知する。同期信号を受信したＣＰＵは、同期処理が完了した状態を意味する信号を同期信号の通知元ＣＰＵに送信する。以下、同期処理が完了した状態を意味する信号をレディ信号と呼称する。【０００８】
同期処理に関する技術として、たとえば、スレッド間で同期処理を行う際に、同期ポイントに到達したＣＰＵ数を数える同期計数部を有し、全てのＣＰＵが同期ポイントに到達したか否かを判断する技術が開示されている。なお、同期ポイントとは、実行コード内での同期命令が挿入された位置である。複数のＣＰＵのレジスタの同期処理として、たとえば、スレッドのコピーを行った後、親スレッドの汎用レジスタが書き込まれるごとに、更新後の汎用レジスタの値を親スレッドから子スレッドのＣＰＵに送信して、投機実行する技術が開示されている（たとえば、下記特許文献１、２を参照。）。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開平７−２００４８６号公報
【特許文献２】特開２００３−２９９８６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、上述した従来技術において、同期処理の完了確認を速く行うことが可能ではあるが、設計者によって設定された冗長な同期処理が存在する場合、無駄な待ち合わせ時間が発生してしまい、性能劣化が発生するという問題があった。【００１１】
本発明は、上述した従来技術による問題点を解消するため、冗長な同期処理によって発生する性能劣化を回避できる同期方法、マルチコアプロセッサシステム、および同期システムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、第１ＣＰＵによって発行された同期命令に基づいて、同期する複数のＣＰＵと複数のＣＰＵ数とを特定のテーブルに登録し、複数のＣＰＵのそれぞれが第１ＣＰＵからの同期信号に基づいて、同期ポイントへの到達数をカウントするとともに複数のＣＰＵが実行する処理によってアクセスされる第１共有メモリ領域の複製である第２共有メモリ領域を作成し、同期ポイントへの到達数が複数のＣＰＵ数に到達したときに、第１共有メモリ領域と第２共有メモリ領域とを比較し、比較結果に基づいて複数のＣＰＵが実行した処理を判定する同期方法、マルチコアプロセッサシステム、および同期システムが提案される。
【発明の効果】
【００１３】
本発明の一側面によれば、冗長な同期処理によって発生する性能劣化を回避できるという効果を奏する。
【図面の簡単な説明】
【００１４】
【図１】図１は、マルチコアプロセッサシステム１００の動作例を示す説明図である。
【図２】図２は、実施の形態１にかかるマルチコアプロセッサシステム１００のハードウェア例を示すブロック図である。
【図３】図３は、マルチコアプロセッサシステム１００の機能例を示すブロック図である。
【図４】図４は、プロセステーブル３０１の記憶内容の一例を示す説明図である。
【図５】図５は、同期情報テーブル３０２の記憶内容の一例を示す説明図である。
【図６】図６は、マルチコアプロセッサシステム１００の同期処理の動作例を示す説明図である。
【図７】図７は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ１における状態を示す説明図である。
【図８】図８は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ２における状態を示す説明図である。
【図９】図９は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ３における状態を示す説明図である。
【図１０】図１０は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ５における状態を示す説明図である。
【図１１】図１１は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ６における状態を示す説明図である。
【図１２】図１２は、動画再生アプリへの適用例を示す説明図である。
【図１３】図１３は、同期処理時における同期マスタＣＰＵでの処理手順の一例を示すフローチャートである。
【図１４】図１４は、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示すフローチャート（その１）である。
【図１５】図１５は、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示すフローチャート（その２）である。
【発明を実施するための形態】
【００１５】
以下に添付図面を参照して、開示の同期方法、マルチコアプロセッサシステム、および同期システムの実施の形態を詳細に説明する。
【００１６】
図１は、マルチコアプロセッサシステム１００の動作例を示す説明図である。マルチコアプロセッサシステム１００は、ＣＰＵ＃０、ＣＰＵ＃１、ＣＰＵ＃２とメモリ１０１を含む。以下、接尾記号“＃ｎ”が付随された記号は、ｎ番目のＣＰＵに対応する記号であることを示している。ＣＰＵ＃０〜ＣＰＵ＃２とメモリ１０１はバス１０２で接続されている。ＣＰＵ＃０〜ＣＰＵ＃２は、マルチコアプロセッサシステム１００を制御する。メモリ１０１は、ＣＰＵ＃０〜ＣＰＵ＃２からアクセス可能な記憶領域である。また、メモリ１０１内には共有メモリ領域１０３が含まれる。共有メモリ領域１０３は、ＣＰＵ＃０〜ＣＰＵ＃２から共有してアクセスされる領域である。
【００１７】
また、ＣＰＵ＃０〜ＣＰＵ＃２は、並列処理を行うスレッド０〜スレッド２を実行している。図１では時刻ｔ１にて、スレッド０の実行コードによってＣＰＵ＃０が、共有メモリ領域１０３にアクセスするため、同期命令を実行する場合を想定する。なお、実行コード内での同期命令の位置を同期ポイントと定義する。また、同期命令を実行可能な位置に到達した場合を、同期ポイントに到達したと呼称する。
【００１８】
また、スレッド０のように、同期処理の開始を宣言し、他のスレッドの同期状態を監視するスレッドを同期マスタスレッドと呼称し、同期マスタスレッドを実行しているＣＰＵを同期マスタＣＰＵと呼称する。同様に、同期処理を行う他のスレッドを被同期対象スレッドと呼称し、被同期対象スレッドを実行しているＣＰＵを被同期対象ＣＰＵと呼称する。スレッド１、スレッド２は、被同期対象スレッドとなる。また、同期処理を行うＣＰＵを、同期対象ＣＰＵと呼称する。同期対象ＣＰＵは、同期マスタＣＰＵと、被同期対象ＣＰＵとなる。図１の例では、同期対象ＣＰＵは、ＣＰＵ＃０〜ＣＰＵ＃２となり、同期マスタＣＰＵがＣＰＵ＃０、被同期対象ＣＰＵがＣＰＵ＃１、ＣＰＵ＃２となる。
【００１９】
また、同期マスタＣＰＵは、同期命令を実行すると被同期対象ＣＰＵに対して同期信号を通知する。したがって、ＣＰＵ＃０は、時刻ｔ１にて同期信号をＣＰＵ＃１、ＣＰＵ＃２に通知する。
【００２０】
しかしながら、時刻ｔ１の時点にて、ＣＰＵ＃１、ＣＰＵ＃２は、クリティカルセクション中であり、同期信号を受信できない状態である。クリティカルセクションとは、他の処理が割り込むことを禁止している部分である。時刻ｔ２にて、ＣＰＵ＃２がクリティカルセクションを終了すると、ＣＰＵ＃２は同期信号を受信する。
【００２１】
同期信号を受信したＣＰＵ＃２は、共有メモリ領域１０３の複製である、複製先共有メモリ領域１０４を作成する。ＣＰＵ＃２は、複製先共有メモリ領域１０４にアクセスして、スレッド２の後続処理を投機実行する。また、ＣＰＵ＃２は、同期ポイントに到達したことを通知するため、ＣＰＵ＃０、ＣＰＵ＃１にレディ信号を通知する。
【００２２】
続けて時刻ｔ３にて、ＣＰＵ＃１がクリティカルセクションを終了すると、ＣＰＵ＃１は同期信号を受信する。同期信号を受信したＣＰＵ＃１は、レディ信号をＣＰＵ＃０、ＣＰＵ＃２に送信する。レディ信号を受信したＣＰＵ＃２は、全ての被同期ＣＰＵが同期ポイントに到達していることを判定すると、共有メモリ領域１０３のデータと複製先共有メモリ領域１０４のデータを比較する。比較結果が一致を示す場合、同期コードの挿入が冗長であったとして、ＣＰＵ＃２は、投機実行を継続する。なお、全ての被同期ＣＰＵが同期ポイントに到達していたかの判定方法は、図７〜図１１にて説明を行う。
【００２３】
このように、マルチコアプロセッサシステム１００は、Ｎ個のＣＰＵが同期処理する場合、同期ポイントへの到達数Ｍ＜Ｎならデータを複製して投機実行し、Ｍ＝Ｎなら複製元と複製先のデータが同一時に投機実行を継続する。これにより、マルチコアプロセッサシステム１００は、冗長な同期処理による性能劣化を回避できる。
【００２４】
（マルチコアプロセッサシステム１００のハードウェア）
図２は、実施の形態１にかかるマルチコアプロセッサシステム１００のハードウェア例を示すブロック図である。図２において、マルチコアプロセッサシステム１００は、ＣＰＵを複数搭載するＣＰＵｓ２０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、を含む。
【００２５】
また、マルチコアプロセッサシステム１００は、フラッシュＲＯＭ２０４と、フラッシュＲＯＭコントローラ２０５と、フラッシュＲＯＭ２０６と、を含む。また、マルチコアプロセッサシステム１００は、ユーザやその他の機器との入出力装置として、ディスプレイ２０７と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０８と、キーボード２０９と、を含む。また、各部はバス１０２によってそれぞれ接続されている。なお、図１に示したメモリ１０１は、ＲＡＭ２０３であってもよいし、ＲＡＭ２０３の一部であってもよい。また、メモリ１０１は、ＲＡＭ２０３以外の記憶領域となるＲＯＭ２０２、フラッシュＲＯＭ２０４、フラッシュＲＯＭ２０６を含んでいてもよい。
【００２６】
ここで、ＣＰＵｓ２０１は、マルチコアプロセッサシステム１００の全体の制御を司る。ＣＰＵｓ２０１は、シングルコアのプロセッサを並列して接続した全てのＣＰＵを指している。ＣＰＵｓ２０１は、ＣＰＵ＃０〜ＣＰＵ＃ｎを含む。ｎは、２以上の整数である。ＣＰＵ＃０〜ＣＰＵ＃ｎは、それぞれ専用のキャッシュメモリを有してもよい。また、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、シングルコアのプロセッサであるＣＰＵが並列されている形態を例にあげて説明する。
【００２７】
ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０３は、ＣＰＵｓ２０１のワークエリアとして使用される。フラッシュＲＯＭ２０４は、読出し速度が高速なフラッシュＲＯＭであり、たとえば、ＮＯＲ型フラッシュメモリである。フラッシュＲＯＭ２０４は、ＯＳなどのシステムソフトウェアやアプリケーションソフトウェアなどを記憶している。たとえば、ＯＳを更新する場合、マルチコアプロセッサシステム１００は、Ｉ／Ｆ２０８によって新しいＯＳを受信し、フラッシュＲＯＭ２０４に格納されている古いＯＳを、受信した新しいＯＳに更新する。
【００２８】
フラッシュＲＯＭコントローラ２０５は、ＣＰＵｓ２０１の制御にしたがってフラッシュＲＯＭ２０６に対するデータのリード／ライトを制御する。フラッシュＲＯＭ２０６は、データの保存、運搬を主に目的としたフラッシュＲＯＭであり、たとえば、ＮＡＮＤ型フラッシュメモリである。フラッシュＲＯＭ２０６は、フラッシュＲＯＭコントローラ２０５の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム１００を使用するユーザがＩ／Ｆ２０８を通して取得した画像データ、映像データなどや、また本実施の形態にかかる同期方法を実行するプログラムなどを記憶してもよい。フラッシュＲＯＭ２０６は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００２９】
ディスプレイ２０７は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ２０７は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。
【００３０】
Ｉ／Ｆ２０８は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２１０に接続され、ネットワーク２１０を介して他の装置に接続される。そして、Ｉ／Ｆ２０８は、ネットワーク２１０と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０８には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００３１】
キーボード２０９は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２０９は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００３２】
（マルチコアプロセッサシステム１００の機能）
次に、マルチコアプロセッサシステム１００の機能について説明する。図３は、マルチコアプロセッサシステム１００の機能例を示すブロック図である。なお、マルチコアプロセッサシステム１００は、各機能からアクセスされるテーブルとして、プロセステーブル３０１、同期情報テーブル３０２にアクセス可能である。また、ＣＰＵ＃０〜ＣＰＵ＃２は、専有のメモリ領域として、それぞれ、専有メモリ領域３０３＃０〜専有メモリ領域３０３＃２にアクセス可能である。
【００３３】
マルチコアプロセッサシステム１００は、同期処理部３１０と同期信号受信部３１１、同期信号受信部３１２を含む。同期処理部３１０は、同期マスタＣＰＵに含まれる機能であり、同期信号受信部３１１、同期信号受信部３１２は、被同期対象ＣＰＵに含まれる機能である。なお、同期処理部３１０〜同期信号受信部３１２は、ＣＰＵ＃０〜ＣＰＵ＃２のカーネル空間にて動作する。また、同期処理部３１０は、登録部３２１、送信部３２２、受信部３２３、通知部３２４を含む。さらに、同期信号受信部３１１は、受信部３３１、カウント部３３２、比較部３３３、作成部３３４、設定部３３５、切替部３３６、送信部３３７、通知部３３８を含む。続けて、同期信号受信部３１２は、受信部３４１、比較部３４２、切替部３４３、比較部３４４、通知部３４５を含む。
【００３４】
この制御部となる機能（登録部３２１〜通知部３４５）は、記憶装置に記憶されたプログラムをＣＰＵ＃０〜ＣＰＵ＃ｎが実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、フラッシュＲＯＭ２０４、フラッシュＲＯＭ２０６などである。または、Ｉ／Ｆ２０８を経由して他のＣＰＵが実行することにより、その機能を実現してもよい。
【００３５】
また、図３に示すマルチコアプロセッサシステム１００は、ＣＰＵ＃０がユーザ空間にてスレッド０を実行し、ＣＰＵ＃１がユーザ空間にてスレッド１を実行し、ＣＰＵ＃２がユーザ空間にてスレッド２を実行する場合を想定している。さらに図３では、スレッド０が同期マスタスレッドとなった場合を想定し、ＣＰＵ＃０が同期マスタＣＰＵ、ＣＰＵ＃１とＣＰＵ＃２が被同期対象ＣＰＵとなった場合を想定している。たとえば、スレッド１が同期マスタスレッドとなった場合、ＣＰＵ＃１に同期処理部３１０の機能が含まれる。
【００３６】
また、同期信号受信部３１１＃１と同期信号受信部３１２＃１は被同期対象ＣＰＵとなるＣＰＵ＃１の機能であり、同期信号受信部３１１＃２と同期信号受信部３１２＃２は被同期対象ＣＰＵとなるＣＰＵ＃２の機能である。なお、図３では省略されているが、同期信号受信部３１１＃２は、受信部３３１〜通知部３３８と同等の機能を含み、同期信号受信部３１２＃２は、受信部３４１〜通知部３４５と同等の機能を含む。
【００３７】
プロセステーブル３０１は、スレッドとＣＰＵｓ２０１が関連付けられたテーブルである。なお、プロセステーブル３０１は、ＯＳ等によってスレッドが生成、終了するたびに更新される。プロセステーブル３０１の詳細は、図４にて後述する。同期情報テーブル３０２は、同期処理を行うＣＰＵ数と、ＣＰＵ番号が格納されている。同期情報テーブル３０２の詳細は、図５にて後述する。
【００３８】
専有メモリ領域３０３は、各ＣＰＵが専有してアクセスするメモリ領域である。たとえば、ＣＰＵ＃０は、スレッド０にてアクセスされるデータを専有メモリ領域３０３＃０に格納する。また、ＣＰＵ＃０は、スレッド０とスレッド１から共有してアクセスされるデータを共有メモリ領域１０３に格納する。
【００３９】
また、マルチコアプロセッサシステム１００は、到達数Ｍを記憶する記憶領域にアクセス可能である。到達数Ｍは、同期対象ＣＰＵのうち、同期ポイントに到達したＣＰＵ数と定義してもよいし、または、被同期対象ＣＰＵのうち、同期ポイントに到達したＣＰＵ数と定義してもよい。前者の定義であれば、マルチコアプロセッサシステム１００は到達数Ｍを、同期マスタＣＰＵを含めてカウントし、後者の定義であれば、マルチコアプロセッサシステム１００は到達数Ｍを、同期マスタＣＰＵを含めずにカウントする。本実施の形態では、到達数Ｍの定義を、後者の定義を用いて説明を行う。
【００４０】
同期処理部３１０は、同期処理の送信側である同期マスタＣＰＵに含まれる機能である。同期信号受信部３１１、同期信号受信部３１２は、同期処理の受信側である被同期対象ＣＰＵに含まれる機能である。同期信号受信部３１１は、被同期対象スレッドが同期ポイントに到達した際に動作する。同期信号受信部３１２は、被同期対象ＣＰＵからのレディ信号を受信した際に動作する。
【００４１】
登録部３２１は、第１ＣＰＵによって発行された同期命令に基づいて、同期する複数のＣＰＵと複数のＣＰＵ数とを同期情報テーブル３０２に登録する機能を有する。たとえば、登録部３２１は、同期対象ＣＰＵとなるＣＰＵ＃０、ＣＰＵ＃１、ＣＰＵ＃２と、ＣＰＵ数３を同期情報テーブル３０２に登録する。また、登録部３２１は、被同期対象ＣＰＵ数を同期情報テーブル３０２に登録してもよい。図３の場合、登録部３２１は、被同期対象ＣＰＵ数２を同期情報テーブル３０２に登録する。なお、本実施の形態では、到達数Ｍの定義を、同期マスタＣＰＵを含めずにカウントすることを想定しているため、被同期対象ＣＰＵ数を同期情報テーブル３０２に登録する例で説明を行う。
【００４２】
また、登録部３２１は、処理とＣＰＵとの関連を示すプロセステーブル３０１に基づいて同期情報テーブル３０２に登録してもよい。なお、登録されたという情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４３】
送信部３２２は、複数のＣＰＵのうち第１ＣＰＵを除く他のＣＰＵに同期信号と同期ポイントへの到達数を送信する。たとえば、送信部３２２は、ＣＰＵ＃１とＣＰＵ＃２に同期信号と到達数Ｍ＝０が格納されたＲＡＭ２０３上のポイントを送信する。なお、送信したという情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４４】
受信部３２３は、複数のＣＰＵのうち第１ＣＰＵを除く他のＣＰＵから同期信号の応答となる信号を受信する。たとえば、受信部３２３は、ＣＰＵ＃１とＣＰＵ＃２から、同期信号の応答となるレディ信号を受信する。また、レディ信号は、同期信号と同一の情報であってもよい。なお、受信結果は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４５】
通知部３２４は、複数のＣＰＵのうち第１ＣＰＵを除く他のＣＰＵの全てから同期信号の応答となる信号を受信した場合、第１ＣＰＵで実行するスレッドに同期処理の完了を通知する機能を有する。たとえば、通知部３２４は、ＣＰＵ＃１とＣＰＵ＃２とからレディ信号を受信した場合、同期処理の完了をスレッド０に通知する。なお、通知したという情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４６】
受信部３３１は、同期命令に基づく同期信号を受信する機能を有する。たとえば、受信部３３１は、送信部３２２によって送信された同期信号を受信する。なお、受信結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４７】
カウント部３３２は、同期信号に基づいて同期ポイントへの到達数をカウントする機能を有する。たとえば、カウント部３３２は、同期ポイントへの到達数Ｍをカウントする。なお、カウントを行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４８】
比較部３３３は、カウント部３３２によって到達数がカウントされた場合、同期ポイントへの到達数と所定値を比較する機能を有する。ここで、所定値Ｎは、同期命令に基づいて同期されるＣＰＵ数であり、たとえば、ＣＰＵ＃０〜ＣＰＵ＃２から、Ｎ＝３としてもよい。また、所定値Ｎは、被同期対象ＣＰＵ数としてもよい。この場合、所定値Ｎは、Ｎ＝２となる。たとえば、比較部３３３は、到達数Ｍと所定値Ｎを比較する。なお、比較結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶される。
【００４９】
作成部３３４は、比較部３３３による比較結果が一致しない場合、同期ポイントへの到達数に基づいて第１共有メモリ領域を複製して第２共有メモリ領域を作成する機能を有する。なお、第１共有メモリ領域には、複数のＣＰＵのうち各ＣＰＵが実行するスレッド群から共有してアクセスされるデータが格納されている。たとえば、作成部３３４は、共有メモリ領域１０３を複製して複製先共有メモリ領域１０４＃１＿１を作成する。
【００５０】
さらに、作成部３３４は、第１共有メモリ領域の複製である第３共有メモリ領域を作成してもよい。たとえば、作成部３３４は、共有メモリ領域１０３を複製して、複製先共有メモリ領域１０４＃１＿２を作成する。なお、複製先共有メモリ領域１０４を作成したという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５１】
設定部３３５は、比較部３３３による比較結果が一致しない場合、同期ポイントに到達したＣＰＵが実行するスレッドのアクセス先を第１共有メモリ領域のデータから作成部３３４によって作成された第２共有メモリ領域のデータに設定する機能を有する。たとえば、設定部３３５は、スレッド１のアクセス先を共有メモリ領域１０３に格納されたデータから複製先共有メモリ領域１０４＃１＿１に格納されたデータに設定する。なお、設定されたという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５２】
切替部３３６は、比較部３３３による比較結果が一致しない場合、同期信号受信部３１１の実行と同期信号受信部３１２の実行とを切り替える機能を有する。具体的には、切替部３３６は、比較部３３３による比較結果が一致しない場合、同期信号に対する同期信号受信部３１１の呼び出しを被活性化し、レディ信号に対する同期信号受信部３１２の呼び出しを活性化する。なお、切替を行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５３】
送信部３３７は、同期信号に対応するレディ信号と同期ポイントへの到達数とを複数のＣＰＵに送信する機能を有する。たとえば、送信部３３７は、レディ信号と到達数Ｍを、ＣＰＵ＃０、ＣＰＵ＃２に送信する。なお、送信を行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５４】
通知部３３８は、比較部３３３による比較結果が一致しない場合、同期信号受信後の処理を投機実行させる指示を、処理を実行するスレッドに通知する機能を有する。または、通知部３３８は、比較部３３３による比較結果が一致する場合、同期信号受信後の処理を実行させる指示を、処理を実行するスレッドに通知する機能を有する。たとえば、通知部３３８は、比較部３３３による比較結果が一致しない場合、スレッド１に投機実行させる指示を通知する。また、通知部３３８は、比較部３３３による比較結果が一致する場合、スレッドを実行させる指示を通知する。なお、通知を行ったという結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５５】
受信部３４１は、送信部３３７によって送信されたレディ信号と同期ポイントへの到達数とを受信する機能を有する。たとえば、受信部３４１は、ＣＰＵ＃２から送信されたレディ信号と到達数Ｍを受信する。なお、受信結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５６】
比較部３４２は、受信部３４１によってレディ信号と同期ポイントへの到達数とが受信された場合、同期ポイントへの到達数と所定値とを比較する機能を有する。たとえば、比較部３４２は、到達数Ｍと所定値Ｎを比較する。なお、比較結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶される。
【００５７】
切替部３４３は、比較部３４２による比較結果が一致を示す場合、同期信号受信部３１１の実行と同期信号受信部３１２の実行とを切り替える機能を有する。具体的には、切替部３４３は、比較部３４２による比較結果が一致する場合、同期信号に対する同期信号受信部３１１の呼び出しを活性化し、レディ信号に対する同期信号受信部３１２の呼び出しを非活性化する。なお、切替を行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５８】
比較部３４４は、比較部３４２による比較結果が一致を示す場合、第１共有メモリ領域のデータと第２共有メモリ領域のデータとを比較する機能を有する。たとえば、比較部３４４は、共有メモリ領域１０３に格納されているデータと複製先共有メモリ領域１０４＃１＿１に格納されているデータとを比較する。また、比較部３４４は、第２共有メモリ領域のデータと第３共有メモリ領域のデータとを比較してもよい。たとえば、比較部３４４は、複製先共有メモリ領域１０４＃１＿１に格納されているデータと複製先共有メモリ領域１０４＃１＿２に格納されているデータを比較する。なお、比較結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶される。
【００５９】
通知部３４５は、比較部３４４の比較結果に基づいて、同期信号受信後の処理を継続または中断する指示を通知する機能を有する。具体的には、一致を示す比較結果を有する場合、通知部３４５は比較後に処理を継続する指示をスレッド１に通知する。また、不一致を示す比較結果を有する場合、通知部３４５は同期信号受信後に実行した処理を中断する指示をスレッド１に通知する。なお、通知を行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶される。
【００６０】
このように、マルチコアプロセッサシステム１００は、複数のコアのうち特定のコアによって発行された同期信号を複数のコアのうち特定のコア以外の他のコアによって受信する。続けて、マルチコアプロセッサシステム１００は、同期ポイントへ到達し同期信号の受信が完了した場合、同期信号に対応するレディ信号と同期ポイントへ到達したコア数とを複数のコアに送信する。送信されたレディ信号と同期ポイントへ到達したコア数が他のコアによって受信された場合、マルチコアプロセッサシステム１００は、他のコアの数と同期ポイントへ到達したコア数とを同期ポイントへ到達したコアの各々によって比較する。
【００６１】
コア数の比較となる第１の比較結果が一致しない場合、マルチコアプロセッサシステム１００は、複数のコアのうち各コアが実行するスレッド群から共有してアクセスされる複製元のデータを同期ポイントへ到達したコアごとに複製する。また、第１の比較結果が一致しない場合、マルチコアプロセッサシステム１００は、同期ポイントへ到達したコアが実行するスレッドのアクセス先をデータから複製された複製先のデータに設定する。また、第１の比較結果が一致する場合、マルチコアプロセッサシステム１００は、複製元のデータと複製先のデータとを同期ポイントへ到達したコアによって比較する。
【００６２】
第１の比較結果が一致しない場合、マルチコアプロセッサシステム１００は、スレッドを投機実行させる指示を同期ポイントへ到達したコアからスレッドに通知する。また、データの比較となる第２の比較結果が一致する場合、マルチコアプロセッサシステム１００は、スレッドの投機実行を継続させる指示を同期ポイントへ到達したコアからスレッドに通知する。また、第２の比較結果が一致しない場合、マルチコアプロセッサシステム１００は、スレッドを再実行させる指示を同期ポイントへ到達したコアからスレッドに通知する。
【００６３】
図４は、プロセステーブル３０１の記憶内容の一例を示す説明図である。プロセステーブル３０１は、ＰＩＤ、ＰＰＩＤ、ＰＧＩＤ、ＣＰＵ番号という４つのフィールドを含む。ＰＩＤフィールドには、ＰＩＤ（Ｐｒｏｃｅｓｓ  ＩＤ）という、プロセスまたはスレッドを一意に特定可能な識別子が格納される。以下、説明の記載をスレッドに統一して行う。また、以下のプロセステーブル３０１の説明では、ＰＩＤフィールドに格納されたスレッドを対象スレッドとする。
【００６４】
ＰＰＩＤフィールドには、ＰＰＩＤ（Ｐａｒｅｎｔ  ＰＩＤ）という、対象スレッドの親スレッドのＰＩＤが格納される。ＰＧＩＤフィールドには、ＰＧＩＤ（Ｐｒｏｃｅｓｓ  Ｇｒｏｕｐ  ＩＤ）という、対象スレッドが含まれるスレッドグループ番号が格納される。また、本実施の形態では、ＰＩＤとＰＧＩＤが同一であるとき、スレッドグループ内の親スレッドであると想定する。ＣＰＵ番号フィールドには、対象スレッドが割り当てられたＣＰＵ番号が格納される。
【００６５】
たとえば、ＰＩＤ＝１００１のスレッドは、ＰＧＩＤ＝１００１のグループに属しており、ＣＰＵ＃１に割り当てられている。以下、ＰＩＤ＝ｘのスレッドをスレッドｘとして呼称する。スレッド１００１は、ＰＩＤ＝ＰＧＩＤ＝１００１となるため、ＰＧＩＤ＝１００１のスレッドグループでの親スレッドとなる。なお、スレッド１００１は、ＰＰＩＤ＝１に設定されている。スレッド１は、たとえば、マルチコアプロセッサシステム１００で動作中のＯＳがＵＮＩＸ（登録商標）であれば、ｉｎｉｔプロセスとなる。
【００６６】
スレッド１００２は、ＰＧＩＤ＝１００１のスレッドグループに属しており、ＣＰＵ＃４に割り当てられている。また、スレッド１００２は、ＰＰＩＤ＝１００１であるため、スレッド１００１の子スレッドである。同様に、スレッド１００３、スレッド１００４、スレッド１００５は、ＰＧＩＤ＝１００１のスレッドグループに属しており、スレッド１００１の子スレッドである。また、スレッド１００３は、ＣＰＵ＃５に割り当てられ、スレッド１００４は、ＣＰＵ＃６に割り当てられ、スレッド１００５は、ＣＰＵ＃８に割り当てられている。
【００６７】
また、スレッド１００６は、ＰＩＤ＝ＰＧＩＤ＝１００６となるため、ＰＧＩＤ＝１００６のスレッドグループでの親スレッドとなる。さらに、スレッド１００６は、ＣＰＵ＃０に割り当てられる。スレッド１００７は、ＰＧＩＤ＝１００６のスレッドグループに属しており、ＣＰＵ＃２に割り当てられている。また、スレッド１００７は、ＰＰＩＤ＝１００６であるため、スレッド１００６の子スレッドである。
【００６８】
図５は、同期情報テーブル３０２の記憶内容の一例を示す説明図である。テーブルは、被同期対象ＣＰＵ数、同期対象ＣＰＵという２つのフィールドを含む。被同期対象ＣＰＵ数フィールドには、被同期対象ＣＰＵの総数が格納される。同期対象ＣＰＵフィールドには、同期対象ＣＰＵのＣＰＵ番号が格納される。たとえば、図５では、被同期対象数が４となり、同期対象ＣＰＵとして、ＣＰＵ＃１、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８であるというレコードが格納されている。
【００６９】
図６は、マルチコアプロセッサシステム１００の同期処理の動作例を示す説明図である。図６では、同期マスタＣＰＵとなるＣＰＵ＃１が同期開始を行い、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８が、被同期対象ＣＰＵとして、同期処理を実行する場合の動作例を示す。また、ＣＰＵ＃１は図４で示したスレッド１００１を実行し、ＣＰＵ＃４はスレッド１００２を実行し、ＣＰＵ＃５はスレッド１００３を実行し、ＣＰＵ＃６はスレッド１００４を実行し、ＣＰＵ＃８はスレッド１００５を実行する。
【００７０】
時刻ｔ１にて、ＣＰＵ＃１が同期ポイントに到達すると、ＣＰＵ＃１は、プロセステーブル３０１から、同期情報テーブル３０２のレコードを生成する。具体的には、ＣＰＵ＃１は、ＣＰＵ＃１が実行するスレッド１００１と同一のスレッドグループに含まれる、スレッド１００１〜スレッド１００５を抽出する。抽出後、ＣＰＵ＃１は、同期情報テーブル３０２の新規レコードの被同期対象ＣＰＵ数フィールドに、スレッド１００２〜スレッド１００５を実行するＣＰＵ数であるＮ＝４を登録する。また、ＣＰＵ＃１は、新規レコードの同期対象ＣＰＵフィールドにスレッド１００１〜スレッド１００５を実行するＣＰＵ番号である＃１、＃４、＃５、＃６、＃８を登録する。
【００７１】
登録後、ＣＰＵ＃１は、同期情報テーブル３０２を参照して、同期対象ＣＰＵに同期信号を通知する。しかしながら、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８は、クリティカルセクション中であり、同期信号を受信できない状態である。なお、同期信号を通知後、ＣＰＵ＃１は、被同期対象ＣＰＵからのレディ信号を監視する。また、ＣＰＵ＃１は、スレッド１００１と無関係な他のスレッドを実行していてもよい。
【００７２】
続けて、時刻ｔ２にて、ＣＰＵ＃５がクリティカルセクションを終了し同期ポイントに到達すると、ＣＰＵ＃５は、レディ信号をブロードキャスト送信し、スレッド１００３の後続処理を投機実行する。同様に、時刻ｔ３にて、ＣＰＵ＃８がクリティカルセクションを終了し同期ポイントに到達すると、ＣＰＵ＃８は、レディ信号をブロードキャスト送信し、スレッド１００５の後続処理を投機実行する。また、時刻ｔ４にて、ＣＰＵ＃４がクリティカルセクションを終了し同期ポイントに到達すると、ＣＰＵ＃４は、レディ信号をブロードキャスト送信し、スレッド１００２の後続処理を投機実行する。
【００７３】
最後に、時刻ｔ５にて、ＣＰＵ＃６がクリティカルセクションを終了し同期ポイントに到達すると、ＣＰＵ＃６は、レディ信号をブロードキャスト送信する。全てのＣＰＵが同期ポイントに到達したことを検出したＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃８は、時刻ｔ６にて投機実行を継続するか中断するかを判断する。以下、マルチコアプロセッサシステム１００の時刻ｔ１、時刻ｔ２、時刻ｔ３、時刻ｔ５、時刻ｔ６における状態を、それぞれ図７〜図１１にて示す。なお、時刻ｔ４におけるマルチコアプロセッサシステム１００の状態は、時刻ｔ３と大きく変わらないため、図示を省略する。
【００７４】
図７は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ１における状態を示す説明図である。同期ポイントに到達したＣＰＵ＃１は、処理（１）として、同期信号を同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８に通知する。また、同期信号の通知に合わせて、ＣＰＵ＃１は、被同期対象ＣＰＵのうち、同期ポイントへ到達したＣＰＵ数を示す到達数ＭをＭ＝０として通知し、さらに、同期情報テーブル３０２を通知する。なお、具体的には、到達数Ｍと同期情報テーブル３０２は、ＣＰＵｓ２０１が共有してアクセス可能なメモリ１０１に格納されているため、それぞれが格納されているアドレスを通知してもよい。
【００７５】
図８は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ２における状態を示す説明図である。時刻ｔ２にて同期ポイントに到達したＣＰＵ＃５は、処理（２）として、到達数Ｍの値を、Ｍ＝Ｎ−（Ｎ−１）＝１としてインクリメントする。さらに、ＣＰＵ＃５は、Ｍ＝１とレディ信号を、同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃１、ＣＰＵ＃４、ＣＰＵ＃６、ＣＰＵ＃８に通知する。また、ＣＰＵ＃５は、Ｍ＜Ｎであることから、まだ同期ポイントに未到達である被同期対象ＣＰＵが存在することを判定し、スレッド１００３の後続処理を投機実行する。なお、投機実行の動作については、図９にて説明を行う。
【００７６】
また、到達数Ｍへのインクリメントに関して、仮に同じタイミングで発行されてもポインタ変数の先の実体数字を変更できるＣＰＵは、同時期には１つのＣＰＵである。到達数Ｍへのインクリメントは、実装ロジックがインクリメント命令であるため、全く同じタイミングでアクセスが行われたとしても、確実に１つずつインクリメントが行われることになる。
【００７７】
図９は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ３における状態を示す説明図である。時刻ｔ３にて同期ポイントに到達したＣＰＵ＃８は、処理（３）として、到達数Ｍの値を、Ｍ＝Ｍ＋１＝２としてインクリメントする。さらに、ＣＰＵ＃８は、Ｍ＝２とレディ信号を、同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃１、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６に通知する。また、ＣＰＵ＃８は、Ｍ＜Ｎであることから、まだ同期ポイントに未到達である被同期対象ＣＰＵが存在することを判定し、スレッド１００５の後続処理を投機実行する。
【００７８】
なお、時刻ｔ２にて同期ポイントに到達したＣＰＵ＃５は、スレッド１００３の後続処理を投機実行する。具体的に、ＣＰＵ＃５は、共有メモリ領域１０３を複製した複製先共有メモリ領域１０４＃５＿１、複製先共有メモリ領域１０４＃５＿２を作成する。作成後、ＣＰＵ＃５は、複製先共有メモリ領域１０４＃５＿１をアクセス先としてスレッド１００３の後続処理を投機実行する。なお、複製先共有メモリ領域１０４＃５＿２はスレッド１００３からアクセスされない。したがって、複製先共有メモリ領域１０４＃５＿２に格納されているデータは、同期処理完了時までデータが変更されずに保存される。
【００７９】
なお、図示していないが、時刻ｔ４において同期ポイントに到達したＣＰＵ＃４は、処理（４）として、到達数Ｍの値を、Ｍ＝Ｍ＋１＝３としてインクリメントする。さらに、ＣＰＵ＃４は、Ｍ＝３とレディ信号を、同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃１、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８に通知する。また、ＣＰＵ＃４は、Ｍ＜Ｎであることから、まだ同期ポイントに未到達である被同期対象ＣＰＵが存在することを判定し、スレッド１００２の後続処理を投機実行する。
【００８０】
図１０は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ５における状態を示す説明図である。時刻ｔ５にて同期ポイントに到達したＣＰＵ＃６は、処理（５）として、到達数Ｍの値を、Ｍ＝Ｍ＋１＝４としてインクリメントする。さらに、ＣＰＵ＃６は、Ｍ＝４とレディ信号を、同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃１、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃８に通知する。なお、ＣＰＵ＃６は、Ｍ＝Ｎ＝４であることから、被同期対象ＣＰＵが全て同期ポイントに到達したことを判定し、スレッド１００４の後続処理を実行する。
【００８１】
また、時刻ｔ５の時点にて、時刻ｔ２にて同期ポイントに到達したＣＰＵ＃５はスレッド１００３の後続処理を投機実行している。同様に、時刻ｔ３にて同期ポイントに到達したＣＰＵ＃８はスレッド１００５の後続処理を投機実行し、時刻ｔ４にて同期ポイントに到達したＣＰＵ＃４はスレッド１００２の後続処理を投機実行している。ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃８は、レディ信号を受信すると、投機実行の成否を複製先共有メモリ領域１０４のデータを比較することで判定する。具体的な判定方法は、図１１にて説明する。
【００８２】
図１１は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ６における状態を示す説明図である。時刻ｔ６にて、レディ信号を受信したＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃８は、２つの複製先共有メモリ領域１０４のデータが一致するかを判定する。たとえば、ＣＰＵ＃４は、複製先共有メモリ領域１０４＃４＿１と複製先共有メモリ領域１０４＃４＿２のデータを比較する。
【００８３】
図１１では、複製先共有メモリ領域１０４＃４＿１と複製先共有メモリ領域１０４＃４＿２が一致しない状態を想定している。比較してデータが一致しない場合、スレッド１００２の投機実行は、共有メモリ領域１０３を変更することを示している。したがって、投機実行が本来不可能であることを意味するため、ＣＰＵ＃４は、投機実行を中断し、後続処理を再実行する。同様に、ＣＰＵ＃８も、複製先共有メモリ領域１０４＃８＿１と複製先共有メモリ領域１０４＃８＿２が一致しなかったため、スレッド１００５の投機実行を中断して投機実行の結果を破棄し、後続処理を再実行する。
【００８４】
また、ＣＰＵ＃５は、複製先共有メモリ領域１０４＃５＿１と複製先共有メモリ領域１０４＃５＿２のデータを比較する。図１１では、複製先共有メモリ領域１０４＃５＿１と複製先共有メモリ領域１０４＃５＿２が一致する状態を想定している。比較してデータが一致する場合、スレッド１００３の投機実行は、ＣＰＵ＃５の専有メモリ領域のリードライト処理で完結しており、共有メモリ領域１０３を変更せず、冗長な同期処理であったことを示している。したがって、ＣＰＵ＃５は、投機実行を継続する。
【００８５】
なお、共有メモリ領域１０３のデータは、同期マスタＣＰＵによる同期処理以外の他の処理や、または同期対象ＣＰＵ以外の他のＣＰＵによって変更される可能性がある。変更される場合としては、同期対象ＣＰＵでの他の処理が意図的、または不具合によってデータを変更する場合、または、本来同期対象ＣＰＵに含まれるはずの他のＣＰＵがデータを変更してしまう場合等がある。このような動作は、従来例にかかるマルチコアプロセッサシステム１００であっても起こりうる。
【００８６】
たとえば、本実施の形態にかかるマルチコアプロセッサシステム１００において、複製先共有メモリ領域１０４＃ｘ＿１と共有メモリ領域１０３で投機実行の成否を判定する場合を想定する。なお、ｘは投機実行したＣＰＵ番号であると想定する。このとき、全く同じようにデータが変更されると、投機実行が失敗しているにも関わらず、成功として判断されてしまう。このように、複製先共有メモリ領域１０４＃ｘ＿１と共有メモリ領域１０３を比較すると、不具合が隠されてしまう可能性が存在する。したがって、マルチコアプロセッサシステム１００は、投機実行の成否の判定を、共有メモリ領域１０３のデータを用いずに、複製先共有メモリ領域１０４で行う。
【００８７】
また、マルチコアプロセッサシステム１００は、ＣＰＵ＃ｘが投機実行を継続する場合に、投機実行のデータアクセス先を、複製先共有メモリ領域１０４＃ｘ＿１から共有メモリ領域１０３に切り替える。このとき、複製先共有メモリ領域１０４＃ｘ＿１と共有メモリ領域１０３とでデータが一致しない場合、マルチコアプロセッサシステム１００は、ＯＳの機能によってメモリエラー等を発行してもよい。
【００８８】
なお、同期マスタＣＰＵによって共有メモリ領域１０３のデータが書き換えられないことを想定してもよい場合、マルチコアプロセッサシステム１００は、複製先共有メモリ領域１０４＃ｘ＿１のみを作成してもよい。この場合、ＣＰＵ＃ｘは、共有メモリ領域１０３と複製先共有メモリ領域１０４＃ｘ＿１を比較して、投機実行が成功したか否かの有無を判定する。これにより、作成される複製先共有メモリ領域１０４を一つにでき、処理を高速化することができる。
【００８９】
図１２は、動画再生アプリへの適用例を示す説明図である。図１２では、動画再生アプリの処理群のブロック図を示しており、処理群のうち、排他制御処理、バリア同期処理を行う箇所、クリティカルセクションとなる処理を示している。
【００９０】
初めに、動画再生アプリは、ストリームデータ読出スレッド１２０１、デマルチプレクススレッド１２０２、ビデオスレッド１２０３、オーディオスレッド１２０４、ＡＶ出力スレッド１２０５を含む。
【００９１】
ストリームデータ読出スレッド１２０１は、ストリームを読み出す機能を有する。具体的に、ストリームデータ読出スレッド１２０１は、ＯＳの機能であるファイルシステム１２１１を利用して、ストレージコンテンツストリーム１２６１から、動画データを読み込み、ストリームバッファ１２６２に格納する。また、ストリームデータ読出スレッド１２０１は、ストリーム枯渇監視部１２１２によって、ストリームバッファ１２６２が枯渇してきたことを検出する。検出された場合、ストリームデータ読出スレッド１２０１は、ファイル読出部１２１３によって、ファイルシステム１２１１から、新たな動画データをストリームバッファ１２６２に書き込む。
【００９２】
デマルチプレクススレッド１２０２は、読み出したストリームをビデオとオーディオデータに分割する機能を有する。具体的に、デマルチプレクススレッド１２０２は、ストリームバッファ１２６２から動画データを読み込み、デマルチプレクス部１２２１により、ＶＥＳ（Ｖｉｄｅｏ  Ｅｌｅｍｅｎｔａｒｙ  Ｓｔｒｅａｍ）データと、ＡＥＳ（Ａｕｄｉｏ  Ｅｌｅｍｅｎｔａｒｙ  Ｓｔｒｅａｍ）データに分離する。分離後、デマルチプレクススレッド１２０２は、ＶＥＳデータをＶＥＳデータ出力部１２２２によりＶＥＳバッファ１２６３に格納し、ＡＥＳデータをＡＥＳデータ出力部１２２３によりＡＥＳバッファ１２６４に格納する。
【００９３】
また、デマルチプレクススレッド１２０２は、ＶＥＳデータ枯渇監視部１２２４によって、ＶＥＳバッファ１２６３が枯渇してきた場合、デマルチプレクス部１２２１に分離要求を通知する。同様に、デマルチプレクススレッド１２０２は、ＡＥＳデータ枯渇監視部１２２５によって、ＡＥＳバッファ１２６４が枯渇してきた場合、デマルチプレクス部１２２１に分離要求を通知する。
【００９４】
ビデオスレッド１２０３は、ビデオ処理を行う機能を有する。具体的に、ビデオスレッド１２０３は、ＶＥＳ読出部１２３１によってＶＥＳデータを読み出し、ビデオデコード部１２３２によってＶＥＳデータをデコードし、ＶＦ（Ｖｉｄｅｏ  Ｆｒａｍｅ）データを生成する。生成後、ビデオスレッド１２０３は、ＶＦデータ出力部１２３３によってＶＦバッファ１２６５に格納する。また、ビデオスレッド１２０３は、ＶＦデータ枯渇監視部１２３４によって、ＶＦバッファ１２６５が枯渇してきた場合、ＶＥＳ読出部１２３１に読出要求を通知する。
【００９５】
オーディオスレッド１２０４は、オーディオ処理を行う機能を有する。具体的に、オーディオスレッド１２０４は、ＡＥＳ読出部１２４１によってＡＥＳデータを読み出し、オーディオデコード部１２４２によってＡＥＳデータをデコードし、ＡＦ（Ａｕｄｉｏ  Ｆｒａｍｅ）データを生成する。生成後、オーディオスレッド１２０４は、ＡＦデータ出力部１２４３によってＡＦバッファ１２６６に格納する。また、オーディオスレッド１２０４は、ＡＦデータ枯渇監視部１２４４によって、ＡＦバッファ１２６６が枯渇してきた場合、ＡＥＳ読出部１２４１に読出要求を通知する。
【００９６】
ＡＶ出力スレッド１２０５は、デコードされたビデオとオーディオデータを同期し表示する機能を有する。具体的には、ＡＶ出力スレッド１２０５は、ＡＶ出力同期部１２５１によって、ビデオドライバ１２５２、オーディオドライバ１２５３を同期させて動画データを出力する。ビデオドライバ１２５２は、ＶＦバッファ１２６５からＶＦデータを読み出し、ディスプレイ２０７に出力する。オーディオドライバ１２５３は、ＡＦバッファ１２６６からＡＦデータを読み出し、Ｉ／Ｆ２０８に接続されたスピーカ等に出力する。
【００９７】
このように、ストリームデータ読出スレッド１２０１〜ＡＶ出力スレッド１２０５は、独立な処理を行うため、非常に並列処理に適した構造のようにみえる。しかしながら、デマルチプレクススレッド１２０２〜ＡＶ出力スレッド１２０５は、ＶＥＳバッファ１２６３〜ＡＦバッファ１２６６で連動して動作するため、排他制御処理、バリア同期処理を挿入して設計されやすくなる。
【００９８】
具体的にどのような排他制御処理が挿入されるかというと、たとえば、ＶＥＳデータ出力部１２２２とＶＥＳ読出部１２３１は、ＶＥＳバッファ１２６３に共通してアクセスする。したがって、同時にアクセスするのを避けるため、ＶＥＳデータ出力部１２２２とＶＥＳ読出部１２３１に排他制御処理が挿入される。同様のケースが、ＡＥＳデータ出力部１２２３とＡＥＳ読出部１２４１、ＶＦデータ出力部１２３３とビデオドライバ１２５２、ＡＦデータ出力部１２４３とオーディオドライバ１２５３でも発生する。
【００９９】
また、ＶＥＳバッファ１２６３の上書きを回避するため、ＶＥＳデータ出力部１２２２の処理が、開発者によってクリティカルセクションに設定される場合もありうる。同様のケースが、ＡＥＳデータ出力部１２２３、ＶＦデータ出力部１２３３、ＡＦデータ出力部１２４３でも発生する。
【０１００】
また、ＶＥＳデータ枯渇監視部１２２４は、枯渇を監視する方法として、たとえば、ＶＥＳバッファ１２６３の書き込み位置と読み込み位置を参照する。監視中に書き込み位置と読み込み位置が変更されるのを回避するため、ＶＥＳデータ枯渇監視部１２２４の処理が、開発者によってクリティカルセクションに設定される場合もありうる。同様のケースが、ＡＥＳデータ枯渇監視部１２２５、ＶＦデータ枯渇監視部１２３４、ＡＦデータ枯渇監視部１２４４でも発生する。
【０１０１】
また、デマルチプレクス部１２２１の分離完了前にＶＥＳデータ出力部１２２２が実行開始するのを回避するため、バリア同期処理が挿入される場合もありうる。さらに、ＶＥＳデータ出力部１２２２が実行中に、ＶＥＳデータ枯渇監視部１２２４が実行開始するのを回避するため、バリア同期処理が挿入される場合もありうる。同様のケースが、デマルチプレクス部１２２１、ＡＥＳデータ出力部１２２３、ＡＥＳデータ枯渇監視部１２２５でも発生する。また、ＡＶ出力同期部１２５１は、ビデオドライバ１２５２とオーディオドライバ１２５３をたとえば１フレーム単位で同期をとって処理するため、バリア同期処理が挿入される場合がありうる。
【０１０２】
このような様々な排他制御処理、バリア同期処理が設定されうる動画再生アプリがシングルコアプロセッサシステム向けに設計される場合には、単純な排他フラグを用い、１つのバッファを切り替えながら読み書きすればよい。また、シングルコアプロセッサシステムでは、排他状態でビデオスレッド１２０３が動作できなくても、オーディオスレッド１２０４が動作することで、ＣＰＵリソースを漏れなく利用することになる。
【０１０３】
しかし、シングルコアプロセッサシステム向けの動画再生アプリをマルチコアプロセッサシステム１００が動作した場合、全ての排他制御処理のコードをそのまま実行するため、互いのＣＰＵがロックをかけあってしまい、処理が進行しなくなる。
【０１０４】
処理が進行しないことを回避するためには、開発者は、プログラム自体を並列処理に適した形式に変更することになる。具体的に、開発者は、スレッドに含まれる各機能部や動作条件を変更することで、プログラム自体を並列処理に適した形式に変更する。しかし、本実施の形態にかかるマルチコアプロセッサシステム１００は、プログラムを変更することなく、マルチコアの並列性を最大限に有効活用することができる。
【０１０５】
以下、図４、図５で示したプロセステーブル３０１、同期情報テーブル３０２を使用して、マルチコアプロセッサシステム１００は、同期処理を実行する。同期処理の処理手順の一例を図１３〜図１５にて示す。図１３では、同期処理時における同期マスタＣＰＵでの処理手順の一例を示し、図１４、図１５にて、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示す。さらに、図１４では、被同期対象ＣＰＵにて、同期信号受信部３１１が動作している状態でのフローチャートを示し、図１５では、被同期対象ＣＰＵにて、同期信号受信部３１２が動作している状態でのフローチャートを示す。また、図１３〜図１５のフローチャートの例にて、説明を簡略化するため、同期マスタＣＰＵがＣＰＵ＃１であると想定し、被同期対象ＣＰＵをＣＰＵ＃４であると想定する。
【０１０６】
図１３は、同期処理時における同期マスタＣＰＵでの処理手順の一例を示すフローチャートである。初めに、ＣＰＵ＃１は、ユーザ空間にて同期マスタスレッドを実行し、カーネル空間にて同期処理部３１０を実行している。
【０１０７】
ＣＰＵ＃１は、通常処理を実行し（ステップＳ１３０１）、通常処理内にある、同期コードとなるシステムコールを発行する（ステップＳ１３０２）。システムコールが発行されると、ＣＰＵ＃１は、ユーザモードからカーネルモードに遷移し、カーネル空間で実行されている同期処理部３１０を実行する。
【０１０８】
ＣＰＵ＃１は、同期コードを検出したか否かを判断する（ステップＳ１３０５）。なお、同期コードとは、排他制御コードやバリア同期コードである。検出していない場合（ステップＳ１３０５：Ｎｏ）、ＣＰＵ＃１は、一定時間経過後に再びステップＳ１３０５の処理を実行する。なお、ＣＰＵ＃１は、一定時間経過の間、たとえば、ユーザモードに遷移し、同期マスタスレッドを実行したり、他のユーザスレッドを実行したりする。
【０１０９】
検出した場合（ステップＳ１３０５：Ｙｅｓ）、ＣＰＵ＃１は、プロセステーブル３０１から被同期対象ＣＰＵ数を取得する（ステップＳ１３０６）。取得後、ＣＰＵ＃１は、プロセステーブル３０１から、同期対象ＣＰＵを抽出する（ステップＳ１３０７）。抽出後、ＣＰＵ＃１は、同期情報テーブル３０２に、取得した被同期対象ＣＰＵ数と、抽出した同期対象ＣＰＵを登録する（ステップＳ１３０８）。登録後、ＣＰＵ＃１は、同期信号と到達数Ｍ＝０を被同期対象ＣＰＵにブロードキャスト送信する（ステップＳ１３０９）。
【０１１０】
送信後、ＣＰＵ＃１は、全ての被同期対象ＣＰＵからレディ信号を受信したか否かを判断する（ステップＳ１３１０）。なお、レディ信号を送信する処理は、被同期対象ＣＰＵの処理内のステップＳ１４０８とステップＳ１４１１である。受信していない場合（ステップＳ１３１０：Ｎｏ）、ＣＰＵ＃１は、一定時間経過後に再びステップＳ１３１０の処理を実行する。受信した場合（ステップＳ１３１０：Ｙｅｓ）、ＣＰＵ＃１は、同期処理の完了を同期マスタスレッドに通知し（ステップＳ１３１１）、同期処理部３１０の処理を終了する。
【０１１１】
また、ユーザモードに遷移したＣＰＵ＃１は、同期処理の完了を受け付けたか否かを判断する（ステップＳ１３０３）。受け付けていない場合（ステップＳ１３０３：Ｎｏ）、ＣＰＵ＃１は、一定時間経過後に再びステップＳ１３１０の処理を実行する。受け付けた場合（ステップＳ１３０３：Ｙｅｓ）、ＣＰＵ＃１は、後続処理を実行し（ステップＳ１３０４）、同期マスタスレッドの処理を終了する。
【０１１２】
図１４は、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示すフローチャート（その１）である。初めに、ＣＰＵ＃４は、ユーザ空間にて被同期対象スレッドを実行し、同期信号を受信した場合、カーネル空間にて同期信号受信部３１１を実行する。
【０１１３】
ＣＰＵ＃４は、通常処理を実行し（ステップＳ１４０１）、クリティカルセクション処理を実行する（ステップＳ１４０２）。クリティカルセクション処理の終了後、ＣＰＵ＃４は、同期信号を受信したため、ユーザモードからカーネルモードに遷移する。なお、クリティカルセクション処理が存在しない場合、ＣＰＵ＃４は、同期信号を受信してすぐに同期信号受信部３１１の処理を実行する。なお、同期信号を送信する処理は、同期マスタＣＰＵの処理内のステップＳ１３０９である。
【０１１４】
ＣＰＵ＃４は、到達数Ｍをインクリメントし（ステップＳ１４０４）、Ｍ＝Ｎとなるか否かを判断する（ステップＳ１４０５）。Ｍ＝Ｎでない場合（ステップＳ１４０５：Ｎｏ）、ＣＰＵ＃４は、複製先共有メモリ領域１０４を２つ作成する（ステップＳ１４０６）。作成後、ＣＰＵ＃４は、同期信号受信部３１１を停止し、同期信号受信部３１２を起動する（ステップＳ１４０７）。
【０１１５】
具体的な同期信号受信部３１１の停止、同期信号受信部３１２の起動方法としては、たとえば実行される関数を切り替える方法がある。たとえば、ＣＰＵ＃４は、同期信号かレディ信号を受信した場合に実行する関数ポインタを、同期信号受信部３１１を実行するコードを示すアドレスから、同期信号受信部３１２を実行するコードを示すアドレスに切り替える。これにより、ＣＰＵ＃４が次に同期信号、またはレディ信号を受信した場合、ＣＰＵ＃４は、同期信号受信部３１２を実行する。
【０１１６】
続けて、ＣＰＵ＃４は、レディ信号と到達数Ｍを、自ＣＰＵを除く同期対象ＣＰＵにブロードキャスト送信する（ステップＳ１４０８）。送信後、ＣＰＵ＃４は、後続処理のアクセス先を複製先共有メモリ領域１０４のいずれか一方に設定し（ステップＳ１４０９）、後続処理の投機実行を被同期対象スレッドに指示し（ステップＳ１４１０）、同期信号受信部３１１を終了する。
【０１１７】
Ｍ＝Ｎである場合（ステップＳ１４０５：Ｙｅｓ）、ＣＰＵ＃４は、レディ信号と到達数Ｍを、自ＣＰＵを除く同期対象ＣＰＵにブロードキャスト送信する（ステップＳ１４１１）。送信後、ＣＰＵ＃４は、後続処理の実行を被同期対象スレッドに指示し（ステップＳ１４１２）、同期信号受信部３１１を終了する。また、同期信号受信部３１１を終了し、ユーザモードに遷移したＣＰＵ＃４は、ステップＳ１４１０、ステップＳ１４１２による指示によって後続処理実行し（ステップＳ１４０３）、被同期対象スレッドの処理を終了する。
【０１１８】
図１５は、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示すフローチャート（その２）である。図１５では、レディ信号を受信したＣＰＵ＃４がカーネル空間にて同期信号受信部３１２を実行する場合について説明を行う。なお、ユーザ空間で実行している被同期対象スレッドの処理を示すステップＳ１５０１〜ステップＳ１５０３は、図１４で示したステップＳ１４０１〜ステップＳ１４０３と等しいため、説明を省略する。なお、レディ信号を送信する処理は、被同期対象ＣＰＵの処理内のステップＳ１４０８とステップＳ１４１１である。
【０１１９】
ＣＰＵ＃４は、Ｍ＝Ｎであるか否かを判断する（ステップＳ１５０４）。Ｍ＝Ｎでない場合（ステップＳ１５０４：Ｎｏ）、ＣＰＵ＃４は、一定時間経過後に再びステップＳ１５０の４処理を実行する。Ｍ＝Ｎである場合（ステップＳ１５０４：Ｙｅｓ）、ＣＰＵ＃４は、同期信号受信部３１２を停止し、同期信号受信部３１１を起動する（ステップＳ１５０５）。
【０１２０】
続けて、ＣＰＵ＃４は、２つの複製先共有メモリ領域１０４のデータを比較する（ステップＳ１５０６）。ＣＰＵ＃４は、比較結果が一致を示したか否かを判断する（ステップＳ１５０７）。一致を示す比較結果である場合（ステップＳ１５０７：Ｙｅｓ）、ＣＰＵ＃４は、後続処理のアクセス先を共有メモリ領域１０３に設定し（ステップＳ１５０８）、後続処理の投機実行の継続を被同期対象スレッドに指示する（ステップＳ１５０９）。
【０１２１】
不一致を示す比較結果である場合（ステップＳ１５０７：Ｎｏ）、ＣＰＵ＃４は、後続処理のアクセス先を共有メモリ領域１０３に設定し（ステップＳ１５１０）、被同期対象スレッドの投機実行を中断させる（ステップＳ１５１１）。続けて、ＣＰＵ＃４は、後続処理の再実行を被同期対象スレッドに指示し（ステップＳ１５１２）、同期信号受信部３１２の処理を終了する。また、ユーザモードに遷移したＣＰＵ＃４は、ステップＳ１５０９、ステップＳ１５１２による指示によって後続処理を実行する（ステップＳ１５０３）。
【０１２２】
以上説明したように、同期方法、マルチコアプロセッサシステム、および同期システムによれば、Ｎ個のＣＰＵが同期処理する場合、同期ポイント到達数Ｍ＜Ｎならデータを複製して投機実行し、Ｍ＝Ｎなら複製元と複製先のデータが同一時に投機実行を継続する。本来同期処理をとらなくてもよい冗長な同期処理が実行された場合、複製先のデータは変更されない。したがって、複製元と複製先のデータを比較することで、マルチコアプロセッサシステムは、冗長な同期処理だったか否かを判定することができる。
【０１２３】
また、マルチコアプロセッサシステムは、複数のＣＰＵの少なくとも一部が、同期信号受信後に処理の実行を継続してもよい。これにより、マルチコアプロセッサシステムは、冗長な同期処理で発生する無駄な待ち時間を有効に活用することができる。
【０１２４】
また、マルチコアプロセッサシステムは、冗長な同期処理の存在するソースコードをそのまま動作することができる。同期処理を本当に行わなければならないか否かの判定は、非常に困難である。したがって、従来例のソフトウェアは、フェールセーフの考え方から、冗長な同期処理が追加されており、結果、性能劣化が発生していた。しかし、マルチコアプロセッサシステムは、冗長な同期処理が追加されているソフトウェアをそのまま実行可能とすることで、開発コストを低減することができる。
【０１２５】
また、マルチコアプロセッサシステムは、複製元と複製先のデータが一致する場合に、比較後に処理を継続してもよい。一致した場合、冗長な同期処理であったため、マルチコアプロセッサシステムは投機実行した処理を継続することで、待ち時間を有効に活用することができる。
【０１２６】
また、マルチコアプロセッサシステムは、複製元と複製先のデータが不一致な場合に、投機実行を中断してもよい。不一致であった場合、冗長な同期処理でなかったため、マルチコアプロセッサシステムは投機実行した処理を中断することで、後続の処理を矛盾なく実行することができる。
【０１２７】
また、マルチコアプロセッサシステムは、処理とＣＰＵとの関連を示すテーブルに基づいて同期処理を行うＣＰＵ数を決定してもよい。処理とＣＰＵとの関連を示すテーブルは、ＯＳがスレッドを管理するためにあらかじめ用意してあるテーブルである。したがって、マルチコアプロセッサシステムは、本実施の形態にかかる同期方法を適用するために既存のテーブルをそのまま流用できるため、適用にかかるコストを小さくすることができる。
【０１２８】
また、マルチコアプロセッサシステムは、複製元のデータから複製先１のデータと複製先２のデータと、のように、二つの複製先を作成し、データ比較の際には、複製先１のデータと複製先２のデータを比較して、冗長な同期処理であったか否かを判定してもよい。複製元のデータは、同期マスタＣＰＵによって変更される可能性があるため、投機実行の処理が共有データを変更するか否かを判定する判定対象として相応しくない。したがって、マルチコアプロセッサシステムは、複製先１のデータと複製先２のデータを比較することで、冗長な同期処理であったか否かをより正確に判定できる。
【０１２９】
また、マルチコアプロセッサシステムは、同期マスタＣＰＵから送信される同期信号を受信した後、第１受信部を被活性化し、被同期ＣＰＵから送信されるレディ信号を受信する第２受信部を活性化してもよい。これにより、マルチコアプロセッサシステムは、１つ目に受信した信号に対応する処理と２つ目に受信した信号に対応する処理とで異なる処理を行うことができる。したがって、同期信号とレディ信号は同一の信号であってもよい。
【０１３０】
なお、本実施の形態で説明した同期方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本同期方法を実行するプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本同期方法を実行するプログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０１３１】
１００  マルチコアプロセッサシステム
１０１  メモリ
１０２  バス
１０３  共有メモリ領域
１０４  複製先共有メモリ領域
３０１  プロセステーブル
３０２  同期情報テーブル
３０３  専有メモリ領域
３１０  同期処理部
３１１、３１２  同期信号受信部
３２１  登録部
３２２、３３７  送信部
３２３、３３１、３４１  受信部
３２４、３３８、３４５  通知部
３３２  カウント部
３３３、３４２、３４４  比較部
３３４  作成部
３３５  設定部
３３６、３４３  切替部
【図１】
2012124078.tif 000003
【図２】
2012124078.tif 000004
【図３】
2012124078.tif 000005
【図４】
2012124078.tif 000006
【図５】
2012124078.tif 000007
【図６】
2012124078.tif 000008
【図７】
2012124078.tif 000009
【図８】
2012124078.tif 000010
【図９】
2012124078.tif 000011
【図１０】
2012124078.tif 000012
【図１１】
2012124078.tif 000013
【図１２】
2012124078.tif 000014
【図１３】
2012124078.tif 000015
【図１４】
2012124078.tif 000016
【図１５】
2012124078.tif 000017
【手続補正書】
【提出日】平成25年9月11日(2013.9.11)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
第１ＣＰＵによって発行された同期命令に基づいて、同期する複数のＣＰＵと前記複数のＣＰＵ数とを特定のテーブルに登録し、
前記複数のＣＰＵのそれぞれが前記第１ＣＰＵからの同期信号に基づいて、同期ポイントへの到達数をカウントするとともに前記複数のＣＰＵが実行する処理によってアクセスされる第１共有メモリ領域の複製である第２共有メモリ領域を作成し、
前記同期ポイントへの到達数が前記複数のＣＰＵ数に到達したときに、前記第１共有メモリ領域と前記第２共有メモリ領域とを比較し、
前記比較結果に基づいて前記複数のＣＰＵが実行した処理を判定すること
を特徴とする同期方法。
【請求項２】
前記複数のＣＰＵの少なくとも一部は、前記同期信号受信後に処理の実行を継続すること
を特徴とする請求項１に記載の同期方法。
【請求項３】
一致を示す比較結果を有するＣＰＵは比較後に処理を継続すること
を特徴とする請求項１または請求項２に記載の同期方法。
【請求項４】
不一致を示す比較結果を有するＣＰＵが前記同期信号受信後に実行した処理を中断すること
を特徴とする請求項１乃至請求項３の何れか一に記載の同期方法。
【請求項５】
処理とＣＰＵとの関連を示すテーブルに基づいて前記特定のテーブルに登録すること
を特徴とする請求項１乃至請求項４の何れか一に記載の同期方法。
【請求項６】
複数のＣＰＵ間で共有する第１共有メモリ領域と、
同期命令に基づく同期信号を受信する第１受信部と、
前記同期信号に基づいて同期ポイントへの到達数をカウントするカウント部と、
前記同期ポイントへの到達数に基づいて前記第１共有メモリ領域を複製して第２共有メモリ領域を作成する作成部と、
前記同期ポイントへの到達数が所定値に到達したときに、前記第１共有メモリ領域と前記第２共有メモリ領域とを比較する第１比較部と、
を含むことを特徴とするマルチコアプロセッサシステム。
【請求項７】
前記複数のＣＰＵは前記同期命令に基づいて同期されるＣＰＵであり、
前記所定値は前記複数のＣＰＵ数であること
を特徴とする請求項６に記載のマルチコアプロセッサシステム。
【請求項８】
前記同期ポイントへの到達数と前記所定値とを比較する第２比較部と、
前記複数のＣＰＵ内の少なくとも一のＣＰＵからの信号に基づいて、前記第２比較部を活性化する第２受信部と、
を含むことを特徴とする請求項６または請求項７に記載のマルチコアプロセッサシステム。
【請求項９】
前記第１受信部は、前記同期信号の受信後に非活性化されること
を特徴とする請求項６乃至請求項８の何れか一に記載のマルチコアプロセッサシステム。
【請求項１０】
前記第１比較部の比較結果に基づいて、前記同期信号受信後の処理を継続または中断することを通知する通知部、
を含むことを特徴とする請求項８または請求項９に記載のマルチコアプロセッサシステム。
【請求項１１】
少なくとも第１ＣＰＵと第２ＣＰＵとを含む複数のＣＰＵと、
前記複数のＣＰＵ間で共有する第１共有メモリ領域と、
と含み、
前記第１ＣＰＵは、前記複数のＣＰＵ間での同期処理を指示する同期命令に基づく同期信号を前記第２ＣＰＵに供給し、
前記第２ＣＰＵは、前記同期信号に基づいて、前記第１共有メモリ領域を複製して第２共有メモリ領域を作成するとともに、所定の処理を実行し、
前記複数のＣＰＵが同期するときに、前記第１共有メモリ領域と前記第２共有メモリ領域とを比較し、
前記比較結果に基づいて実行された前記所定の処理の処遇を決定すること
を特徴とする同期システム。
【請求項１２】
比較結果が一致を示すときは、前記所定の処理の続きが実行されること
を特徴とする請求項１１に記載の同期システム。
【請求項１３】
比較結果が不一致を示すとき、前記所定の処理が再実行されること
を特徴とする請求項１１または請求項１２に記載の同期システム。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、同期処理を行う同期方法、マルチコアプロセッサシステム、および同期システムに関する。
【背景技術】
【０００２】
従来から、１つのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）に対して、複数のプログラムを動作させるマルチプログラミング技術が存在する。具体的に、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）は、ＣＰＵの処理時間を分割する機能を有し、分割された時間にプロセスやスレッドを割り当てることにより、ＣＰＵが同時に複数のプロセスやスレッドを動作する。ここで、プロセスやスレッドはプログラムの実行単位である。ソフトウェアは、プロセスやスレッドの集まりとなる。また一般的に、プロセス間ではメモリ空間が独立しており、スレッド間ではメモリ空間を共有する。
【０００３】
また、近年、ＣＰＵが１つ搭載されたコンピュータであるシングルコアプロセッサシステムに代わって、ＣＰＵが複数搭載されたコンピュータであるマルチコアプロセッサシステムをとる装置が増えている。複数のＣＰＵに複数のスレッドを並列に割り当てることで、高速に処理を実行することができる。
【０００４】
このように複数のスレッドが並列に実行される場合、スレッド間の同期をとるために、同期処理が頻繁に実行される。同期処理としては、排他制御処理とバリア同期処理が存在する。
【０００５】
排他制御処理は、一方のスレッドがリソース等の使用権を獲得すると、一方のスレッドがリソースの使用権を解放するまで、他のスレッドを待機させる処理である。たとえば、複数のスレッド間が共有のデータにアクセスする際には、排他制御処理がプログラム内に追加される。バリア同期処理は、複数のスレッドの処理を特定のコード位置までで一旦停止させ、全てのスレッドが特定のコード位置に到達した際に、次の処理を継続する処理である。たとえば、複数のスレッドを特定の位置から同時に実行させたい場合、バリア同期処理がプログラム内に追加される。
【０００６】
ＯＳは、同期処理を行う同期命令をライブラリ等でアプリケーションソフトウェア（以下、アプリと称す。）に提供する。たとえば、排他制御処理を行う同期命令として、Ｍｕｔｅｘ、バリア同期処理を行う同期命令としてバリア同期命令などが存在する。
【０００７】
なお、同期処理の開始を宣言するＣＰＵは、同期命令によって同期信号を同期処理の受信側となるＣＰＵに通知する。同期信号を受信したＣＰＵは、同期処理が完了した状態を意味する信号を同期信号の通知元ＣＰＵに送信する。以下、同期処理が完了した状態を意味する信号をレディ信号と呼称する。
【０００８】
同期処理に関する技術として、たとえば、スレッド間で同期処理を行う際に、同期ポイントに到達したＣＰＵ数を数える同期計数部を有し、全てのＣＰＵが同期ポイントに到達したか否かを判断する技術が開示されている。なお、同期ポイントとは、実行コード内での同期命令が挿入された位置である。複数のＣＰＵのレジスタの同期処理として、たとえば、スレッドのコピーを行った後、親スレッドの汎用レジスタが書き込まれるごとに、更新後の汎用レジスタの値を親スレッドから子スレッドのＣＰＵに送信して、投機実行する技術が開示されている（たとえば、下記特許文献１、２を参照。）。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開平７−２００４８６号公報
【特許文献２】特開２００３−２９９８６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、上述した従来技術において、同期処理の完了確認を速く行うことが可能ではあるが、設計者によって設定された冗長な同期処理が存在する場合、無駄な待ち合わせ時間が発生してしまい、性能劣化が発生するという問題があった。
【００１１】
本発明は、上述した従来技術による問題点を解消するため、冗長な同期処理によって発生する性能劣化を回避できる同期方法、マルチコアプロセッサシステム、および同期システムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、第１ＣＰＵによって発行された同期命令に基づいて、同期する複数のＣＰＵと複数のＣＰＵ数とを特定のテーブルに登録し、複数のＣＰＵのそれぞれが第１ＣＰＵからの同期信号に基づいて、同期ポイントへの到達数をカウントするとともに複数のＣＰＵが実行する処理によってアクセスされる第１共有メモリ領域の複製である第２共有メモリ領域を作成し、同期ポイントへの到達数が複数のＣＰＵ数に到達したときに、第１共有メモリ領域と第２共有メモリ領域とを比較し、比較結果に基づいて複数のＣＰＵが実行した処理を判定する同期方法、マルチコアプロセッサシステム、および同期システムが提案される。
【発明の効果】
【００１３】
本発明の一側面によれば、冗長な同期処理によって発生する性能劣化を回避できるという効果を奏する。
【図面の簡単な説明】
【００１４】
【図１】図１は、マルチコアプロセッサシステム１００の動作例を示す説明図である。
【図２】図２は、実施の形態１にかかるマルチコアプロセッサシステム１００のハードウェア例を示すブロック図である。
【図３】図３は、マルチコアプロセッサシステム１００の機能例を示すブロック図である。
【図４】図４は、プロセステーブル３０１の記憶内容の一例を示す説明図である。
【図５】図５は、同期情報テーブル３０２の記憶内容の一例を示す説明図である。
【図６】図６は、マルチコアプロセッサシステム１００の同期処理の動作例を示す説明図である。
【図７】図７は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ１における状態を示す説明図である。
【図８】図８は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ２における状態を示す説明図である。
【図９】図９は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ３における状態を示す説明図である。
【図１０】図１０は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ５における状態を示す説明図である。
【図１１】図１１は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ６における状態を示す説明図である。
【図１２】図１２は、動画再生アプリへの適用例を示す説明図である。
【図１３】図１３は、同期処理時における同期マスタＣＰＵでの処理手順の一例を示すフローチャートである。
【図１４】図１４は、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示すフローチャート（その１）である。
【図１５】図１５は、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示すフローチャート（その２）である。
【発明を実施するための形態】
【００１５】
以下に添付図面を参照して、開示の同期方法、マルチコアプロセッサシステム、および同期システムの実施の形態を詳細に説明する。
【００１６】
図１は、マルチコアプロセッサシステム１００の動作例を示す説明図である。マルチコアプロセッサシステム１００は、ＣＰＵ＃０、ＣＰＵ＃１、ＣＰＵ＃２とメモリ１０１を含む。以下、接尾記号"＃ｎ"が付随された記号は、ｎ番目のＣＰＵに対応する記号であることを示している。ＣＰＵ＃０〜ＣＰＵ＃２とメモリ１０１はバス１０２で接続されている。ＣＰＵ＃０〜ＣＰＵ＃２は、マルチコアプロセッサシステム１００を制御する。メモリ１０１は、ＣＰＵ＃０〜ＣＰＵ＃２からアクセス可能な記憶領域である。また、メモリ１０１内には共有メモリ領域１０３が含まれる。共有メモリ領域１０３は、ＣＰＵ＃０〜ＣＰＵ＃２から共有してアクセスされる領域である。
【００１７】
また、ＣＰＵ＃０〜ＣＰＵ＃２は、並列処理を行うスレッド０〜スレッド２を実行している。図１では時刻ｔ１にて、スレッド０の実行コードによってＣＰＵ＃０が、共有メモリ領域１０３にアクセスするため、同期命令を実行する場合を想定する。なお、実行コード内での同期命令の位置を同期ポイントと定義する。また、同期命令を実行可能な位置に到達した場合を、同期ポイントに到達したと呼称する。
【００１８】
また、スレッド０のように、同期処理の開始を宣言し、他のスレッドの同期状態を監視するスレッドを同期マスタスレッドと呼称し、同期マスタスレッドを実行しているＣＰＵを同期マスタＣＰＵと呼称する。同様に、同期処理を行う他のスレッドを被同期対象スレッドと呼称し、被同期対象スレッドを実行しているＣＰＵを被同期対象ＣＰＵと呼称する。スレッド１、スレッド２は、被同期対象スレッドとなる。また、同期処理を行うＣＰＵを、同期対象ＣＰＵと呼称する。同期対象ＣＰＵは、同期マスタＣＰＵと、被同期対象ＣＰＵとなる。図１の例では、同期対象ＣＰＵは、ＣＰＵ＃０〜ＣＰＵ＃２となり、同期マスタＣＰＵがＣＰＵ＃０、被同期対象ＣＰＵがＣＰＵ＃１、ＣＰＵ＃２となる。
【００１９】
また、同期マスタＣＰＵは、同期命令を実行すると被同期対象ＣＰＵに対して同期信号を通知する。したがって、ＣＰＵ＃０は、時刻ｔ１にて同期信号をＣＰＵ＃１、ＣＰＵ＃２に通知する。
【００２０】
しかしながら、時刻ｔ１の時点にて、ＣＰＵ＃１、ＣＰＵ＃２は、クリティカルセクション中であり、同期信号を受信できない状態である。クリティカルセクションとは、他の処理が割り込むことを禁止している部分である。時刻ｔ２にて、ＣＰＵ＃２がクリティカルセクションを終了すると、ＣＰＵ＃２は同期信号を受信する。
【００２１】
同期信号を受信したＣＰＵ＃２は、共有メモリ領域１０３の複製である、複製先共有メモリ領域１０４を作成する。ＣＰＵ＃２は、複製先共有メモリ領域１０４にアクセスして、スレッド２の後続処理を投機実行する。また、ＣＰＵ＃２は、同期ポイントに到達したことを通知するため、ＣＰＵ＃０、ＣＰＵ＃１にレディ信号を通知する。
【００２２】
続けて時刻ｔ３にて、ＣＰＵ＃１がクリティカルセクションを終了すると、ＣＰＵ＃１は同期信号を受信する。同期信号を受信したＣＰＵ＃１は、レディ信号をＣＰＵ＃０、ＣＰＵ＃２に送信する。レディ信号を受信したＣＰＵ＃２は、全ての被同期ＣＰＵが同期ポイントに到達していることを判定すると、共有メモリ領域１０３のデータと複製先共有メモリ領域１０４のデータを比較する。比較結果が一致を示す場合、同期コードの挿入が冗長であったとして、ＣＰＵ＃２は、投機実行を継続する。なお、全ての被同期ＣＰＵが同期ポイントに到達していたかの判定方法は、図７〜図１１にて説明を行う。
【００２３】
このように、マルチコアプロセッサシステム１００は、Ｎ個のＣＰＵが同期処理する場合、同期ポイントへの到達数Ｍ＜Ｎならデータを複製して投機実行し、Ｍ＝Ｎなら複製元と複製先のデータが同一時に投機実行を継続する。これにより、マルチコアプロセッサシステム１００は、冗長な同期処理による性能劣化を回避できる。
【００２４】
（マルチコアプロセッサシステム１００のハードウェア）
図２は、実施の形態１にかかるマルチコアプロセッサシステム１００のハードウェア例を示すブロック図である。図２において、マルチコアプロセッサシステム１００は、ＣＰＵを複数搭載するＣＰＵｓ２０１と、ＲＯＭ（Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、を含む。
【００２５】
また、マルチコアプロセッサシステム１００は、フラッシュＲＯＭ２０４と、フラッシュＲＯＭコントローラ２０５と、フラッシュＲＯＭ２０６と、を含む。また、マルチコアプロセッサシステム１００は、ユーザやその他の機器との入出力装置として、ディスプレイ２０７と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０８と、キーボード２０９と、を含む。また、各部はバス１０２によってそれぞれ接続されている。なお、図１に示したメモリ１０１は、ＲＡＭ２０３であってもよいし、ＲＡＭ２０３の一部であってもよい。また、メモリ１０１は、ＲＡＭ２０３以外の記憶領域となるＲＯＭ２０２、フラッシュＲＯＭ２０４、フラッシュＲＯＭ２０６を含んでいてもよい。
【００２６】
ここで、ＣＰＵｓ２０１は、マルチコアプロセッサシステム１００の全体の制御を司る。ＣＰＵｓ２０１は、シングルコアのプロセッサを並列して接続した全てのＣＰＵを指している。ＣＰＵｓ２０１は、ＣＰＵ＃０〜ＣＰＵ＃ｎを含む。ｎは、２以上の整数である。ＣＰＵ＃０〜ＣＰＵ＃ｎは、それぞれ専用のキャッシュメモリを有してもよい。また、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、シングルコアのプロセッサであるＣＰＵが並列されている形態を例にあげて説明する。
【００２７】
ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０３は、ＣＰＵｓ２０１のワークエリアとして使用される。フラッシュＲＯＭ２０４は、読出し速度が高速なフラッシュＲＯＭであり、たとえば、ＮＯＲ型フラッシュメモリである。フラッシュＲＯＭ２０４は、ＯＳなどのシステムソフトウェアやアプリケーションソフトウェアなどを記憶している。たとえば、ＯＳを更新する場合、マルチコアプロセッサシステム１００は、Ｉ／Ｆ２０８によって新しいＯＳを受信し、フラッシュＲＯＭ２０４に格納されている古いＯＳを、受信した新しいＯＳに更新する。
【００２８】
フラッシュＲＯＭコントローラ２０５は、ＣＰＵｓ２０１の制御にしたがってフラッシュＲＯＭ２０６に対するデータのリード／ライトを制御する。フラッシュＲＯＭ２０６は、データの保存、運搬を主に目的としたフラッシュＲＯＭであり、たとえば、ＮＡＮＤ型フラッシュメモリである。フラッシュＲＯＭ２０６は、フラッシュＲＯＭコントローラ２０５の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム１００を使用するユーザがＩ／Ｆ２０８を通して取得した画像データ、映像データなどや、また本実施の形態にかかる同期方法を実行するプログラムなどを記憶してもよい。フラッシュＲＯＭ２０６は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００２９】
ディスプレイ２０７は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ２０７は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。
【００３０】
Ｉ／Ｆ２０８は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２１０に接続され、ネットワーク２１０を介して他の装置に接続される。そして、Ｉ／Ｆ２０８は、ネットワーク２１０と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０８には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００３１】
キーボード２０９は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２０９は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００３２】
（マルチコアプロセッサシステム１００の機能）
次に、マルチコアプロセッサシステム１００の機能について説明する。図３は、マルチコアプロセッサシステム１００の機能例を示すブロック図である。なお、マルチコアプロセッサシステム１００は、各機能からアクセスされるテーブルとして、プロセステーブル３０１、同期情報テーブル３０２にアクセス可能である。また、ＣＰＵ＃０〜ＣＰＵ＃２は、専有のメモリ領域として、それぞれ、専有メモリ領域３０３＃０〜専有メモリ領域３０３＃２にアクセス可能である。
【００３３】
マルチコアプロセッサシステム１００は、同期処理部３１０と同期信号受信部３１１、同期信号受信部３１２を含む。同期処理部３１０は、同期マスタＣＰＵに含まれる機能であり、同期信号受信部３１１、同期信号受信部３１２は、被同期対象ＣＰＵに含まれる機能である。なお、同期処理部３１０〜同期信号受信部３１２は、ＣＰＵ＃０〜ＣＰＵ＃２のカーネル空間にて動作する。また、同期処理部３１０は、登録部３２１、送信部３２２、受信部３２３、通知部３２４を含む。さらに、同期信号受信部３１１は、受信部３３１、カウント部３３２、比較部３３３、作成部３３４、設定部３３５、切替部３３６、送信部３３７、通知部３３８を含む。続けて、同期信号受信部３１２は、受信部３４１、比較部３４２、切替部３４３、比較部３４４、通知部３４５を含む。
【００３４】
この制御部となる機能（登録部３２１〜通知部３４５）は、記憶装置に記憶されたプログラムをＣＰＵ＃０〜ＣＰＵ＃ｎが実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、フラッシュＲＯＭ２０４、フラッシュＲＯＭ２０６などである。または、Ｉ／Ｆ２０８を経由して他のＣＰＵが実行することにより、その機能を実現してもよい。
【００３５】
また、図３に示すマルチコアプロセッサシステム１００は、ＣＰＵ＃０がユーザ空間にてスレッド０を実行し、ＣＰＵ＃１がユーザ空間にてスレッド１を実行し、ＣＰＵ＃２がユーザ空間にてスレッド２を実行する場合を想定している。さらに図３では、スレッド０が同期マスタスレッドとなった場合を想定し、ＣＰＵ＃０が同期マスタＣＰＵ、ＣＰＵ＃１とＣＰＵ＃２が被同期対象ＣＰＵとなった場合を想定している。たとえば、スレッド１が同期マスタスレッドとなった場合、ＣＰＵ＃１に同期処理部３１０の機能が含まれる。
【００３６】
また、同期信号受信部３１１＃１と同期信号受信部３１２＃１は被同期対象ＣＰＵとなるＣＰＵ＃１の機能であり、同期信号受信部３１１＃２と同期信号受信部３１２＃２は被同期対象ＣＰＵとなるＣＰＵ＃２の機能である。なお、図３では省略されているが、同期信号受信部３１１＃２は、受信部３３１〜通知部３３８と同等の機能を含み、同期信号受信部３１２＃２は、受信部３４１〜通知部３４５と同等の機能を含む。
【００３７】
プロセステーブル３０１は、スレッドとＣＰＵｓ２０１が関連付けられたテーブルである。なお、プロセステーブル３０１は、ＯＳ等によってスレッドが生成、終了するたびに更新される。プロセステーブル３０１の詳細は、図４にて後述する。同期情報テーブル３０２は、同期処理を行うＣＰＵ数と、ＣＰＵ番号が格納されている。同期情報テーブル３０２の詳細は、図５にて後述する。
【００３８】
専有メモリ領域３０３は、各ＣＰＵが専有してアクセスするメモリ領域である。たとえば、ＣＰＵ＃０は、スレッド０にてアクセスされるデータを専有メモリ領域３０３＃０に格納する。また、ＣＰＵ＃０は、スレッド０とスレッド１から共有してアクセスされるデータを共有メモリ領域１０３に格納する。
【００３９】
また、マルチコアプロセッサシステム１００は、到達数Ｍを記憶する記憶領域にアクセス可能である。到達数Ｍは、同期対象ＣＰＵのうち、同期ポイントに到達したＣＰＵ数と定義してもよいし、または、被同期対象ＣＰＵのうち、同期ポイントに到達したＣＰＵ数と定義してもよい。前者の定義であれば、マルチコアプロセッサシステム１００は到達数Ｍを、同期マスタＣＰＵを含めてカウントし、後者の定義であれば、マルチコアプロセッサシステム１００は到達数Ｍを、同期マスタＣＰＵを含めずにカウントする。本実施の形態では、到達数Ｍの定義を、後者の定義を用いて説明を行う。
【００４０】
同期処理部３１０は、同期処理の送信側である同期マスタＣＰＵに含まれる機能である。同期信号受信部３１１、同期信号受信部３１２は、同期処理の受信側である被同期対象ＣＰＵに含まれる機能である。同期信号受信部３１１は、被同期対象スレッドが同期ポイントに到達した際に動作する。同期信号受信部３１２は、被同期対象ＣＰＵからのレディ信号を受信した際に動作する。
【００４１】
登録部３２１は、第１ＣＰＵによって発行された同期命令に基づいて、同期する複数のＣＰＵと複数のＣＰＵ数とを同期情報テーブル３０２に登録する機能を有する。たとえば、登録部３２１は、同期対象ＣＰＵとなるＣＰＵ＃０、ＣＰＵ＃１、ＣＰＵ＃２と、ＣＰＵ数３を同期情報テーブル３０２に登録する。また、登録部３２１は、被同期対象ＣＰＵ数を同期情報テーブル３０２に登録してもよい。図３の場合、登録部３２１は、被同期対象ＣＰＵ数２を同期情報テーブル３０２に登録する。なお、本実施の形態では、到達数Ｍの定義を、同期マスタＣＰＵを含めずにカウントすることを想定しているため、被同期対象ＣＰＵ数を同期情報テーブル３０２に登録する例で説明を行う。
【００４２】
また、登録部３２１は、処理とＣＰＵとの関連を示すプロセステーブル３０１に基づいて同期情報テーブル３０２に登録してもよい。なお、登録されたという情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４３】
送信部３２２は、複数のＣＰＵのうち第１ＣＰＵを除く他のＣＰＵに同期信号と同期ポイントへの到達数を送信する。たとえば、送信部３２２は、ＣＰＵ＃１とＣＰＵ＃２に同期信号と到達数Ｍ＝０が格納されたＲＡＭ２０３上のポイントを送信する。なお、送信したという情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４４】
受信部３２３は、複数のＣＰＵのうち第１ＣＰＵを除く他のＣＰＵから同期信号の応答となる信号を受信する。たとえば、受信部３２３は、ＣＰＵ＃１とＣＰＵ＃２から、同期信号の応答となるレディ信号を受信する。また、レディ信号は、同期信号と同一の情報であってもよい。なお、受信結果は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４５】
通知部３２４は、複数のＣＰＵのうち第１ＣＰＵを除く他のＣＰＵの全てから同期信号の応答となる信号を受信した場合、第１ＣＰＵで実行するスレッドに同期処理の完了を通知する機能を有する。たとえば、通知部３２４は、ＣＰＵ＃１とＣＰＵ＃２とからレディ信号を受信した場合、同期処理の完了をスレッド０に通知する。なお、通知したという情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４６】
受信部３３１は、同期命令に基づく同期信号を受信する機能を有する。たとえば、受信部３３１は、送信部３２２によって送信された同期信号を受信する。なお、受信結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４７】
カウント部３３２は、同期信号に基づいて同期ポイントへの到達数をカウントする機能を有する。たとえば、カウント部３３２は、同期ポイントへの到達数Ｍをカウントする。なお、カウントを行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００４８】
比較部３３３は、カウント部３３２によって到達数がカウントされた場合、同期ポイントへの到達数と所定値を比較する機能を有する。ここで、所定値Ｎは、同期命令に基づいて同期されるＣＰＵ数であり、たとえば、ＣＰＵ＃０〜ＣＰＵ＃２から、Ｎ＝３としてもよい。また、所定値Ｎは、被同期対象ＣＰＵ数としてもよい。この場合、所定値Ｎは、Ｎ＝２となる。たとえば、比較部３３３は、到達数Ｍと所定値Ｎを比較する。なお、比較結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶される。
【００４９】
作成部３３４は、比較部３３３による比較結果が一致しない場合、同期ポイントへの到達数に基づいて第１共有メモリ領域を複製して第２共有メモリ領域を作成する機能を有する。なお、第１共有メモリ領域には、複数のＣＰＵのうち各ＣＰＵが実行するスレッド群から共有してアクセスされるデータが格納されている。たとえば、作成部３３４は、共有メモリ領域１０３を複製して複製先共有メモリ領域１０４＃１＿１を作成する。
【００５０】
さらに、作成部３３４は、第１共有メモリ領域の複製である第３共有メモリ領域を作成してもよい。たとえば、作成部３３４は、共有メモリ領域１０３を複製して、複製先共有メモリ領域１０４＃１＿２を作成する。なお、複製先共有メモリ領域１０４を作成したという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５１】
設定部３３５は、比較部３３３による比較結果が一致しない場合、同期ポイントに到達したＣＰＵが実行するスレッドのアクセス先を第１共有メモリ領域のデータから作成部３３４によって作成された第２共有メモリ領域のデータに設定する機能を有する。たとえば、設定部３３５は、スレッド１のアクセス先を共有メモリ領域１０３に格納されたデータから複製先共有メモリ領域１０４＃１＿１に格納されたデータに設定する。なお、設定されたという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５２】
切替部３３６は、比較部３３３による比較結果が一致しない場合、同期信号受信部３１１の実行と同期信号受信部３１２の実行とを切り替える機能を有する。具体的には、切替部３３６は、比較部３３３による比較結果が一致しない場合、同期信号に対する同期信号受信部３１１の呼び出しを被活性化し、レディ信号に対する同期信号受信部３１２の呼び出しを活性化する。なお、切替を行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５３】
送信部３３７は、同期信号に対応するレディ信号と同期ポイントへの到達数とを複数のＣＰＵに送信する機能を有する。たとえば、送信部３３７は、レディ信号と到達数Ｍを、ＣＰＵ＃０、ＣＰＵ＃２に送信する。なお、送信を行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５４】
通知部３３８は、比較部３３３による比較結果が一致しない場合、同期信号受信後の処理を投機実行させる指示を、処理を実行するスレッドに通知する機能を有する。または、通知部３３８は、比較部３３３による比較結果が一致する場合、同期信号受信後の処理を実行させる指示を、処理を実行するスレッドに通知する機能を有する。たとえば、通知部３３８は、比較部３３３による比較結果が一致しない場合、スレッド１に投機実行させる指示を通知する。また、通知部３３８は、比較部３３３による比較結果が一致する場合、スレッドを実行させる指示を通知する。なお、通知を行ったという結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５５】
受信部３４１は、送信部３３７によって送信されたレディ信号と同期ポイントへの到達数とを受信する機能を有する。たとえば、受信部３４１は、ＣＰＵ＃２から送信されたレディ信号と到達数Ｍを受信する。なお、受信結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５６】
比較部３４２は、受信部３４１によってレディ信号と同期ポイントへの到達数とが受信された場合、同期ポイントへの到達数と所定値とを比較する機能を有する。たとえば、比較部３４２は、到達数Ｍと所定値Ｎを比較する。なお、比較結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶される。
【００５７】
切替部３４３は、比較部３４２による比較結果が一致を示す場合、同期信号受信部３１１の実行と同期信号受信部３１２の実行とを切り替える機能を有する。具体的には、切替部３４３は、比較部３４２による比較結果が一致する場合、同期信号に対する同期信号受信部３１１の呼び出しを活性化し、レディ信号に対する同期信号受信部３１２の呼び出しを非活性化する。なお、切替を行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶されてもよい。
【００５８】
比較部３４４は、比較部３４２による比較結果が一致を示す場合、第１共有メモリ領域のデータと第２共有メモリ領域のデータとを比較する機能を有する。たとえば、比較部３４４は、共有メモリ領域１０３に格納されているデータと複製先共有メモリ領域１０４＃１＿１に格納されているデータとを比較する。また、比較部３４４は、第２共有メモリ領域のデータと第３共有メモリ領域のデータとを比較してもよい。たとえば、比較部３４４は、複製先共有メモリ領域１０４＃１＿１に格納されているデータと複製先共有メモリ領域１０４＃１＿２に格納されているデータを比較する。なお、比較結果は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶される。
【００５９】
通知部３４５は、比較部３４４の比較結果に基づいて、同期信号受信後の処理を継続または中断する指示を通知する機能を有する。具体的には、一致を示す比較結果を有する場合、通知部３４５は比較後に処理を継続する指示をスレッド１に通知する。また、不一致を示す比較結果を有する場合、通知部３４５は同期信号受信後に実行した処理を中断する指示をスレッド１に通知する。なお、通知を行ったという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ２０３などに記憶される。
【００６０】
このように、マルチコアプロセッサシステム１００は、複数のコアのうち特定のコアによって発行された同期信号を複数のコアのうち特定のコア以外の他のコアによって受信する。続けて、マルチコアプロセッサシステム１００は、同期ポイントへ到達し同期信号の受信が完了した場合、同期信号に対応するレディ信号と同期ポイントへ到達したコア数とを複数のコアに送信する。送信されたレディ信号と同期ポイントへ到達したコア数が他のコアによって受信された場合、マルチコアプロセッサシステム１００は、他のコアの数と同期ポイントへ到達したコア数とを同期ポイントへ到達したコアの各々によって比較する。
【００６１】
コア数の比較となる第１の比較結果が一致しない場合、マルチコアプロセッサシステム１００は、複数のコアのうち各コアが実行するスレッド群から共有してアクセスされる複製元のデータを同期ポイントへ到達したコアごとに複製する。また、第１の比較結果が一致しない場合、マルチコアプロセッサシステム１００は、同期ポイントへ到達したコアが実行するスレッドのアクセス先をデータから複製された複製先のデータに設定する。また、第１の比較結果が一致する場合、マルチコアプロセッサシステム１００は、複製元のデータと複製先のデータとを同期ポイントへ到達したコアによって比較する。
【００６２】
第１の比較結果が一致しない場合、マルチコアプロセッサシステム１００は、スレッドを投機実行させる指示を同期ポイントへ到達したコアからスレッドに通知する。また、データの比較となる第２の比較結果が一致する場合、マルチコアプロセッサシステム１００は、スレッドの投機実行を継続させる指示を同期ポイントへ到達したコアからスレッドに通知する。また、第２の比較結果が一致しない場合、マルチコアプロセッサシステム１００は、スレッドを再実行させる指示を同期ポイントへ到達したコアからスレッドに通知する。
【００６３】
図４は、プロセステーブル３０１の記憶内容の一例を示す説明図である。プロセステーブル３０１は、ＰＩＤ、ＰＰＩＤ、ＰＧＩＤ、ＣＰＵ番号という４つのフィールドを含む。ＰＩＤフィールドには、ＰＩＤ（Ｐｒｏｃｅｓｓ  ＩＤ）という、プロセスまたはスレッドを一意に特定可能な識別子が格納される。以下、説明の記載をスレッドに統一して行う。また、以下のプロセステーブル３０１の説明では、ＰＩＤフィールドに格納されたスレッドを対象スレッドとする。
【００６４】
ＰＰＩＤフィールドには、ＰＰＩＤ（Ｐａｒｅｎｔ  ＰＩＤ）という、対象スレッドの親スレッドのＰＩＤが格納される。ＰＧＩＤフィールドには、ＰＧＩＤ（Ｐｒｏｃｅｓｓ  Ｇｒｏｕｐ  ＩＤ）という、対象スレッドが含まれるスレッドグループ番号が格納される。また、本実施の形態では、ＰＩＤとＰＧＩＤが同一であるとき、スレッドグループ内の親スレッドであると想定する。ＣＰＵ番号フィールドには、対象スレッドが割り当てられたＣＰＵ番号が格納される。
【００６５】
たとえば、ＰＩＤ＝１００１のスレッドは、ＰＧＩＤ＝１００１のグループに属しており、ＣＰＵ＃１に割り当てられている。以下、ＰＩＤ＝ｘのスレッドをスレッドｘとして呼称する。スレッド１００１は、ＰＩＤ＝ＰＧＩＤ＝１００１となるため、ＰＧＩＤ＝１００１のスレッドグループでの親スレッドとなる。なお、スレッド１００１は、ＰＰＩＤ＝１に設定されている。スレッド１は、たとえば、マルチコアプロセッサシステム１００で動作中のＯＳがＵＮＩＸ（登録商標）であれば、ｉｎｉｔプロセスとなる。
【００６６】
スレッド１００２は、ＰＧＩＤ＝１００１のスレッドグループに属しており、ＣＰＵ＃４に割り当てられている。また、スレッド１００２は、ＰＰＩＤ＝１００１であるため、スレッド１００１の子スレッドである。同様に、スレッド１００３、スレッド１００４、スレッド１００５は、ＰＧＩＤ＝１００１のスレッドグループに属しており、スレッド１００１の子スレッドである。また、スレッド１００３は、ＣＰＵ＃５に割り当てられ、スレッド１００４は、ＣＰＵ＃６に割り当てられ、スレッド１００５は、ＣＰＵ＃８に割り当てられている。
【００６７】
また、スレッド１００６は、ＰＩＤ＝ＰＧＩＤ＝１００６となるため、ＰＧＩＤ＝１００６のスレッドグループでの親スレッドとなる。さらに、スレッド１００６は、ＣＰＵ＃０に割り当てられる。スレッド１００７は、ＰＧＩＤ＝１００６のスレッドグループに属しており、ＣＰＵ＃２に割り当てられている。また、スレッド１００７は、ＰＰＩＤ＝１００６であるため、スレッド１００６の子スレッドである。
【００６８】
図５は、同期情報テーブル３０２の記憶内容の一例を示す説明図である。テーブルは、被同期対象ＣＰＵ数、同期対象ＣＰＵという２つのフィールドを含む。被同期対象ＣＰＵ数フィールドには、被同期対象ＣＰＵの総数が格納される。同期対象ＣＰＵフィールドには、同期対象ＣＰＵのＣＰＵ番号が格納される。たとえば、図５では、被同期対象数が４となり、同期対象ＣＰＵとして、ＣＰＵ＃１、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８であるというレコードが格納されている。
【００６９】
図６は、マルチコアプロセッサシステム１００の同期処理の動作例を示す説明図である。図６では、同期マスタＣＰＵとなるＣＰＵ＃１が同期開始を行い、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８が、被同期対象ＣＰＵとして、同期処理を実行する場合の動作例を示す。また、ＣＰＵ＃１は図４で示したスレッド１００１を実行し、ＣＰＵ＃４はスレッド１００２を実行し、ＣＰＵ＃５はスレッド１００３を実行し、ＣＰＵ＃６はスレッド１００４を実行し、ＣＰＵ＃８はスレッド１００５を実行する。
【００７０】
時刻ｔ１にて、ＣＰＵ＃１が同期ポイントに到達すると、ＣＰＵ＃１は、プロセステーブル３０１から、同期情報テーブル３０２のレコードを生成する。具体的には、ＣＰＵ＃１は、ＣＰＵ＃１が実行するスレッド１００１と同一のスレッドグループに含まれる、スレッド１００１〜スレッド１００５を抽出する。抽出後、ＣＰＵ＃１は、同期情報テーブル３０２の新規レコードの被同期対象ＣＰＵ数フィールドに、スレッド１００２〜スレッド１００５を実行するＣＰＵ数であるＮ＝４を登録する。また、ＣＰＵ＃１は、新規レコードの同期対象ＣＰＵフィールドにスレッド１００１〜スレッド１００５を実行するＣＰＵ番号である＃１、＃４、＃５、＃６、＃８を登録する。
【００７１】
登録後、ＣＰＵ＃１は、同期情報テーブル３０２を参照して、同期対象ＣＰＵに同期信号を通知する。しかしながら、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８は、クリティカルセクション中であり、同期信号を受信できない状態である。なお、同期信号を通知後、ＣＰＵ＃１は、被同期対象ＣＰＵからのレディ信号を監視する。また、ＣＰＵ＃１は、スレッド１００１と無関係な他のスレッドを実行していてもよい。
【００７２】
続けて、時刻ｔ２にて、ＣＰＵ＃５がクリティカルセクションを終了し同期ポイントに到達すると、ＣＰＵ＃５は、レディ信号をブロードキャスト送信し、スレッド１００３の後続処理を投機実行する。同様に、時刻ｔ３にて、ＣＰＵ＃８がクリティカルセクションを終了し同期ポイントに到達すると、ＣＰＵ＃８は、レディ信号をブロードキャスト送信し、スレッド１００５の後続処理を投機実行する。また、時刻ｔ４にて、ＣＰＵ＃４がクリティカルセクションを終了し同期ポイントに到達すると、ＣＰＵ＃４は、レディ信号をブロードキャスト送信し、スレッド１００２の後続処理を投機実行する。
【００７３】
最後に、時刻ｔ５にて、ＣＰＵ＃６がクリティカルセクションを終了し同期ポイントに到達すると、ＣＰＵ＃６は、レディ信号をブロードキャスト送信する。全てのＣＰＵが同期ポイントに到達したことを検出したＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃８は、時刻ｔ６にて投機実行を継続するか中断するかを判断する。以下、マルチコアプロセッサシステム１００の時刻ｔ１、時刻ｔ２、時刻ｔ３、時刻ｔ５、時刻ｔ６における状態を、それぞれ図７〜図１１にて示す。なお、時刻ｔ４におけるマルチコアプロセッサシステム１００の状態は、時刻ｔ３と大きく変わらないため、図示を省略する。
【００７４】
図７は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ１における状態を示す説明図である。同期ポイントに到達したＣＰＵ＃１は、処理（１）として、同期信号を同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８に通知する。また、同期信号の通知に合わせて、ＣＰＵ＃１は、被同期対象ＣＰＵのうち、同期ポイントへ到達したＣＰＵ数を示す到達数ＭをＭ＝０として通知し、さらに、同期情報テーブル３０２を通知する。なお、具体的には、到達数Ｍと同期情報テーブル３０２は、ＣＰＵｓ２０１が共有してアクセス可能なメモリ１０１に格納されているため、それぞれが格納されているアドレスを通知してもよい。
【００７５】
図８は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ２における状態を示す説明図である。時刻ｔ２にて同期ポイントに到達したＣＰＵ＃５は、処理（２）として、到達数Ｍの値を、Ｍ＝Ｎ−（Ｎ−１）＝１としてインクリメントする。さらに、ＣＰＵ＃５は、Ｍ＝１とレディ信号を、同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃１、ＣＰＵ＃４、ＣＰＵ＃６、ＣＰＵ＃８に通知する。また、ＣＰＵ＃５は、Ｍ＜Ｎであることから、まだ同期ポイントに未到達である被同期対象ＣＰＵが存在することを判定し、スレッド１００３の後続処理を投機実行する。なお、投機実行の動作については、図９にて説明を行う。
【００７６】
また、到達数Ｍへのインクリメントに関して、仮に同じタイミングで発行されてもポインタ変数の先の実体数字を変更できるＣＰＵは、同時期には１つのＣＰＵである。到達数Ｍへのインクリメントは、実装ロジックがインクリメント命令であるため、全く同じタイミングでアクセスが行われたとしても、確実に１つずつインクリメントが行われることになる。
【００７７】
図９は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ３における状態を示す説明図である。時刻ｔ３にて同期ポイントに到達したＣＰＵ＃８は、処理（３）として、到達数Ｍの値を、Ｍ＝Ｍ＋１＝２としてインクリメントする。さらに、ＣＰＵ＃８は、Ｍ＝２とレディ信号を、同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃１、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃６に通知する。また、ＣＰＵ＃８は、Ｍ＜Ｎであることから、まだ同期ポイントに未到達である被同期対象ＣＰＵが存在することを判定し、スレッド１００５の後続処理を投機実行する。
【００７８】
なお、時刻ｔ２にて同期ポイントに到達したＣＰＵ＃５は、スレッド１００３の後続処理を投機実行する。具体的に、ＣＰＵ＃５は、共有メモリ領域１０３を複製した複製先共有メモリ領域１０４＃５＿１、複製先共有メモリ領域１０４＃５＿２を作成する。作成後、ＣＰＵ＃５は、複製先共有メモリ領域１０４＃５＿１をアクセス先としてスレッド１００３の後続処理を投機実行する。なお、複製先共有メモリ領域１０４＃５＿２はスレッド１００３からアクセスされない。したがって、複製先共有メモリ領域１０４＃５＿２に格納されているデータは、同期処理完了時までデータが変更されずに保存される。
【００７９】
なお、図示していないが、時刻ｔ４において同期ポイントに到達したＣＰＵ＃４は、処理（４）として、到達数Ｍの値を、Ｍ＝Ｍ＋１＝３としてインクリメントする。さらに、ＣＰＵ＃４は、Ｍ＝３とレディ信号を、同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃１、ＣＰＵ＃５、ＣＰＵ＃６、ＣＰＵ＃８に通知する。また、ＣＰＵ＃４は、Ｍ＜Ｎであることから、まだ同期ポイントに未到達である被同期対象ＣＰＵが存在することを判定し、スレッド１００２の後続処理を投機実行する。
【００８０】
図１０は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ５における状態を示す説明図である。時刻ｔ５にて同期ポイントに到達したＣＰＵ＃６は、処理（５）として、到達数Ｍの値を、Ｍ＝Ｍ＋１＝４としてインクリメントする。さらに、ＣＰＵ＃６は、Ｍ＝４とレディ信号を、同期対象ＣＰＵのうち、自ＣＰＵを除いたＣＰＵ＃１、ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃８に通知する。なお、ＣＰＵ＃６は、Ｍ＝Ｎ＝４であることから、被同期対象ＣＰＵが全て同期ポイントに到達したことを判定し、スレッド１００４の後続処理を実行する。
【００８１】
また、時刻ｔ５の時点にて、時刻ｔ２にて同期ポイントに到達したＣＰＵ＃５はスレッド１００３の後続処理を投機実行している。同様に、時刻ｔ３にて同期ポイントに到達したＣＰＵ＃８はスレッド１００５の後続処理を投機実行し、時刻ｔ４にて同期ポイントに到達したＣＰＵ＃４はスレッド１００２の後続処理を投機実行している。ＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃８は、レディ信号を受信すると、投機実行の成否を複製先共有メモリ領域１０４のデータを比較することで判定する。具体的な判定方法は、図１１にて説明する。
【００８２】
図１１は、図６におけるマルチコアプロセッサシステム１００の時刻ｔ６における状態を示す説明図である。時刻ｔ６にて、レディ信号を受信したＣＰＵ＃４、ＣＰＵ＃５、ＣＰＵ＃８は、２つの複製先共有メモリ領域１０４のデータが一致するかを判定する。たとえば、ＣＰＵ＃４は、複製先共有メモリ領域１０４＃４＿１と複製先共有メモリ領域１０４＃４＿２のデータを比較する。
【００８３】
図１１では、複製先共有メモリ領域１０４＃４＿１と複製先共有メモリ領域１０４＃４＿２が一致しない状態を想定している。比較してデータが一致しない場合、スレッド１００２の投機実行は、共有メモリ領域１０３を変更することを示している。したがって、投機実行が本来不可能であることを意味するため、ＣＰＵ＃４は、投機実行を中断し、後続処理を再実行する。同様に、ＣＰＵ＃８も、複製先共有メモリ領域１０４＃８＿１と複製先共有メモリ領域１０４＃８＿２が一致しなかったため、スレッド１００５の投機実行を中断して投機実行の結果を破棄し、後続処理を再実行する。
【００８４】
また、ＣＰＵ＃５は、複製先共有メモリ領域１０４＃５＿１と複製先共有メモリ領域１０４＃５＿２のデータを比較する。図１１では、複製先共有メモリ領域１０４＃５＿１と複製先共有メモリ領域１０４＃５＿２が一致する状態を想定している。比較してデータが一致する場合、スレッド１００３の投機実行は、ＣＰＵ＃５の専有メモリ領域のリードライト処理で完結しており、共有メモリ領域１０３を変更せず、冗長な同期処理であったことを示している。したがって、ＣＰＵ＃５は、投機実行を継続する。
【００８５】
なお、共有メモリ領域１０３のデータは、同期マスタＣＰＵによる同期処理以外の他の処理や、または同期対象ＣＰＵ以外の他のＣＰＵによって変更される可能性がある。変更される場合としては、同期対象ＣＰＵでの他の処理が意図的、または不具合によってデータを変更する場合、または、本来同期対象ＣＰＵに含まれるはずの他のＣＰＵがデータを変更してしまう場合等がある。このような動作は、従来例にかかるマルチコアプロセッサシステム１００であっても起こりうる。
【００８６】
たとえば、本実施の形態にかかるマルチコアプロセッサシステム１００において、複製先共有メモリ領域１０４＃ｘ＿１と共有メモリ領域１０３で投機実行の成否を判定する場合を想定する。なお、ｘは投機実行したＣＰＵ番号であると想定する。このとき、全く同じようにデータが変更されると、投機実行が失敗しているにも関わらず、成功として判断されてしまう。このように、複製先共有メモリ領域１０４＃ｘ＿１と共有メモリ領域１０３を比較すると、不具合が隠されてしまう可能性が存在する。したがって、マルチコアプロセッサシステム１００は、投機実行の成否の判定を、共有メモリ領域１０３のデータを用いずに、複製先共有メモリ領域１０４で行う。
【００８７】
また、マルチコアプロセッサシステム１００は、ＣＰＵ＃ｘが投機実行を継続する場合に、投機実行のデータアクセス先を、複製先共有メモリ領域１０４＃ｘ＿１から共有メモリ領域１０３に切り替える。このとき、複製先共有メモリ領域１０４＃ｘ＿１と共有メモリ領域１０３とでデータが一致しない場合、マルチコアプロセッサシステム１００は、ＯＳの機能によってメモリエラー等を発行してもよい。
【００８８】
なお、同期マスタＣＰＵによって共有メモリ領域１０３のデータが書き換えられないことを想定してもよい場合、マルチコアプロセッサシステム１００は、複製先共有メモリ領域１０４＃ｘ＿１のみを作成してもよい。この場合、ＣＰＵ＃ｘは、共有メモリ領域１０３と複製先共有メモリ領域１０４＃ｘ＿１を比較して、投機実行が成功したか否かの有無を判定する。これにより、作成される複製先共有メモリ領域１０４を一つにでき、処理を高速化することができる。
【００８９】
図１２は、動画再生アプリへの適用例を示す説明図である。図１２では、動画再生アプリの処理群のブロック図を示しており、処理群のうち、排他制御処理、バリア同期処理を行う箇所、クリティカルセクションとなる処理を示している。
【００９０】
初めに、動画再生アプリは、ストリームデータ読出スレッド１２０１、デマルチプレクススレッド１２０２、ビデオスレッド１２０３、オーディオスレッド１２０４、ＡＶ出力スレッド１２０５を含む。
【００９１】
ストリームデータ読出スレッド１２０１は、ストリームを読み出す機能を有する。具体的に、ストリームデータ読出スレッド１２０１は、ＯＳの機能であるファイルシステム１２１１を利用して、ストレージコンテンツストリーム１２６１から、動画データを読み込み、ストリームバッファ１２６２に格納する。また、ストリームデータ読出スレッド１２０１は、ストリーム枯渇監視部１２１２によって、ストリームバッファ１２６２が枯渇してきたことを検出する。検出された場合、ストリームデータ読出スレッド１２０１は、ファイル読出部１２１３によって、ファイルシステム１２１１から、新たな動画データをストリームバッファ１２６２に書き込む。
【００９２】
デマルチプレクススレッド１２０２は、読み出したストリームをビデオとオーディオデータに分割する機能を有する。具体的に、デマルチプレクススレッド１２０２は、ストリームバッファ１２６２から動画データを読み込み、デマルチプレクス部１２２１により、ＶＥＳ（Ｖｉｄｅｏ  Ｅｌｅｍｅｎｔａｒｙ  Ｓｔｒｅａｍ）データと、ＡＥＳ（Ａｕｄｉｏ  Ｅｌｅｍｅｎｔａｒｙ  Ｓｔｒｅａｍ）データに分離する。分離後、デマルチプレクススレッド１２０２は、ＶＥＳデータをＶＥＳデータ出力部１２２２によりＶＥＳバッファ１２６３に格納し、ＡＥＳデータをＡＥＳデータ出力部１２２３によりＡＥＳバッファ１２６４に格納する。
【００９３】
また、デマルチプレクススレッド１２０２は、ＶＥＳデータ枯渇監視部１２２４によって、ＶＥＳバッファ１２６３が枯渇してきた場合、デマルチプレクス部１２２１に分離要求を通知する。同様に、デマルチプレクススレッド１２０２は、ＡＥＳデータ枯渇監視部１２２５によって、ＡＥＳバッファ１２６４が枯渇してきた場合、デマルチプレクス部１２２１に分離要求を通知する。
【００９４】
ビデオスレッド１２０３は、ビデオ処理を行う機能を有する。具体的に、ビデオスレッド１２０３は、ＶＥＳ読出部１２３１によってＶＥＳデータを読み出し、ビデオデコード部１２３２によってＶＥＳデータをデコードし、ＶＦ（Ｖｉｄｅｏ  Ｆｒａｍｅ）データを生成する。生成後、ビデオスレッド１２０３は、ＶＦデータ出力部１２３３によってＶＦバッファ１２６５に格納する。また、ビデオスレッド１２０３は、ＶＦデータ枯渇監視部１２３４によって、ＶＦバッファ１２６５が枯渇してきた場合、ＶＥＳ読出部１２３１に読出要求を通知する。
【００９５】
オーディオスレッド１２０４は、オーディオ処理を行う機能を有する。具体的に、オーディオスレッド１２０４は、ＡＥＳ読出部１２４１によってＡＥＳデータを読み出し、オーディオデコード部１２４２によってＡＥＳデータをデコードし、ＡＦ（Ａｕｄｉｏ  Ｆｒａｍｅ）データを生成する。生成後、オーディオスレッド１２０４は、ＡＦデータ出力部１２４３によってＡＦバッファ１２６６に格納する。また、オーディオスレッド１２０４は、ＡＦデータ枯渇監視部１２４４によって、ＡＦバッファ１２６６が枯渇してきた場合、ＡＥＳ読出部１２４１に読出要求を通知する。
【００９６】
ＡＶ出力スレッド１２０５は、デコードされたビデオとオーディオデータを同期し表示する機能を有する。具体的には、ＡＶ出力スレッド１２０５は、ＡＶ出力同期部１２５１によって、ビデオドライバ１２５２、オーディオドライバ１２５３を同期させて動画データを出力する。ビデオドライバ１２５２は、ＶＦバッファ１２６５からＶＦデータを読み出し、ディスプレイ２０７に出力する。オーディオドライバ１２５３は、ＡＦバッファ１２６６からＡＦデータを読み出し、Ｉ／Ｆ２０８に接続されたスピーカ等に出力する。
【００９７】
このように、ストリームデータ読出スレッド１２０１〜ＡＶ出力スレッド１２０５は、独立な処理を行うため、非常に並列処理に適した構造のようにみえる。しかしながら、デマルチプレクススレッド１２０２〜ＡＶ出力スレッド１２０５は、ＶＥＳバッファ１２６３〜ＡＦバッファ１２６６で連動して動作するため、排他制御処理、バリア同期処理を挿入して設計されやすくなる。
【００９８】
具体的にどのような排他制御処理が挿入されるかというと、たとえば、ＶＥＳデータ出力部１２２２とＶＥＳ読出部１２３１は、ＶＥＳバッファ１２６３に共通してアクセスする。したがって、同時にアクセスするのを避けるため、ＶＥＳデータ出力部１２２２とＶＥＳ読出部１２３１に排他制御処理が挿入される。同様のケースが、ＡＥＳデータ出力部１２２３とＡＥＳ読出部１２４１、ＶＦデータ出力部１２３３とビデオドライバ１２５２、ＡＦデータ出力部１２４３とオーディオドライバ１２５３でも発生する。
【００９９】
また、ＶＥＳバッファ１２６３の上書きを回避するため、ＶＥＳデータ出力部１２２２の処理が、開発者によってクリティカルセクションに設定される場合もありうる。同様のケースが、ＡＥＳデータ出力部１２２３、ＶＦデータ出力部１２３３、ＡＦデータ出力部１２４３でも発生する。
【０１００】
また、ＶＥＳデータ枯渇監視部１２２４は、枯渇を監視する方法として、たとえば、ＶＥＳバッファ１２６３の書き込み位置と読み込み位置を参照する。監視中に書き込み位置と読み込み位置が変更されるのを回避するため、ＶＥＳデータ枯渇監視部１２２４の処理が、開発者によってクリティカルセクションに設定される場合もありうる。同様のケースが、ＡＥＳデータ枯渇監視部１２２５、ＶＦデータ枯渇監視部１２３４、ＡＦデータ枯渇監視部１２４４でも発生する。
【０１０１】
また、デマルチプレクス部１２２１の分離完了前にＶＥＳデータ出力部１２２２が実行開始するのを回避するため、バリア同期処理が挿入される場合もありうる。さらに、ＶＥＳデータ出力部１２２２が実行中に、ＶＥＳデータ枯渇監視部１２２４が実行開始するのを回避するため、バリア同期処理が挿入される場合もありうる。同様のケースが、デマルチプレクス部１２２１、ＡＥＳデータ出力部１２２３、ＡＥＳデータ枯渇監視部１２２５でも発生する。また、ＡＶ出力同期部１２５１は、ビデオドライバ１２５２とオーディオドライバ１２５３をたとえば１フレーム単位で同期をとって処理するため、バリア同期処理が挿入される場合がありうる。
【０１０２】
このような様々な排他制御処理、バリア同期処理が設定されうる動画再生アプリがシングルコアプロセッサシステム向けに設計される場合には、単純な排他フラグを用い、１つのバッファを切り替えながら読み書きすればよい。また、シングルコアプロセッサシステムでは、排他状態でビデオスレッド１２０３が動作できなくても、オーディオスレッド１２０４が動作することで、ＣＰＵリソースを漏れなく利用することになる。
【０１０３】
しかし、シングルコアプロセッサシステム向けの動画再生アプリをマルチコアプロセッサシステム１００が動作した場合、全ての排他制御処理のコードをそのまま実行するため、互いのＣＰＵがロックをかけあってしまい、処理が進行しなくなる。
【０１０４】
処理が進行しないことを回避するためには、開発者は、プログラム自体を並列処理に適した形式に変更することになる。具体的に、開発者は、スレッドに含まれる各機能部や動作条件を変更することで、プログラム自体を並列処理に適した形式に変更する。しかし、本実施の形態にかかるマルチコアプロセッサシステム１００は、プログラムを変更することなく、マルチコアの並列性を最大限に有効活用することができる。
【０１０５】
以下、図４、図５で示したプロセステーブル３０１、同期情報テーブル３０２を使用して、マルチコアプロセッサシステム１００は、同期処理を実行する。同期処理の処理手順の一例を図１３〜図１５にて示す。図１３では、同期処理時における同期マスタＣＰＵでの処理手順の一例を示し、図１４、図１５にて、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示す。さらに、図１４では、被同期対象ＣＰＵにて、同期信号受信部３１１が動作している状態でのフローチャートを示し、図１５では、被同期対象ＣＰＵにて、同期信号受信部３１２が動作している状態でのフローチャートを示す。また、図１３〜図１５のフローチャートの例にて、説明を簡略化するため、同期マスタＣＰＵがＣＰＵ＃１であると想定し、被同期対象ＣＰＵをＣＰＵ＃４であると想定する。
【０１０６】
図１３は、同期処理時における同期マスタＣＰＵでの処理手順の一例を示すフローチャートである。初めに、ＣＰＵ＃１は、ユーザ空間にて同期マスタスレッドを実行し、カーネル空間にて同期処理部３１０を実行している。
【０１０７】
ＣＰＵ＃１は、通常処理を実行し（ステップＳ１３０１）、通常処理内にある、同期コードとなるシステムコールを発行する（ステップＳ１３０２）。システムコールが発行されると、ＣＰＵ＃１は、ユーザモードからカーネルモードに遷移し、カーネル空間で実行されている同期処理部３１０を実行する。
【０１０８】
ＣＰＵ＃１は、同期コードを検出したか否かを判断する（ステップＳ１３０５）。なお、同期コードとは、排他制御コードやバリア同期コードである。検出していない場合（ステップＳ１３０５：Ｎｏ）、ＣＰＵ＃１は、一定時間経過後に再びステップＳ１３０５の処理を実行する。なお、ＣＰＵ＃１は、一定時間経過の間、たとえば、ユーザモードに遷移し、同期マスタスレッドを実行したり、他のユーザスレッドを実行したりする。
【０１０９】
検出した場合（ステップＳ１３０５：Ｙｅｓ）、ＣＰＵ＃１は、プロセステーブル３０１から被同期対象ＣＰＵ数を取得する（ステップＳ１３０６）。取得後、ＣＰＵ＃１は、プロセステーブル３０１から、同期対象ＣＰＵを抽出する（ステップＳ１３０７）。抽出後、ＣＰＵ＃１は、同期情報テーブル３０２に、取得した被同期対象ＣＰＵ数と、抽出した同期対象ＣＰＵを登録する（ステップＳ１３０８）。登録後、ＣＰＵ＃１は、同期信号と到達数Ｍ＝０を被同期対象ＣＰＵにブロードキャスト送信する（ステップＳ１３０９）。
【０１１０】
送信後、ＣＰＵ＃１は、全ての被同期対象ＣＰＵからレディ信号を受信したか否かを判断する（ステップＳ１３１０）。なお、レディ信号を送信する処理は、被同期対象ＣＰＵの処理内のステップＳ１４０８とステップＳ１４１１である。受信していない場合（ステップＳ１３１０：Ｎｏ）、ＣＰＵ＃１は、一定時間経過後に再びステップＳ１３１０の処理を実行する。受信した場合（ステップＳ１３１０：Ｙｅｓ）、ＣＰＵ＃１は、同期処理の完了を同期マスタスレッドに通知し（ステップＳ１３１１）、同期処理部３１０の処理を終了する。
【０１１１】
また、ユーザモードに遷移したＣＰＵ＃１は、同期処理の完了を受け付けたか否かを判断する（ステップＳ１３０３）。受け付けていない場合（ステップＳ１３０３：Ｎｏ）、ＣＰＵ＃１は、一定時間経過後に再びステップＳ１３１０の処理を実行する。受け付けた場合（ステップＳ１３０３：Ｙｅｓ）、ＣＰＵ＃１は、後続処理を実行し（ステップＳ１３０４）、同期マスタスレッドの処理を終了する。
【０１１２】
図１４は、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示すフローチャート（その１）である。初めに、ＣＰＵ＃４は、ユーザ空間にて被同期対象スレッドを実行し、同期信号を受信した場合、カーネル空間にて同期信号受信部３１１を実行する。
【０１１３】
ＣＰＵ＃４は、通常処理を実行し（ステップＳ１４０１）、クリティカルセクション処理を実行する（ステップＳ１４０２）。クリティカルセクション処理の終了後、ＣＰＵ＃４は、同期信号を受信したため、ユーザモードからカーネルモードに遷移する。なお、クリティカルセクション処理が存在しない場合、ＣＰＵ＃４は、同期信号を受信してすぐに同期信号受信部３１１の処理を実行する。なお、同期信号を送信する処理は、同期マスタＣＰＵの処理内のステップＳ１３０９である。
【０１１４】
ＣＰＵ＃４は、到達数Ｍをインクリメントし（ステップＳ１４０４）、Ｍ＝Ｎとなるか否かを判断する（ステップＳ１４０５）。Ｍ＝Ｎでない場合（ステップＳ１４０５：Ｎｏ）、ＣＰＵ＃４は、複製先共有メモリ領域１０４を２つ作成する（ステップＳ１４０６）。作成後、ＣＰＵ＃４は、同期信号受信部３１１を停止し、同期信号受信部３１２を起動する（ステップＳ１４０７）。
【０１１５】
具体的な同期信号受信部３１１の停止、同期信号受信部３１２の起動方法としては、たとえば実行される関数を切り替える方法がある。たとえば、ＣＰＵ＃４は、同期信号かレディ信号を受信した場合に実行する関数ポインタを、同期信号受信部３１１を実行するコードを示すアドレスから、同期信号受信部３１２を実行するコードを示すアドレスに切り替える。これにより、ＣＰＵ＃４が次に同期信号、またはレディ信号を受信した場合、ＣＰＵ＃４は、同期信号受信部３１２を実行する。
【０１１６】
続けて、ＣＰＵ＃４は、レディ信号と到達数Ｍを、自ＣＰＵを除く同期対象ＣＰＵにブロードキャスト送信する（ステップＳ１４０８）。送信後、ＣＰＵ＃４は、後続処理のアクセス先を複製先共有メモリ領域１０４のいずれか一方に設定し（ステップＳ１４０９）、後続処理の投機実行を被同期対象スレッドに指示し（ステップＳ１４１０）、同期信号受信部３１１を終了する。
【０１１７】
Ｍ＝Ｎである場合（ステップＳ１４０５：Ｙｅｓ）、ＣＰＵ＃４は、レディ信号と到達数Ｍを、自ＣＰＵを除く同期対象ＣＰＵにブロードキャスト送信する（ステップＳ１４１１）。送信後、ＣＰＵ＃４は、後続処理の実行を被同期対象スレッドに指示し（ステップＳ１４１２）、同期信号受信部３１１を終了する。また、同期信号受信部３１１を終了し、ユーザモードに遷移したＣＰＵ＃４は、ステップＳ１４１０、ステップＳ１４１２による指示によって後続処理実行し（ステップＳ１４０３）、被同期対象スレッドの処理を終了する。
【０１１８】
図１５は、同期処理時における被同期対象ＣＰＵでの処理手順の一例を示すフローチャート（その２）である。図１５では、レディ信号を受信したＣＰＵ＃４がカーネル空間にて同期信号受信部３１２を実行する場合について説明を行う。なお、ユーザ空間で実行している被同期対象スレッドの処理を示すステップＳ１５０１〜ステップＳ１５０３は、図１４で示したステップＳ１４０１〜ステップＳ１４０３と等しいため、説明を省略する。なお、レディ信号を送信する処理は、被同期対象ＣＰＵの処理内のステップＳ１４０８とステップＳ１４１１である。
【０１１９】
ＣＰＵ＃４は、Ｍ＝Ｎであるか否かを判断する（ステップＳ１５０４）。Ｍ＝Ｎでない場合（ステップＳ１５０４：Ｎｏ）、ＣＰＵ＃４は、一定時間経過後に再びステップＳ１５０の４処理を実行する。Ｍ＝Ｎである場合（ステップＳ１５０４：Ｙｅｓ）、ＣＰＵ＃４は、同期信号受信部３１２を停止し、同期信号受信部３１１を起動する（ステップＳ１５０５）。
【０１２０】
続けて、ＣＰＵ＃４は、２つの複製先共有メモリ領域１０４のデータを比較する（ステップＳ１５０６）。ＣＰＵ＃４は、比較結果が一致を示したか否かを判断する（ステップＳ１５０７）。一致を示す比較結果である場合（ステップＳ１５０７：Ｙｅｓ）、ＣＰＵ＃４は、後続処理のアクセス先を共有メモリ領域１０３に設定し（ステップＳ１５０８）、後続処理の投機実行の継続を被同期対象スレッドに指示する（ステップＳ１５０９）。
【０１２１】
不一致を示す比較結果である場合（ステップＳ１５０７：Ｎｏ）、ＣＰＵ＃４は、後続処理のアクセス先を共有メモリ領域１０３に設定し（ステップＳ１５１０）、被同期対象スレッドの投機実行を中断させる（ステップＳ１５１１）。続けて、ＣＰＵ＃４は、後続処理の再実行を被同期対象スレッドに指示し（ステップＳ１５１２）、同期信号受信部３１２の処理を終了する。また、ユーザモードに遷移したＣＰＵ＃４は、ステップＳ１５０９、ステップＳ１５１２による指示によって後続処理を実行する（ステップＳ１５０３）。
【０１２２】
以上説明したように、同期方法、マルチコアプロセッサシステム、および同期システムによれば、Ｎ個のＣＰＵが同期処理する場合、同期ポイント到達数Ｍ＜Ｎならデータを複製して投機実行し、Ｍ＝Ｎなら複製元と複製先のデータが同一時に投機実行を継続する。本来同期処理をとらなくてもよい冗長な同期処理が実行された場合、複製先のデータは変更されない。したがって、複製元と複製先のデータを比較することで、マルチコアプロセッサシステムは、冗長な同期処理だったか否かを判定することができる。
【０１２３】
また、マルチコアプロセッサシステムは、複数のＣＰＵの少なくとも一部が、同期信号受信後に処理の実行を継続してもよい。これにより、マルチコアプロセッサシステムは、冗長な同期処理で発生する無駄な待ち時間を有効に活用することができる。
【０１２４】
また、マルチコアプロセッサシステムは、冗長な同期処理の存在するソースコードをそのまま動作することができる。同期処理を本当に行わなければならないか否かの判定は、非常に困難である。したがって、従来例のソフトウェアは、フェールセーフの考え方から、冗長な同期処理が追加されており、結果、性能劣化が発生していた。しかし、マルチコアプロセッサシステムは、冗長な同期処理が追加されているソフトウェアをそのまま実行可能とすることで、開発コストを低減することができる。
【０１２５】
また、マルチコアプロセッサシステムは、複製元と複製先のデータが一致する場合に、比較後に処理を継続してもよい。一致した場合、冗長な同期処理であったため、マルチコアプロセッサシステムは投機実行した処理を継続することで、待ち時間を有効に活用することができる。
【０１２６】
また、マルチコアプロセッサシステムは、複製元と複製先のデータが不一致な場合に、投機実行を中断してもよい。不一致であった場合、冗長な同期処理でなかったため、マルチコアプロセッサシステムは投機実行した処理を中断することで、後続の処理を矛盾なく実行することができる。
【０１２７】
また、マルチコアプロセッサシステムは、処理とＣＰＵとの関連を示すテーブルに基づいて同期処理を行うＣＰＵ数を決定してもよい。処理とＣＰＵとの関連を示すテーブルは、ＯＳがスレッドを管理するためにあらかじめ用意してあるテーブルである。したがって、マルチコアプロセッサシステムは、本実施の形態にかかる同期方法を適用するために既存のテーブルをそのまま流用できるため、適用にかかるコストを小さくすることができる。
【０１２８】
また、マルチコアプロセッサシステムは、複製元のデータから複製先１のデータと複製先２のデータと、のように、二つの複製先を作成し、データ比較の際には、複製先１のデータと複製先２のデータを比較して、冗長な同期処理であったか否かを判定してもよい。複製元のデータは、同期マスタＣＰＵによって変更される可能性があるため、投機実行の処理が共有データを変更するか否かを判定する判定対象として相応しくない。したがって、マルチコアプロセッサシステムは、複製先１のデータと複製先２のデータを比較することで、冗長な同期処理であったか否かをより正確に判定できる。
【０１２９】
また、マルチコアプロセッサシステムは、同期マスタＣＰＵから送信される同期信号を受信した後、第１受信部を被活性化し、被同期ＣＰＵから送信されるレディ信号を受信する第２受信部を活性化してもよい。これにより、マルチコアプロセッサシステムは、１つ目に受信した信号に対応する処理と２つ目に受信した信号に対応する処理とで異なる処理を行うことができる。したがって、同期信号とレディ信号は同一の信号であってもよい。
【０１３０】
なお、本実施の形態で説明した同期方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本同期方法を実行するプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本同期方法を実行するプログラムは、インターネット等のネットワークを介して配布してもよい。
【０１３１】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１３２】
（付記１）第１ＣＰＵによって発行された同期命令に基づいて、同期する複数のＣＰＵと前記複数のＣＰＵ数とを特定のテーブルに登録し、
前記複数のＣＰＵのそれぞれが前記第１ＣＰＵからの同期信号に基づいて、同期ポイントへの到達数をカウントするとともに前記複数のＣＰＵが実行する処理によってアクセスされる第１共有メモリ領域の複製である第２共有メモリ領域を作成し、
前記同期ポイントへの到達数が前記複数のＣＰＵ数に到達したときに、前記第１共有メモリ領域と前記第２共有メモリ領域とを比較し、
前記比較結果に基づいて前記複数のＣＰＵが実行した処理を判定すること
を特徴とする同期方法。
【０１３３】
（付記２）前記複数のＣＰＵの少なくとも一部は、前記同期信号受信後に処理の実行を継続すること
を特徴とする付記１に記載の同期方法。
【０１３４】
（付記３）一致を示す比較結果を有するＣＰＵは比較後に処理を継続すること
を特徴とする付記１または付記２に記載の同期方法。
【０１３５】
（付記４）不一致を示す比較結果を有するＣＰＵが前記同期信号受信後に実行した処理を中断すること
を特徴とする付記１乃至付記３の何れか一に記載の同期方法。
【０１３６】
（付記５）処理とＣＰＵとの関連を示すテーブルに基づいて前記特定のテーブルに登録すること
を特徴とする付記１乃至付記４の何れか一に記載の同期方法。
【０１３７】
（付記６）前記第２共有メモリ領域を作成する処理は、
さらに、前記第１共有メモリ領域の複製である第３共有メモリ領域を作成し、
前記第１共有メモリ領域と前記第２共有メモリ領域とを比較する処理は、
前記第２共有メモリ領域と前記第３共有メモリ領域とを比較すること
を特徴とする付記１乃至付記５の何れか一に記載の同期方法。
【０１３８】
（付記７）複数のＣＰＵ間で共有する第１共有メモリ領域と、
同期命令に基づく同期信号を受信する第１受信部と、
前記同期信号に基づいて同期ポイントへの到達数をカウントするカウント部と、
前記同期ポイントへの到達数に基づいて前記第１共有メモリ領域を複製して第２共有メモリ領域を作成する作成部と、
前記同期ポイントへの到達数が所定値に到達したときに、前記第１共有メモリ領域と前記第２共有メモリ領域とを比較する第１比較部と、
を含むことを特徴とするマルチコアプロセッサシステム。
【０１３９】
（付記８）前記複数のＣＰＵは前記同期命令に基づいて同期されるＣＰＵであり、
前記所定値は前記複数のＣＰＵ数であること
を特徴とする付記７に記載のマルチコアプロセッサシステム。
【０１４０】
（付記９）前記同期ポイントへの到達数と前記所定値とを比較する第２比較部と、
前記複数のＣＰＵ内の少なくとも一のＣＰＵからの信号に基づいて、前記第２比較部を活性化する第２受信部と、
を含むことを特徴とする付記７または付記８に記載のマルチコアプロセッサシステム。
【０１４１】
（付記１０）前記第１受信部は、前記同期信号の受信後に非活性化されること
を特徴とする付記７乃至付記９の何れか一に記載のマルチコアプロセッサシステム。
【０１４２】
（付記１１）前記第１比較部の比較結果に基づいて、前記同期信号受信後の処理を継続または中断することを通知する通知部、
を含むことを特徴とする付記９または付記１０に記載のマルチコアプロセッサシステム。
【０１４３】
（付記１２）少なくとも第１ＣＰＵと第２ＣＰＵとを含む複数のＣＰＵと、
前記複数のＣＰＵ間で共有する第１共有メモリ領域と、
と含み、
前記第１ＣＰＵは、前記複数のＣＰＵ間での同期処理を指示する同期命令に基づく同期信号を前記第２ＣＰＵに供給し、
前記第２ＣＰＵは、前記同期信号に基づいて、前記第１共有メモリ領域を複製して第２共有メモリ領域を作成するとともに、所定の処理を実行し、
前記複数のＣＰＵが同期するときに、前記第１共有メモリ領域と前記第２共有メモリ領域とを比較し、
前記比較結果に基づいて実行された前記所定の処理の処遇を決定すること
を特徴とする同期システム。
【０１４４】
（付記１３）比較結果が一致を示すときは、前記所定の処理の続きが実行されること
を特徴とする付記１２に記載の同期システム。
【０１４５】
（付記１４）比較結果が不一致を示すとき、前記所定の処理が再実行されること
を特徴とする付記１２または付記１３に記載の同期システム。
【符号の説明】
【０１４６】
１００  マルチコアプロセッサシステム
１０１  メモリ
１０２  バス
１０３  共有メモリ領域
１０４  複製先共有メモリ領域
３０１  プロセステーブル
３０２  同期情報テーブル
３０３  専有メモリ領域
３１０  同期処理部
３１１、３１２  同期信号受信部
３２１  登録部
３２２、３３７  送信部
３２３、３３１、３４１  受信部
３２４、３３８、３４５  通知部
３３２  カウント部
３３３、３４２、３４４  比較部
３３４  作成部
３３５  設定部
３３６、３４３  切替部
【国際調査報告】
2012124078.tif 000018
2012124078.tif 000019
2012124078.tif 000020
2012124078.tif 000021