以下に添付図面を参照して、開示のマルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラムの実施の形態を詳細に説明する。
図1は、同期通知数と同期待ち数に偏りがあるスレッドの割当例を示す説明図である。図1で示すマルチコアプロセッサシステム100は、複数のCPUとして、CPU#0〜CPU#2を含み、バス101で接続されている。また、CPU#0〜CPU#2は、レジスタR0〜レジスタR4を有し、レジスタI/F102#0〜レジスタI/F102#2の制御によってCPU#0〜CPU#2の各レジスタの値を共有する。
始めに、CPU#0は、CPU#0〜CPU#2に割り当てられるスレッドA_0〜スレッドA_2に関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得する。同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を、以下の記述では、同期命令に偏りがあることを示す情報と呼称する。このとき、スレッドA_0〜スレッドA_2は、細粒度並列処理を行うことを前提としており、CPU#0〜CPU#2のレジスタ値を共有することが要求される。
同期通知数とは、同期命令のうちの同期通知を実行する回数であり、同期待ち数とは、同期命令のうちの同期待ちを実行する回数である。なお、同期命令の詳細については、図4にて説明する。また、所定値の具体的な値については、図9にて後述する。
スレッドA_0に関して、スレッドA_0の同期通知数が6であり、同期待ち数が0となることから、差分が6となり、さらに、所定値が3であれば、差分が所定値より大きくなるため、CPU#0は、同期命令に偏りがあることを示す情報を取得する。続けて、CPU#0は、CPU#0のレジスタを共有元として、CPU#1、CPU#2がレジスタI/F102を通してCPU#0のレジスタにアクセスするようにレジスタI/F102#0〜レジスタI/F102#2に通知する。
このように、マルチコアプロセッサシステム100は、CPU#0〜CPU#2のうち同期通知を実行するCPU#0のレジスタをCPU#1とCPU#2に共有させることにより、CPU#0〜CPU#2にてスレッドA_0〜スレッドA_2を実行する。以下、図1で示したレジスタの利用方法を、共有方法と呼称する。共有方法にて、共有元となるCPUの処理は、自身のレジスタにアクセスするため速くなり、他のCPUは、バス101を介して共有元となるCPUにアクセスするため遅くなる。
図1の状態では、同期通知を行うCPU#0の処理が高速となるため、同期待ちを行うCPU#1、CPU#2の待ち時間が減少し、CPU#0〜CPU#2全体の利用効率が向上する。
図2は、同期通知数と同期待ち数に偏りがないスレッドの割当例を示す説明図である。図2で示すマルチコアプロセッサシステム100にて、CPU#0は、CPU#0〜CPU#2に割り当てられるスレッドB_0〜スレッドB_2に関する同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得する。同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を、以下の記述では、同期命令に偏りがないことを示す情報と呼称する。このとき、スレッドB_0〜スレッドB_2は、細粒度並列処理を行うことを前提としており、CPU#0〜CPU#2のレジスタ値を共有することが要求される。
スレッドB_0の同期通知数が3であり、同期待ち数が3となることから、差分が0となり、さらに、所定値が3であれば、差分が所定値以下となるため、CPU#0は、同期命令に偏りがないことを示す情報を取得する。また、CPU#0は、スレッドB_1、スレッドB_2に関する同期命令に偏りがないことを示す情報を取得する。続けて、CPU#0は、各CPUが自身のレジスタの値が更新される都度、他のCPUのレジスタに複写するように、レジスタI/F102#0〜レジスタI/F102#2に通知する。
このように、マルチコアプロセッサシステム100は、CPU#0〜CPU#2のうちいずれかのCPUのレジスタの値が更新される都度、他のCPUのレジスタに複写することにより、CPU#0〜CPU#2にてスレッドB_0〜スレッドB_2を実行する。以下、図2で示したレジスタの利用方法を、複写方法と呼称する。複写方法では、レジスタの読込時には、複写が発生しないため、高速に処理が行え、レジスタ書き込み時には、複写が発生するため、処理は遅くなる。また、複写方法では、各CPUの処理能力は同一となる。
図2の状態では、同期命令に偏りがない状態で、各CPUの処理能力が同一であるため、同期待ち時間が減少し、結果、全体での利用効率を向上することができる。図1、図2で示したように、マルチコアプロセッサシステム100は、スレッドに同期命令の偏りがある場合、CPUの処理能力に偏りのある共有方法を用い、スレッドに同期命令の偏りがない場合、CPUの処理能力に偏りのない複写方法を用いる。このように、各スレッドの同期命令の偏りと、各CPUの処理能力の偏りを一致させることで、全体の処理能力を向上することができる。以下、図1、図2で示したように動作するマルチコアプロセッサシステム100について、図3〜図18を用いて説明する。
(マルチコアプロセッサシステム100のハードウェア)
図3は、マルチコアプロセッサシステムのハードウェア例を示すブロック図である。本実施の形態におけるマルチコアプロセッサシステム100は、携帯電話などの携帯端末を想定している。図3において、マルチコアプロセッサシステム100は、CPUs301と、ROM(Read‐Only Memory)302と、RAM(Random Access Memory)303と、を含む。また、マルチコアプロセッサシステム100は、フラッシュROM304と、フラッシュROMコントローラ305と、フラッシュROM306と、を含む。また、マルチコアプロセッサシステム100は、ユーザやその他の機器との入出力装置として、ディスプレイ307と、I/F(Interface)308と、キーボード309と、を含む。また、各部はバス101によってそれぞれ接続されている。
ここで、CPUs301は、マルチコアプロセッサシステム100の全体の制御を司る。CPUs301は、CPU#0〜CPU#2を含む。また、マルチコアプロセッサシステム100に含まれるCPUは、2つ以上であればよい。また、CPUs301は、専用のキャッシュメモリを有してもよい。また、マルチコアプロセッサシステム100は、複数のコアを含むマルチコアプロセッサシステムであってもよい。なお、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、シングルコアのプロセッサであるCPUが並列されている形態を例にあげて説明する。
ROM302は、ブートプログラムなどのプログラムを記憶している。RAM303は、CPUs301のワークエリアとして使用される。フラッシュROM304は、読出し速度が高速なフラッシュROMであり、たとえば、NOR型フラッシュメモリである。たとえば、フラッシュROM304は、OS(Operating System)などのシステムソフトウェアやアプリなどを記憶している。たとえば、OSを更新する場合、マルチコアプロセッサシステム100は、I/F308によって新しいOSを受信し、フラッシュROM304に格納されている古いOSを、受信した新しいOSに更新する。
フラッシュROMコントローラ305は、CPUs301の制御に従ってフラッシュROM306に対するデータのリード/ライトを制御する。フラッシュROM306は、データの保存、運搬を主に目的としたフラッシュROMであり、たとえば、NAND型フラッシュメモリである。フラッシュROM306は、フラッシュROMコントローラ305の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム100を使用するユーザがI/F308を通して取得した画像データ、映像データや、また本実施の形態にかかるレジスタ利用方法を実行するプログラムなどである。フラッシュROM306は、たとえば、メモリカード、SDカードなどを採用することができる。
ディスプレイ307は、カーソル、アイコンあるいはツールボックスを始め、文書、画像、機能情報などのデータを表示する。ディスプレイ307は、たとえば、TFT(Thin Film Transistor)液晶ディスプレイなどを採用することができる。
I/F308は、通信回線を通じてLAN、WAN(Wide Area Network)、インターネットなどのネットワーク310に接続され、ネットワーク310を介して他の装置に接続される。そして、I/F308は、ネットワーク310と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F308には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード309は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード309は、タッチパネル式の入力パッドやテンキーなどであってもよい。
図4は、同期命令の種別の一例についての説明図である。符号401で示す図は、スレッドA_0とスレッドA_1の実行コードの一例を示しており、符号402で示す図は、スレッドA_0とスレッドA_1の実行結果を示しており、表403は、符号401、符号402から示される同期命令の特徴について示している。スレッドA_0とスレッドA_1にて、レジスタR1が共に使用されており、レジスタR1に対する書込と読込の順序が変更されないようにするため、同期命令が挿入されている。
なお、以下の説明において、実行コード内での同期命令の位置を同期ポイントと定義する。また、同期命令を実行可能な位置に到達した場合を、同期ポイントに到達したと呼称する。また、同期命令のうちバリア同期は、特定のグループに含まれるスレッドが全て同期ポイントに到着した際に、次の処理に進む機能を有する。この特定のグループのことを、同期グループと定義する。また、同期命令には、同期通知、同期待ち、バリア同期が存在する。
初めに、スレッドA_0を実行するCPU#0は、時刻t0にて、先行命令として、レジスタR2とレジスタR3の和をレジスタR1に書き込み、時刻t2にて同期通知であるsyncs命令をCPU#1を通知先として実行する。また、スレッドA_1を実行する実行するCPU#1は、時刻t0にて、先行命令を実行し、時刻t2より早い時刻である時刻t1にて、同期待ちであるsyncr命令をCPU#0を通知元として実行する。時刻t1では、CPU#0が同期ポイントに到達していないため、CPU#1は、同期通知を受け付けるまで待機する。同期通知を完了した時刻t3にて、CPU#0は、後続命令を実行し、同時刻にて、CPU#1も、同期待ちを終了し、後続命令を実行する。
次に、CPU#0は、時刻t4にて、バリア同期であるsynca命令を実行する。時刻t4の時点では、CPU#1が同期ポイントに到達していないため、CPU#0は、CPU#1が同期ポイントに到達するまで待機する。時刻t5にて、CPU#1がsynca命令を実行する。
このように、符号401、符号402で示したように、同期通知を含む一連の処理として、CPUは、先行命令が終了した後、同期通知を実行し、同期通知が終了した後に、後続命令を実行する。したがって、表403で示すように、同期通知を実行するCPUは、同期待ち側を待たなくてよい。
同様に、同期待ちを含む一連の処理として、CPUは、先行命令が終了した後、同期待ちを実行し、同期通知を受け付けた後、後続命令を実行する。したがって、同期待ちを実行するCPUは、既に同期通知を受け付けていれば、待たなくてよい。
同様に、バリア同期を含む一連の処理として、CPUは、先行命令が終了した後、同期グループに属するCPUが全て同期ポイントに到達した場合、後続命令を実行する。したがって、バリア同期を実行するCPUは、同一の同期グループに属する他のCPUが同時に同期ポイントに到達すれば、待たなくてよい。
(マルチコアプロセッサシステム100の機能)
次に、マルチコアプロセッサシステム100の機能について説明する。図5は、マルチコアプロセッサシステムの機能例を示すブロック図である。マルチコアプロセッサシステム100は、スケジューラ501と、レジスタ利用ライブラリ502と、ディスパッチャ503と、を有する。
また、マルチコアプロセッサシステム100は、検出部511と、更新部512と、取得部513と、判断部514と、特定部515と、通知部516と、実行部517と、割当部518とを含む。制御部となる機能(検出部511〜割当部518)は、記憶装置に記憶されたプログラムをCPUs301のうちのいずれかのCPUが実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図3に示したROM302、RAM303、フラッシュROM304、フラッシュROM306などである。または、I/F308を経由して他のCPUが実行することにより、その機能を実現してもよい。
また、図5では各機能部が、CPU#0の機能であるように図示しているが、CPU#1、CPU#2の機能であってもよい。また、検出部511〜通知部516は、レジスタ利用ライブラリ502の機能であり、実行部517は、レジスタI/F102の機能であり、割当部518は、ディスパッチャ503の機能である。
また、マルチコアプロセッサシステム100は、プロファイル情報521にアクセス可能である。プロファイル情報521の詳細については、図6にて後述する。プロファイル情報521は、RAM303、フラッシュROM304、フラッシュROM306等に存在する。
スケジューラ501は、マルチコアプロセッサシステム100内で実行されるスレッドを各CPUに割り当て、次に実行するスレッドを選択する機能を有する。たとえば、スケジューラ501は、スレッドA_0をCPU#0に割り当て、スレッドA_1をCPU#1に割り当てる。
レジスタ利用ライブラリ502は、スケジューラ501からのスレッド割当通知を受け付けると、レジスタ共有方法のうち共有方法か複写方法のいずれかを用いるか、またはレジスタ共有を行わないか、ということをレジスタI/F102に通知する。また、レジスタ利用ライブラリ502は、ディスパッチャ503に、スレッドの割当に変更がない場合、スケジューラ501から受けたスレッド割当通知をそのまま通知し、変更がある場合、変更されたスレッド割当通知を通知する。
ディスパッチャ503は、現在動作中のスレッドに対して、スケジューラ501およびレジスタ利用ライブラリ502によって決定した次のスレッドに切り替える機能を有する。たとえば、ディスパッチャ503は、CPU#0で実行していたスレッドA_0からスレッドB_0に切り替える場合、スレッドA_0のプログラムカウンタ等を含むレジスタ情報を退避する。退避後、ディスパッチャ503は退避されてあったスレッドB_0のレジスタ情報を復帰する。復帰後、ディスパッチャ503は、スレッドB_0の処理を前回の切り替えられた時点から継続することができる。
検出部511は、スレッドが複数のコアのいずれかのコアに割り当てられることを検出する機能を有する。たとえば、検出部511は、スレッドA_0がCPU#0に割り当てられることを検出する。
また、検出部511は、いずれかのスレッドにて同期待ちが完了したことを検出してもよい。たとえば、検出部511は、実行中のスレッドA_1にて、同期待ちが完了したことを検出する。また、検出対象は、同期通知、バリア同期が含まれてもよい。なお、検出結果は、RAM303、フラッシュROM304、フラッシュROM306などの記憶領域に記憶される。
更新部512は、検出部511によっていずれかのスレッドにて同期待ちが完了したことを検出した場合、スレッドに関する同期通知数と同期待ち数とを更新する機能を有する。たとえば、スレッドA_0のプロファイル情報521が同期通知数:6、同期待ち数:0、スレッドA_1のプロファイル情報521が同期通知数:0、同期待ち数:6とする。この状態から、さらに、たとえば、スレッドA_0から発行された同期通知をスレッドA_1にて同期待ちが完了したことを検出部511が検出した場合とする。このとき、更新部512は、スレッドA_0のプロファイル情報521を、同期通知数:5、同期待ち数:0、スレッドA_1のプロファイル情報521を、同期通知数:0、同期待ち数:5に更新する。
取得部513は、複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得する機能を有する。同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報とは、同期命令に偏りがあることを示す情報のことであり、同期命令に偏りがあることを示す情報は、プロファイル情報521に記録されている。プロファイル情報521には、同期命令に偏りがあることを示す識別子が格納されていてもよいし、同期通知数と同期待ち数の各値が格納されていてもよい。また、同期命令に偏りがあることを示す識別子は、マルチコアプロセッサシステム100の設計者によって設定されていてもよい。
また、スレッドに関する同期命令に偏りがある情報とは、スレッド内のプログラムに記述された同期命令に偏りがあることを示す情報である。したがって、プロファイル情報521は、同期命令に偏りがあることを示す情報をスレッドごとに記憶する。たとえば、取得部513は、スレッドA_0に関する同期命令に偏りがある情報を取得する。
また、取得部513は、複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得してもよい。同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報とは、同期命令に偏りがないことを示す情報のことであり、同期命令に偏りがないことを示す情報は、プロファイル情報521に記録されている。たとえば、プロファイル情報521には、同期命令に偏りがないことを示す識別子が格納されている。たとえば、取得部513は、スレッドA_0〜スレッドA_2のプロファイル情報521として、全てスレッドにて同期命令に偏りがないことを示す情報を取得する。なお、取得されたプロファイル情報521、または、プロファイル情報521へのポインタは、RAM303、フラッシュROM304、フラッシュROM306などの記憶領域に記憶される。
判断部514は、複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する機能を有する。
具体的な判断方法として、たとえば、判断部514は、同期通知数と同期待ち数の差分の絶対値が所定値より大きいか否かを判断する。また、判断部514は、同期通知数と同期待ち数の差分の絶対値を、同期命令の総数で除した値が所定値より大きいか否かを判断してもよい。
また、判断部514は、検出部511によってスレッドが割り当てられることが検出された場合、または更新部512によってスレッドに関する偏りを示す情報が更新された場合に、差分に基づいた値が所定値より大きいか否かを判断してもよい。なお、判断結果は、RAM303、フラッシュROM304、フラッシュROM306などの記憶領域に記憶される。
特定部515は、実行部517がレジスタを共有させることによりスレッドを実行する場合、スレッドに関する同期通知数と同期待ち数との差の大きさに基づいて、スレッドを特定する機能を有する。具体的な特定方法として、たとえば、特定部515は、同期通知数と同期待ち数の差分が最大となるスレッドを特定してもよい。または、特定部515は、同期通知数と同期待ち数の差が所定値以上となるスレッドのうちいずれかのスレッドを特定してもよい。または、特定部515は、同期通知数と同期待ち数の差を同期命令の総数で除した値が最大となるスレッドを特定してもよい。なお、特定されたスレッドの情報は、RAM303、フラッシュROM304、フラッシュROM306などの記憶領域に記憶される。
通知部516は、取得部513によって差分に基づいた値が所定値より大きいことを示す情報が取得された場合、複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させる共有方法を用いることをレジスタI/F102に通知する機能を有する。また、通知部516は、判断部514によって差分に基づいた値が所定値より大きいと判断された場合に、共有方法を用いることを通知してもよい。また、通知部516は、特定部515によって特定されたスレッドを、複数のコアのうちレジスタの共有元となるコアに割り当てるように割当部518に通知してもよい。
また、通知部516は、取得部513によって同期命令に偏りがないというプロファイル情報521が取得された場合、複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写する複写方法を用いることを通知してもよい。また、通知部516は、判断部514によっていずれのスレッドについても同期命令に偏りがないと判断された場合に、複写方法を用いることを通知してもよい。
実行部517は、通知部516から通知された共有方法を用いるか、または複写方法を用いるか、という指示に従って、複数のコアによりスレッドを実行する機能を有する。たとえば、実行部517は、共有方法として、複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、スレッドA_0〜スレッドA_2を実行する。また、実行部517は、複写方法として、複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、スレッドB_0〜スレッドB_2を実行する。
割当部518は、通知部516から通知された、特定されたスレッドをレジスタの共有元となるコアに割り当てる機能を有する。たとえば、割当部518は、スレッドA_0を、レジスタの共有元となるCPU#0に割り当てる。
図6は、プロファイル情報の記憶内容の一例を示す説明図である。図6で示すプロファイル情報521は、レコード521−1〜レコード521−9を登録している。プロファイル情報521は、スレッドID、同期命令の総数、同期通知数、同期待ち数、バリア同期数という5つのフィールドを含む。スレッドIDフィールドには、対象スレッドを一意に識別する情報が格納される。同期命令の総数フィールドには、対象スレッド内にある同期通知、同期待ち、バリア同期の総数が格納される。同期通知数フィールドには、対象スレッド内にある同期通知数が格納される。同期待ち数フィールドには、対象スレッド内にある同期待ち数が格納される。バリア同期数フィールドには、対象スレッド内にあるバリア同期数が格納される。
たとえば、レコード521−1は、同期命令の総数が6であり、同期通知数が6であり、同期待ち数とバリア同期数が0であることを示している。なお、プロファイル情報521は、開発者がプログラムを作成したときに生成してもよいし、スレッド実行前に、OSがスレッドのバイナリプログラムを解析して生成してもよい。
図7は、同期命令に偏りがあるスレッドの実行結果の一例を示す説明図である。符号701で示す図は、共有方法を実行しているマルチコアプロセッサシステム100が、レジスタの共有元となるCPU#0に、同期待ちが多いスレッドA_1を割り当て、CPU#1に、同期通知が多いスレッドA_0を割り当てている。また、符号702で示す図は、共有方法を実行しているマルチコアプロセッサシステム100が、レジスタの共有元となるCPU#0に、スレッドA_0を割り当て、CPU#1に、スレッドA_1を割り当てている。
初めに、符号701におけるCPU#0は、レジスタの共有元であるため、処理が早く完了し、スレッドA_0からの同期通知を待つことになる。たとえば、CPU#0は、スレッドA_1の処理番号{1}を終了した後、CPU#1によるスレッドA_0の処理番号2からの同期通知を待つことになる。処理番号{3}、処理番号{5}でも同様な現象が発生する。このように、レジスタの共有元となるCPUに、同期待ちが多いスレッドを割り当てると、待ち時間の粒度が小さくなる。
次に、符号702におけるCPU#0は、レジスタの共有元であるため、処理が早く完了し、処理番号{2}、{4}、{6}にて、同期通知をCPU#1に通知し、待ちとなる。このように、レジスタの共有元となるCPUに、同期通知が多いスレッドを割り当てると、待ち時間の粒度が大きくなる。待ち時間の粒度が大きくなると、DVFS(Dynamic Voltage and Frequency Scaling)が利用しやすくなり、また、他のアプリの処理を実行しやすくなる。理由として、DVFSは、適用が可能な最小時間が存在するため、待ち時間の粒度が小さいと、DVFSの適用ができない場合が存在するためである。また、他プロセスの処理に関しては、待ち時間の粒度が小さいと、他プロセスに切り替えるオーバヘッドが増大するためである。
図8は、同期命令に偏りがないスレッドの実行結果の一例を示す説明図である。符号801で示す図は、共有方法を実行しているマルチコアプロセッサシステム100が、レジスタの共有元となるCPU#0に、同期命令に偏りがないスレッドB_1を割り当て、CPU#1に、同期命令に偏りがないスレッドB_0を割り当てている。また、符号802で示す図は、複写方法を実行しているマルチコアプロセッサシステム100が、CPU#0に、スレッドB_1を割り当て、CPU#1に、スレッドB_0を割り当てている。
初めに、符号801におけるCPU#0は、レジスタの共有元であるため、処理が早く完了し、スレッドB_0からの同期通知を待つことになる。たとえば、CPU#0は、スレッドB_0の処理番号{1}を終了した後、CPU#1によるスレッドB_0の処理番号{2}からの同期通知を待つことになる。処理番号{5}でも同様な現象が発生する。
次に、符号802におけるCPU#0とCPU#1は、複写方法であるため、処理速度が同一となるため、同期待ちを行う時間が符号801で示す図に比べて短くなる。このように、同期命令に偏りがない場合、複写方法を用いてスレッドを実行することで、CPUの性能差がなくなり、同期待ち時間が減少するため、マルチコアプロセッサシステム100は、プロセッサの利用効率を向上できる。
図9は、レジスタ値共有方法の判断方法の一例を示す説明図である。図9では、レジスタ値共有方法として利用する方法の判断方法について、共有方法、複写方法のいずれを用いるかの判断方法について説明する。
マルチコアプロセッサシステム100は、スレッド群のうち、下記(1)式が満たすスレッドが一つ以上ある場合、共有方法を用いる。
|(同期通知数−同期待ち数)/同期命令の総数|>α …(1)
ここで、|x|はxの絶対値を意味しており、αは定数である。図1、図2で示した所定値は、たとえばαとなる。たとえば、α=0.4である。また、マルチコアプロセッサシステム100は、下記(2)式が満たされる場合、複写方法を用いる。
バリア同期数/同期命令の総数>β …(2)
ここで、βは定数である。たとえば、β=0.5である。また、マルチコアプロセッサシステム100は、共有方法を用いると判断された場合、スレッドごとに下記(3)式で示す評価式を実行し、最も大きい値となったスレッドを、レジスタの共有元になるCPUに割り当てる。
(同期通知数−同期待ち数)/同期命令の総数 …(3)
また、マルチコアプロセッサシステム100は、(1)式が満たされた場合に共有方法を用い、(1)式が満たされない場合に複写方法を用いてもよい。また、あるスレッドが(1)式を満たし、他のスレッドが(2)式を満たした場合、マルチコアプロセッサシステム100は、共有方法を用いる。
以下、図9で示したレジスタ値共有方法の判断方法を実行して、第1のスレッド群〜第3のスレッド群の実行結果を図10〜図15にて説明する。スレッド群は、たとえば、それぞれ異なるアプリに属しているとする。たとえば、第1のスレッド群がアプリ1に属し、第2のスレッド群がアプリ2に属し、第3のスレッド群がアプリ3に属している。
また、第1のスレッド群は、同期命令に偏りがあるスレッド群を想定しており、たとえば、図6で示したスレッドA_0〜スレッドA_2である。第2のスレッド群は、同期命令に偏りがないスレッド群を想定しており、たとえば、図6で示したスレッドB_0〜スレッドB_2である。第3のスレッド群は、同期命令に偏りがあるスレッドと、同期命令に偏りがないスレッドが混在している場合を想定しており、たとえば、図6で示したスレッドC_0〜スレッドC_2である。
図10は、第1のスレッド群の前提条件の一例を示す説明図である。表1001には、共有方法でのCPUの処理能力と、複写方法でのCPUの処理能力を示しており、前提条件1002では、第1のスレッド群となるスレッドA_0〜スレッドA_2の処理量と、同期通知および同期待ちの詳細について示している。また、表1003は、スレッドA_0〜スレッドA_2に関する式(1)〜式(3)の算出結果を示している。なお、図10におけるスレッドA_0〜スレッドA_2のプロファイル情報521としては、図6で示した値と同一である。
表1001に示すように、たとえば、共有方法にて自身のレジスタにアクセスするCPUの処理能力を300[命令数/us]であるとし、共有方法にて他のCPUのレジスタにアクセスするCPUの処理能力を100[命令数/us]であるとする。また、複写方法のCPUの処理能力を150[命令数/us]であるとする。
また、前提条件1002では、たとえば、スレッドA_0の処理番号{1}は、処理量が600[命令数]であり、処理番号{5}へ同期通知を送信する。続けて、スレッドA_0は、処理番号{4}、{7}、{10}、{13}、{14}の順で処理を行う。また、スレッドA_1の処理番号{2}は、処理量450[命令数]であり、同期命令は行わない。続けて、スレッドA_1は、処理番号{5}、{8}、{11}の順で処理を行う。また、スレッドA_2の処理番号{3}は、処理量600[命令数]であり、同期命令は行わない。続けて、スレッドA_2は、処理番号{6}、{9}、{12}の順で処理を行う。
また、表1003で示すように、マルチコアプロセッサシステム100は、スレッドA_0〜スレッドA_2に対して、(1)式、(2)式を実行する。たとえば、スレッドAに対する(1)式は、以下のように実行される。
|(6−0)/6|=1>0.4
このように、スレッドA_0は(1)式を満たしている。同様に、スレッドA_0に対する(2)式、スレッドA_1、スレッドA_2に対する(1)式、(2)式を算出する。(1)式の算出結果について、スレッドA_0〜スレッドA_2全てが(1)式を満たしたため、マルチコアプロセッサシステム100は、共有方法を用いる。また、マルチコアプロセッサシステム100は、(3)式を実行し、(3)式の算出結果より、スレッドA_0が最も大きい値となるため、スレッドA_0をCPU#0に割り当てる。
図11は、共有方法、または複写方法を用いて第1のスレッド群を実行した場合の結果の一例を示す説明図である。図11の例では、タイムチャート1101は、図10で判断したように、共有方法を用い、スレッドA_0をCPU#0に割り当てた場合の結果を示している。また、比較として、タイムチャート1102は、共有方法を用い、スレッドA_0をCPU#2に割り当てた場合の結果を示している。同様に、タイムチャート1103は、複写方法を用いた場合の結果を示している。なお、各処理にかかる時間は、前提条件1002にて示した処理量を、表1001で示した処理能力で除算した結果である。
タイムチャート1101にて、スレッドA_0を実行するCPU#0は、処理番号{1}、{4}、{7}、{10}、{13}、{14}を実行し、11.5[us]に処理を終了する。また、スレッドA_1を実行するCPU#1は、処理番号{2}、{5}、{8}、{11}を実行し、19.5[us]に処理を終了する。同様に、スレッドA_2を実行するCPU#2は、処理番号{3}、{6}、{9}、{12}を実行し、19.5[us]に処理を終了する。
タイムチャート1102にて、スレッドA_0を実行するCPU#2は、図示していないが、34.5[us]に処理を終了する。タイムチャート1101の結果と比較すると、タイムチャート1102ではスレッドA_0の処理に時間がかかり、結果、通知待ちを行うスレッドA_1、スレッドA_2の処理にも時間がかかるようになってしまっている。また、スレッドA_2を実行するCPU#0は、たとえば、2[us]から12[us]まで待ち時間が発生してしまっている。
タイムチャート1103にて、スレッドA_0を実行するCPU#0は、23[us]に処理を終了する。スレッドA_1を実行するCPU#1は、22[us]に処理を終了し、スレッドA_2を実行するCPU#2は、26[us]に処理を終了する。タイムチャート1101の結果と比較すると、タイムチャート1103ではスレッドA_0の処理に時間がかかっている。また、CPU#1、CPU#2は、同期待ちの時間が細切れに発生してしまっている。たとえば、CPU#1では、3[us]〜4[us]、8[us]〜11[us]といった細かい時間で待ちが発生しており、CPU#2では、4[us]〜8[us]、11[us]〜15[us]といった時間で待ちが発生している。
図12は、第2のスレッド群の前提条件の一例を示す説明図である。表1001には、共有方法でのCPUの処理能力と、複写方法でのCPUの処理能力を示しており、前提条件1201では、第2のスレッド群となるスレッドB_0〜スレッドB_2の処理量と、同期通知および同期待ちの詳細について示している。また、表1202は、スレッドB_0〜スレッドB_2に関する式(1)〜式(3)の算出結果を示している。なお、図12におけるスレッドB_0〜スレッドB_2のプロファイル情報521は、図6で示した値と同一である。なお、表1001は図10で説明した値と同一であるため、説明を省略する。
前提条件1201で示すように、たとえば、スレッドB_0の処理番号{1}は、処理量が600[命令数]であり、処理番号{5}へ同期通知を送信する。次に、スレッドB_0の処理番号{4}は、処理量が450[命令数]であり、処理番号{3}からの同期待ちを行い、処理番号{8}へ同期通知を送信する。続けて、スレッドB_0は、処理番号{7}、{10}の順で処理を行う。また、スレッドB_1の処理番号{2}は、処理量450[命令数]であり、処理番号{6}へ同期通知を送信する。続けて、スレッドB_1は、処理番号{5}、{8}、{11}の順で処理を行う。また、スレッドB_2の処理番号{3}は、処理量600[命令数]であり、処理番号{4}へ同期通知を送信する。続けて、スレッドB_2は、処理番号{6}、{9}、{12}の順で処理を行う。
また、表1202で示すように、マルチコアプロセッサシステム100は、スレッドB_0〜スレッドB_2に対して、(1)式、(2)式を実行する。(1)式の算出結果について、スレッドB_0〜スレッドB_2全てが(1)式を満たさないため、マルチコアプロセッサシステム100は、複写方法を用いる。
図13は、共有方法、または複写方法を用いて第2のスレッド群を実行した場合の結果の一例を示す説明図である。図13の例では、タイムチャート1301は、図12で判断したように、複写方法を用いた場合の結果を示している。また、比較として、タイムチャート1302は、共有方法を用いた場合の結果を示している。
タイムチャート1301にて、スレッドB_0を実行するCPU#0は、処理番号{1}、{4}、{7}、{10}を実行し、16[us]に処理を終了する。また、スレッドB_1を実行するCPU#1は、処理番号{2}、{5}、{8}、{11}を実行し、16[us]に処理を終了する。同様に、スレッドB_2を実行するCPU#2は、処理番号{3}、{6}、{9}、{12}を実行し、15[us]に処理を終了する。
タイムチャート1302にて、スレッドB_0を実行するCPU#0は、20[us]に処理を終了する。また、スレッドB_1を実行するCPU#1は、21[us]に処理を終了する。また、スレッドB_2を実行するCPU#2は、22.5[us]に処理を終了する。タイムチャート1301の結果と比較すると、タイムチャート1302ではスレッドB_1、スレッドB_2の処理に時間がかかるようになってしまっている。
図14は、第3のスレッド群の前提条件の一例を示す説明図である。表1001には、共有方法でのCPUの処理能力と、複写方法でのCPUの処理能力を示しており、前提条件1401には、第3のスレッド群となるスレッドC_0〜スレッドC_2の処理量と、同期通知および同期待ちの詳細について示している。また、表1402は、スレッドC_0〜スレッドC_2に関する式(1)〜式(3)の算出結果を示している。なお、図14におけるスレッドC_0〜スレッドC_2のプロファイル情報521は、図6で示した値と同一である。なお、表1001は図10で説明した値と同一であるため、説明を省略する。
前提条件1401で示した図のように、たとえば、スレッドC_0の処理番号{1}は、処理量が600[命令数]であり、処理番号{5}へ同期通知を送信し、処理番号{4}は、処理量が600[命令数]であり、処理番号{6}へ同期通知を送信する。また、スレッドC_1の処理番号{2}は、処理量450[命令数]であり、同期処理は行わない。また、スレッドB_2の処理番号{3}は、処理量600[命令数]であり、処理番号{5}へ同期通知を送信する。
また、表1402で示すように、マルチコアプロセッサシステム100は、スレッドC_0〜スレッドC_2に対して、(1)式、(2)式を実行する。(1)式の算出結果について、スレッドC_0、スレッドC_1が(1)式を満たしたため、マルチコアプロセッサシステム100は、共有方法を用いる。また、マルチコアプロセッサシステム100は、(3)式を実行し、(3)式の算出結果より、スレッドC_0が最も大きい値となるため、スレッドC_0をCPU#0に割り当てる。
図15は、共有方法、または複写方法を用いて第3のスレッド群を実行した場合の結果の一例を示す説明図である。図15の例では、タイムチャート1501は、図14で判断したように、共有方法を用い、スレッドC_0をCPU#0に割り当てた場合の結果を示している。また、比較として、タイムチャート1502は、共有方法を用い、スレッドC_0をCPU#2に割り当てた場合の結果を示している。同様に、タイムチャート1503は、複写方法を用いた場合の結果を示している。
タイムチャート1501にて、スレッドC_0を実行するCPU#0は、処理番号{1}、{4}、{7}、{10}、{13}、{14}を実行し、11.5[us]に処理を終了する。また、スレッドC_1を実行するCPU#1は、処理番号{2}、{5}、{8}、{11}を実行し、21[us]に処理を終了する。同様に、スレッドA_2を実行するCPU#2は、処理番号{3}、{6}、{9}、{12}を実行し、19.5[us]に処理を終了する。
タイムチャート1502にて、スレッドC_0を実行するCPU#2は、図示していないが、34.5[us]に処理を終了する。タイムチャート1501の結果と比較すると、タイムチャート1502ではスレッドC_0の処理に時間がかかり、結果、通知待ちを行うスレッドC_1、スレッドC_2の処理にも時間がかかるようになってしまっている。また、スレッドC_2を実行するCPU#0は、たとえば、2[us]から12[us]まで待ち時間が発生してしまっている。
タイムチャート1503にて、スレッドC_0を実行するCPU#0は、23[us]に処理を終了する。スレッドC_1を実行するCPU#1は、22[us]に処理を終了し、スレッドC_2を実行するCPU#2は、26[us]に処理を終了する。タイムチャート1501の結果と比較すると、タイムチャート1503ではスレッドC_0の処理に時間がかかっている。また、CPU#1、CPU#2は、同期待ちの時間が細切れに発生してしまっている。たとえば、CPU#1では、3[us]〜4[us]、8[us]〜11[us]といった細かい時間で待ちが発生しており、CPU#2では、4[us]〜8[us]、11[us]〜15[us]といった時間で待ちが発生している。
図15で示すように、複数のスレッドのうち1つでも同期命令に偏りがある場合、マルチコアプロセッサシステム100は、共有方法を用いることで、ボトルネックとなるスレッドを高速に処理することができ、CPU#0〜CPU#2の利用効率を向上できる。
続いて、図16、図17にて、図10〜図15で示したようなレジスタ利用処理のフローチャートを示す。マルチコアプロセッサシステム100が実行するレジスタ利用処理は、図16で示すレジスタ利用処理か、図17で示すレジスタ利用処理か、のいずれであってもよい。なお、レジスタ利用処理は、CPU#0〜CPU#2のいずれのCPUで行ってもよい。本実施の形態では、たとえば、CPU#0がレジスタ利用処理を実行する場合にて説明する。
図16は、レジスタ利用処理の一例を示すフローチャートである。図16で示すレジスタ利用処理は、スケジューラからスレッド割当の通知をトリガーとして実行される。CPU#0は、スケジューラ501により、スレッドがCPU#0〜CPU#2のいずれかに割り当てられることを検出する(ステップS1601)。以下、図16の説明では、割り当てられるスレッドを対象スレッドと呼称する。CPU#0は、対象スレッドが細粒度並列処理か否かを判断する(ステップS1602)。なお、対象スレッドが細粒度並列処理か否かの判断方法としては、プロファイル情報521に、対象スレッドに対応するレコードの有無によって、細粒度並列処理か否かを判断する。
細粒度並列処理である場合(ステップS1602:Yes)、CPU#0は、割当対象のスレッドに対応するプロファイル情報を取得する(ステップS1603)。次に、CPU#0は、プロファイル情報から、(1)式、(2)式を実行する(ステップS1604)。また、1つのアプリを実行する際に、複数のスレッドを割り当てる場合、CPU#0は、複数のスレッドの各々のスレッドに対して、(1)式、(2)式を実行する。
(1)式、(2)式の結果により、CPU#0は、同期命令に偏りがあるか否かを判断する(ステップS1605)。同期命令に偏りがある場合(ステップS1605:Yes)、CPU#0は、レジスタI/F102に、特定のCPUをレジスタの共有元として共有方法を用いることを通知する(ステップS1606)。続けて、CPU#0は、プロファイル情報から、(3)式を実行する(ステップS1607)。(3)式の結果により、CPU#0は、ディスパッチャ503に、(3)式の値が最も大きいスレッドを、特定のCPUに割り当てるように通知し(ステップS1608)、レジスタ利用処理を終了する。
同期命令に偏りがない場合(ステップS1605:No)、CPU#0は、レジスタI/F102に、複写方法を用いることを通知する(ステップS1609)。次に、CPU#0は、ディスパッチャ503に、スケジューラ501の指示通りに対象スレッドを割り当てるように通知し(ステップS1610)、レジスタ利用処理を終了する。
また、細粒度並列処理でない場合(ステップS1602:No)、CPU#0は、レジスタI/Fに、レジスタ値の共有を行わないことを通知し(ステップS1611)、ステップS1610の処理に移行する。
図17は、レジスタ利用処理の他の例を示すフローチャートである。図17で示すレジスタ利用処理は、スレッド内で同期命令が完了したことをトリガーとして実行される。また、図17で示すステップS1701、ステップS1704、ステップS1705、ステップS1708以外の処理については、図16で示した処理と同一であるため、説明を省略する。
CPU#0は、実行中のスレッドにて、同期命令が完了したことを検出し(ステップS1701)、ステップS1702の処理に移行する。以下、図17の説明では、実行中のスレッドを対象スレッドと呼称する。なお、検出対象となる同期命令は、同期通知、同期待ち、バリア同期のうち、同期待ちのみであってもよい。理由として、同期通知の完了を検出した場合、同期待ちも近いうちに行われることが予想され、頻繁にレジスタ利用処理が実行されるのを防ぐためである。また、バリア同期についても、検出対象となる同期命令に含めなくともよい。
ステップS1703の処理を実行後、CPU#0は、プロファイル情報521を、発行した同期命令数分減少する(ステップS1704)。次に、CPU#0は、更新したプロファイル情報521から、(1)式、(2)式を実行し(ステップS1705)、ステップS1706の処理に移行する。
また、ステップS1707の処理を実行後、CPU#0は、更新したプロファイル情報521から、(3)式を実行し(ステップS1708)、ステップS1709の処理に移行する。
図18は、本実施の形態にかかるコンピュータを用いたシステムの適用例を示す説明図である。図18において、ネットワークNWは、サーバ1801とクライアント1811〜クライアント1814とが通信可能なネットワークであり、たとえば、LAN、WAN、インターネット、携帯電話網などを含む。
クライアント1811はノート型PC(Personal Computer)である。クライアント1812はデスクトップ型PC、クライアント1813は携帯電話機である。携帯電話機として、クライアント1813は、スマートフォンであってもよいし、PHS(Personal Handyphone System)であってもよい。クライアント1814はタブレット型端末である。
図18のサーバ1801、クライアント1811〜クライアント1814は、実施の形態で説明したマルチコアプロセッサシステムとして、本実施の形態にかかるレジスタ利用方法を実行する。たとえば、サーバ1801内の複数のCPUが、本実施の形態にかかるレジスタ利用方法を実行する。
以上説明したように、マルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラムによれば、スレッドが発行する同期命令に偏りがあることを取得し、同期通知を行うCPUのレジスタを他のCPUに共有させる共有方法を用いる。これにより、同期通知を行うCPUが速く実行し、通知を待つCPUの待ちが短くなるため、全体の処理性能が向上する。また、レジスタの共有元となるCPUに、同期通知が多いスレッドを割り当てると、待ち時間の粒度が大きくなるため、マルチコアプロセッサシステムは、DVFSの利用や、他のアプリを実行しやすくなる。
また、マルチコアプロセッサシステムは、スレッドが発行する同期命令に偏りがないことを取得し、CPUが自身のレジスタの値を更新する都度、他のCPUのレジスタに値を複写する複写方法を用いてもよい。これにより、マルチコアプロセッサシステムは、CPU間の性能差がなくなるため、同期待ち時間が減少し、CPUの処理能力を向上させることができる。
また、マルチコアプロセッサシステムは、少なくとも一つのスレッドについて、差分に基づいた値が所定値より大きいか否かを判断し、大きければ、共有方法を用いてもよい。これにより、マルチコアプロセッサシステムは、同期命令の偏りがあるスレッド群と偏りがないスレッド群を順次実行する場合でも、偏りがあるスレッドを実行する場合、レジスタの利用方法を共有方法に切り替えて、全体の処理能力を向上させることができる。
また、マルチコアプロセッサシステムは、少なくとも一つのスレッドについて、同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断し、差分値が所定値以下であれば、複写方法を用いてもよい。これにより、マルチコアプロセッサシステムは、同期命令の偏りがあるスレッド群と偏りがないスレッド群を順次実行する場合でも、偏りがないスレッドを実行する場合、レジスタの利用方法を複写方法に切り替えて、全体の処理能力を向上させることができる。
また、マルチコアプロセッサシステムは、スレッドがCPUに割り当てられるときに、差分に基づいた値が所定値より大きいか否かを判断してもよい。これにより、マルチコアプロセッサシステムは、スレッドが実行される前のタイミングで、利用方法を切り替えることができる。
また、マルチコアプロセッサシステムは、スレッドにて同期待ちが完了したことを検出した場合、同期通知数と同期待ち数を更新し、更新された同期通知数と同期待ち数の差分に基づいて、同期命令の偏りがあるか否かを判断してもよい。これにより、マルチコアプロセッサシステムは、スレッドの実行中であっても、より最適なレジスタ利用方法を用いることができる。
たとえば、スレッドの割当時には同期命令の偏りがあり、共有方法を用いて実行されていたスレッド群が、処理の前半部分にて、同期命令を全て発行し終えた場合、処理の後半部分は、複写方法を用いた方が処理能力を向上できる。マルチコアプロセッサシステムは、このようなスレッド群を実行する場合、同期待ちの完了を検出し、共有方法から複写方法に切り替えることで、常に共有方法にし続けた場合と比較して、より全体の処理能力を向上させることができる。
また、マルチコアプロセッサシステムは、共有方法を用いる場合、スレッドに関する同期通知数と同期待ち数の差の大きさに基づいて、レジスタの共有元となるCPUに割り当てるCPUを特定してもよい。これにより、マルチコアプロセッサシステムは、他のスレッドを待たせる割合が多いスレッドを、処理の高速なCPUに割り当てることができるため、他のスレッドの待ち時間が減少し、処理能力を向上させることができる。
なお、本実施の形態で説明したレジスタ利用方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本レジスタ利用プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本レジスタ利用プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得する取得手段と、
前記取得手段によって前記情報が取得された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する実行手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
(付記2)複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得する取得手段と、
前記取得手段によって前記情報が取得された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアにより前記スレッドを実行する実行手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
(付記3)複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する判断手段と、
前記判断手段によって前記値が前記所定値より大きいと判断された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する実行手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
(付記4)前記実行手段は、
前記判断手段によっていずれのスレッドについても前記値が前記所定値以下であると判断された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアにより前記スレッドを実行する、
ことを特徴とする付記3に記載のマルチコアプロセッサシステム。
(付記5)前記スレッドが前記複数のコアのいずれかのコアに割り当てられることを検出する検出手段をさらに備え、
前記判断手段は、
前記検出手段によって前記スレッドが割り当てられることが検出された場合、前記複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する、
ことを特徴とする付記3または4に記載のマルチコアプロセッサシステム。
(付記6)前記スレッドのうちいずれかのスレッドにて同期待ちが完了したことを検出する検出手段と、
前記検出手段によって前記いずれかのスレッドにて同期待ちが完了したことを検出した場合、前記スレッドに関する前記同期通知数と前記同期待ち数とを更新する更新手段と、をさらに備え、
前記判断手段は、
前記更新手段によって前記スレッドに関する前記同期通知数と前記同期待ち数とが更新された場合、前記複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する、
ことを特徴とする付記3または4に記載のマルチコアプロセッサシステム。
(付記7)前記実行手段が前記共有させることによって前記スレッドを実行する場合、前記複数のスレッドのうち前記スレッドに関する同期通知数と同期待ち数との差分に基づいて、スレッドを特定する特定手段と、
前記特定手段によって特定されたスレッドを、前記複数のコアのうちレジスタの共有元となるコアに割り当てる割当手段と、
をさらに備えることを特徴とする付記3、5、6のうちいずれか一つに記載のマルチコアプロセッサシステム。
(付記8)複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する、
処理を前記複数のコアのうち特定のコアが実行するレジスタ利用方法。
(付記9)複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアにより前記スレッドを実行する、
処理を前記複数のコアのうち特定のコアが実行するレジスタ利用方法。
(付記10)複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断し、
前記値が前記所定値より大きいと判断された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する、
処理を前記複数のコアのうち特定のコアが実行するレジスタ利用方法。
(付記11)複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアに前記スレッドを実行させる、
処理を前記複数のコアのうち特定のコアに実行させるレジスタ利用プログラム。
(付記12)複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアに前記スレッドを実行させる、
処理を前記複数のコアのうち特定のコアに実行させるレジスタ利用プログラム。
(付記13)複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断し、
前記値が前記所定値より大きいと判断された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアに前記スレッドを実行させる、
処理を前記複数のコアのうち特定のコアに実行させるレジスタ利用プログラム。