(57)【特許請求の範囲】
【請求項１】
複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得する取得手段と、
前記取得手段によって前記情報が取得された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する実行手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
【請求項２】
複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得する取得手段と、
前記取得手段によって前記情報が取得された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアにより前記スレッドを実行する実行手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
【請求項３】
複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する判断手段と、
前記判断手段によって前記値が前記所定値より大きいと判断された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する実行手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
【請求項４】
前記実行手段は、
前記判断手段によっていずれのスレッドについても前記値が前記所定値以下であると判断された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアにより前記スレッドを実行する、
ことを特徴とする請求項３に記載のマルチコアプロセッサシステム。
【請求項５】
前記スレッドが前記複数のコアのいずれかのコアに割り当てられることを検出する検出手段をさらに備え、
前記判断手段は、
前記検出手段によって前記スレッドが割り当てられることが検出された場合、前記複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する、
ことを特徴とする請求項３または４に記載のマルチコアプロセッサシステム。
【請求項６】
前記スレッドのうちいずれかのスレッドにて同期待ちが完了したことを検出する検出手段と、
前記検出手段によって前記いずれかのスレッドにて同期待ちが完了したことを検出した場合、前記スレッドに関する前記同期通知数と前記同期待ち数とを更新する更新手段と、をさらに備え、
前記判断手段は、
前記更新手段によって前記スレッドに関する前記同期通知数と前記同期待ち数とが更新された場合、前記複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する、
ことを特徴とする請求項３または４に記載のマルチコアプロセッサシステム。
【請求項７】
前記実行手段が前記共有させることによって前記スレッドを実行する場合、前記複数のスレッドのうち前記スレッドに関する同期通知数と同期待ち数との差分に基づいて、スレッドを特定する特定手段と、
前記特定手段によって特定されたスレッドを、前記複数のコアのうちレジスタの共有元となるコアに割り当てる割当手段と、
をさらに備えることを特徴とする請求項３、５、６のうちいずれか一つに記載のマルチコアプロセッサシステム。
【請求項８】
複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する、
処理を前記複数のコアのうち特定のコアが実行するレジスタ利用方法。
【請求項９】
複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアに前記スレッドを実行させる、
処理を前記複数のコアのうち特定のコアに実行させるレジスタ利用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、レジスタの利用方法に関するマルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラムに関する。
【背景技術】
【０００２】
近年、１つのシステム内に、複数のコアを有するマルチコアプロセッサシステムの形態を採用する機器が増加している。また、複数のコアを利用して、アプリケーションソフトウェア（以下、「アプリ」と称す）を複数のスレッドに分割し、スレッド単位での並列を行うことで、マルチコアプロセッサシステムは、単一のコアで処理を実行する場合より高速処理を可能にしている。なお、スレッドとはプログラムの実行単位である。
【０００３】
また、スレッドの処理量を細かくし、細粒度並列性を用いることで、マルチコアプロセッサシステムは、スレッド単位の並列処理の性能を向上できる。このとき、細粒度スレッドは、各スレッド間でレジスタを共有しながら実行する。レジスタを共有する場合の処理コードとして、たとえば、レジスタから値を読み込むスレッドは、同期待ちを行い、レジスタの値を書き込むスレッドは、同期待ちスレッドに対して同期通知を行う。レジスタを共有する技術として、たとえば、コアが自身の内部レジスタを使用せずに他コアの内部レジスタを利用する方法を用いて、各スレッドを実行するものがある。また、各ＣＰＵが自身のレジスタに値を書き込むと、他のプロセッサのレジスタに値を書き込む技術が開示されている（たとえば、下記特許文献１、２を参照。）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平６−２３１０８５号公報
【特許文献２】特開２００３−９９２４９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上述した従来技術において、各スレッドは同期通知の回数と同期待ちの回数が偏っていたり、または均等であったりし、レジスタを共有する技術によって処理能力がコアごとで異なるため、コア全体の処理能力が低下してしまう問題がある。
【０００６】
本発明は、上述した従来技術による問題点を解消するため、処理能力が向上できるマルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得し、情報が取得された場合、複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、複数のコアにより各スレッドを実行するマルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラムが提案される。
【０００８】
また、本発明の他の側面によれば、複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得し、情報が取得された場合、複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、複数のコアによりスレッドを実行するマルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラムが提案される。
【０００９】
また、本発明の他の側面によれば、複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断し、値が所定値より大きいと判断された場合、複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、複数のコアにより各スレッドを実行するマルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラムが提案される。
【発明の効果】
【００１０】
本発明の一側面によれば、処理能力の向上を図ることができるという効果を奏する。
【図面の簡単な説明】
【００１１】
【図１】図１は、同期通知数と同期待ち数に偏りがあるスレッドの割当例を示す説明図である。
【図２】図２は、同期通知数と同期待ち数に偏りがないスレッドの割当例を示す説明図である。
【図３】図３は、マルチコアプロセッサシステムのハードウェア例を示すブロック図である。
【図４】図４は、同期命令の種別の一例についての説明図である。
【図５】図５は、マルチコアプロセッサシステムの機能例を示すブロック図である。
【図６】図６は、プロファイル情報の記憶内容の一例を示す説明図である。
【図７】図７は、同期命令に偏りがあるスレッドの実行結果の一例を示す説明図である。
【図８】図８は、同期命令に偏りがないスレッドの実行結果の一例を示す説明図である。
【図９】図９は、レジスタ値共有方法の判断方法の一例を示す説明図である。
【図１０】図１０は、第１のスレッド群の前提条件の一例を示す説明図である。
【図１１】図１１は、共有方法、または複写方法を用いて第１のスレッド群を実行した場合の結果の一例を示す説明図である。
【図１２】図１２は、第２のスレッド群の前提条件の一例を示す説明図である。
【図１３】図１３は、共有方法、または複写方法を用いて第２のスレッド群を実行した場合の結果の一例を示す説明図である。
【図１４】図１４は、第３のスレッド群の前提条件の一例を示す説明図である。
【図１５】図１５は、共有方法、または複写方法を用いて第３のスレッド群を実行した場合の結果の一例を示す説明図である。
【図１６】図１６は、レジスタ利用処理の一例を示すフローチャートである。
【図１７】図１７は、レジスタ利用処理の他の例を示すフローチャートである。
【図１８】図１８は、本実施の形態にかかるコンピュータを用いたシステムの適用例を示す説明図である。
【発明を実施するための形態】
【００１２】
以下に添付図面を参照して、開示のマルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラムの実施の形態を詳細に説明する。
【００１３】
図１は、同期通知数と同期待ち数に偏りがあるスレッドの割当例を示す説明図である。図１で示すマルチコアプロセッサシステム１００は、複数のＣＰＵとして、ＣＰＵ＃０〜ＣＰＵ＃２を含み、バス１０１で接続されている。また、ＣＰＵ＃０〜ＣＰＵ＃２は、レジスタＲ０〜レジスタＲ４を有し、レジスタＩ／Ｆ１０２＃０〜レジスタＩ／Ｆ１０２＃２の制御によってＣＰＵ＃０〜ＣＰＵ＃２の各レジスタの値を共有する。
【００１４】
始めに、ＣＰＵ＃０は、ＣＰＵ＃０〜ＣＰＵ＃２に割り当てられるスレッドＡ＿０〜スレッドＡ＿２に関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得する。同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を、以下の記述では、同期命令に偏りがあることを示す情報と呼称する。このとき、スレッドＡ＿０〜スレッドＡ＿２は、細粒度並列処理を行うことを前提としており、ＣＰＵ＃０〜ＣＰＵ＃２のレジスタ値を共有することが要求される。
【００１５】
同期通知数とは、同期命令のうちの同期通知を実行する回数であり、同期待ち数とは、同期命令のうちの同期待ちを実行する回数である。なお、同期命令の詳細については、図４にて説明する。また、所定値の具体的な値については、図９にて後述する。
【００１６】
スレッドＡ＿０に関して、スレッドＡ＿０の同期通知数が６であり、同期待ち数が０となることから、差分が６となり、さらに、所定値が３であれば、差分が所定値より大きくなるため、ＣＰＵ＃０は、同期命令に偏りがあることを示す情報を取得する。続けて、ＣＰＵ＃０は、ＣＰＵ＃０のレジスタを共有元として、ＣＰＵ＃１、ＣＰＵ＃２がレジスタＩ／Ｆ１０２を通してＣＰＵ＃０のレジスタにアクセスするようにレジスタＩ／Ｆ１０２＃０〜レジスタＩ／Ｆ１０２＃２に通知する。
【００１７】
このように、マルチコアプロセッサシステム１００は、ＣＰＵ＃０〜ＣＰＵ＃２のうち同期通知を実行するＣＰＵ＃０のレジスタをＣＰＵ＃１とＣＰＵ＃２に共有させることにより、ＣＰＵ＃０〜ＣＰＵ＃２にてスレッドＡ＿０〜スレッドＡ＿２を実行する。以下、図１で示したレジスタの利用方法を、共有方法と呼称する。共有方法にて、共有元となるＣＰＵの処理は、自身のレジスタにアクセスするため速くなり、他のＣＰＵは、バス１０１を介して共有元となるＣＰＵにアクセスするため遅くなる。
【００１８】
図１の状態では、同期通知を行うＣＰＵ＃０の処理が高速となるため、同期待ちを行うＣＰＵ＃１、ＣＰＵ＃２の待ち時間が減少し、ＣＰＵ＃０〜ＣＰＵ＃２全体の利用効率が向上する。
【００１９】
図２は、同期通知数と同期待ち数に偏りがないスレッドの割当例を示す説明図である。図２で示すマルチコアプロセッサシステム１００にて、ＣＰＵ＃０は、ＣＰＵ＃０〜ＣＰＵ＃２に割り当てられるスレッドＢ＿０〜スレッドＢ＿２に関する同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得する。同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を、以下の記述では、同期命令に偏りがないことを示す情報と呼称する。このとき、スレッドＢ＿０〜スレッドＢ＿２は、細粒度並列処理を行うことを前提としており、ＣＰＵ＃０〜ＣＰＵ＃２のレジスタ値を共有することが要求される。
【００２０】
スレッドＢ＿０の同期通知数が３であり、同期待ち数が３となることから、差分が０となり、さらに、所定値が３であれば、差分が所定値以下となるため、ＣＰＵ＃０は、同期命令に偏りがないことを示す情報を取得する。また、ＣＰＵ＃０は、スレッドＢ＿１、スレッドＢ＿２に関する同期命令に偏りがないことを示す情報を取得する。続けて、ＣＰＵ＃０は、各ＣＰＵが自身のレジスタの値が更新される都度、他のＣＰＵのレジスタに複写するように、レジスタＩ／Ｆ１０２＃０〜レジスタＩ／Ｆ１０２＃２に通知する。
【００２１】
このように、マルチコアプロセッサシステム１００は、ＣＰＵ＃０〜ＣＰＵ＃２のうちいずれかのＣＰＵのレジスタの値が更新される都度、他のＣＰＵのレジスタに複写することにより、ＣＰＵ＃０〜ＣＰＵ＃２にてスレッドＢ＿０〜スレッドＢ＿２を実行する。以下、図２で示したレジスタの利用方法を、複写方法と呼称する。複写方法では、レジスタの読込時には、複写が発生しないため、高速に処理が行え、レジスタ書き込み時には、複写が発生するため、処理は遅くなる。また、複写方法では、各ＣＰＵの処理能力は同一となる。
【００２２】
図２の状態では、同期命令に偏りがない状態で、各ＣＰＵの処理能力が同一であるため、同期待ち時間が減少し、結果、全体での利用効率を向上することができる。図１、図２で示したように、マルチコアプロセッサシステム１００は、スレッドに同期命令の偏りがある場合、ＣＰＵの処理能力に偏りのある共有方法を用い、スレッドに同期命令の偏りがない場合、ＣＰＵの処理能力に偏りのない複写方法を用いる。このように、各スレッドの同期命令の偏りと、各ＣＰＵの処理能力の偏りを一致させることで、全体の処理能力を向上することができる。以下、図１、図２で示したように動作するマルチコアプロセッサシステム１００について、図３〜図１８を用いて説明する。
【００２３】
（マルチコアプロセッサシステム１００のハードウェア）
図３は、マルチコアプロセッサシステムのハードウェア例を示すブロック図である。本実施の形態におけるマルチコアプロセッサシステム１００は、携帯電話などの携帯端末を想定している。図３において、マルチコアプロセッサシステム１００は、ＣＰＵｓ３０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）３０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３０３と、を含む。また、マルチコアプロセッサシステム１００は、フラッシュＲＯＭ３０４と、フラッシュＲＯＭコントローラ３０５と、フラッシュＲＯＭ３０６と、を含む。また、マルチコアプロセッサシステム１００は、ユーザやその他の機器との入出力装置として、ディスプレイ３０７と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）３０８と、キーボード３０９と、を含む。また、各部はバス１０１によってそれぞれ接続されている。
【００２４】
ここで、ＣＰＵｓ３０１は、マルチコアプロセッサシステム１００の全体の制御を司る。ＣＰＵｓ３０１は、ＣＰＵ＃０〜ＣＰＵ＃２を含む。また、マルチコアプロセッサシステム１００に含まれるＣＰＵは、２つ以上であればよい。また、ＣＰＵｓ３０１は、専用のキャッシュメモリを有してもよい。また、マルチコアプロセッサシステム１００は、複数のコアを含むマルチコアプロセッサシステムであってもよい。なお、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、シングルコアのプロセッサであるＣＰＵが並列されている形態を例にあげて説明する。
【００２５】
ＲＯＭ３０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ３０３は、ＣＰＵｓ３０１のワークエリアとして使用される。フラッシュＲＯＭ３０４は、読出し速度が高速なフラッシュＲＯＭであり、たとえば、ＮＯＲ型フラッシュメモリである。たとえば、フラッシュＲＯＭ３０４は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）などのシステムソフトウェアやアプリなどを記憶している。たとえば、ＯＳを更新する場合、マルチコアプロセッサシステム１００は、Ｉ／Ｆ３０８によって新しいＯＳを受信し、フラッシュＲＯＭ３０４に格納されている古いＯＳを、受信した新しいＯＳに更新する。
【００２６】
フラッシュＲＯＭコントローラ３０５は、ＣＰＵｓ３０１の制御に従ってフラッシュＲＯＭ３０６に対するデータのリード／ライトを制御する。フラッシュＲＯＭ３０６は、データの保存、運搬を主に目的としたフラッシュＲＯＭであり、たとえば、ＮＡＮＤ型フラッシュメモリである。フラッシュＲＯＭ３０６は、フラッシュＲＯＭコントローラ３０５の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム１００を使用するユーザがＩ／Ｆ３０８を通して取得した画像データ、映像データや、また本実施の形態にかかるレジスタ利用方法を実行するプログラムなどである。フラッシュＲＯＭ３０６は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００２７】
ディスプレイ３０７は、カーソル、アイコンあるいはツールボックスを始め、文書、画像、機能情報などのデータを表示する。ディスプレイ３０７は、たとえば、ＴＦＴ（Ｔｈｉｎ  Ｆｉｌｍ  Ｔｒａｎｓｉｓｔｏｒ）液晶ディスプレイなどを採用することができる。
【００２８】
Ｉ／Ｆ３０８は、通信回線を通じてＬＡＮ、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク３１０に接続され、ネットワーク３１０を介して他の装置に接続される。そして、Ｉ／Ｆ３０８は、ネットワーク３１０と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ３０８には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２９】
キーボード３０９は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード３０９は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００３０】
図４は、同期命令の種別の一例についての説明図である。符号４０１で示す図は、スレッドＡ＿０とスレッドＡ＿１の実行コードの一例を示しており、符号４０２で示す図は、スレッドＡ＿０とスレッドＡ＿１の実行結果を示しており、表４０３は、符号４０１、符号４０２から示される同期命令の特徴について示している。スレッドＡ＿０とスレッドＡ＿１にて、レジスタＲ１が共に使用されており、レジスタＲ１に対する書込と読込の順序が変更されないようにするため、同期命令が挿入されている。
【００３１】
なお、以下の説明において、実行コード内での同期命令の位置を同期ポイントと定義する。また、同期命令を実行可能な位置に到達した場合を、同期ポイントに到達したと呼称する。また、同期命令のうちバリア同期は、特定のグループに含まれるスレッドが全て同期ポイントに到着した際に、次の処理に進む機能を有する。この特定のグループのことを、同期グループと定義する。また、同期命令には、同期通知、同期待ち、バリア同期が存在する。
【００３２】
初めに、スレッドＡ＿０を実行するＣＰＵ＃０は、時刻ｔ０にて、先行命令として、レジスタＲ２とレジスタＲ３の和をレジスタＲ１に書き込み、時刻ｔ２にて同期通知であるｓｙｎｃｓ命令をＣＰＵ＃１を通知先として実行する。また、スレッドＡ＿１を実行する実行するＣＰＵ＃１は、時刻ｔ０にて、先行命令を実行し、時刻ｔ２より早い時刻である時刻ｔ１にて、同期待ちであるｓｙｎｃｒ命令をＣＰＵ＃０を通知元として実行する。時刻ｔ１では、ＣＰＵ＃０が同期ポイントに到達していないため、ＣＰＵ＃１は、同期通知を受け付けるまで待機する。同期通知を完了した時刻ｔ３にて、ＣＰＵ＃０は、後続命令を実行し、同時刻にて、ＣＰＵ＃１も、同期待ちを終了し、後続命令を実行する。
【００３３】
次に、ＣＰＵ＃０は、時刻ｔ４にて、バリア同期であるｓｙｎｃａ命令を実行する。時刻ｔ４の時点では、ＣＰＵ＃１が同期ポイントに到達していないため、ＣＰＵ＃０は、ＣＰＵ＃１が同期ポイントに到達するまで待機する。時刻ｔ５にて、ＣＰＵ＃１がｓｙｎｃａ命令を実行する。
【００３４】
このように、符号４０１、符号４０２で示したように、同期通知を含む一連の処理として、ＣＰＵは、先行命令が終了した後、同期通知を実行し、同期通知が終了した後に、後続命令を実行する。したがって、表４０３で示すように、同期通知を実行するＣＰＵは、同期待ち側を待たなくてよい。
【００３５】
同様に、同期待ちを含む一連の処理として、ＣＰＵは、先行命令が終了した後、同期待ちを実行し、同期通知を受け付けた後、後続命令を実行する。したがって、同期待ちを実行するＣＰＵは、既に同期通知を受け付けていれば、待たなくてよい。
【００３６】
同様に、バリア同期を含む一連の処理として、ＣＰＵは、先行命令が終了した後、同期グループに属するＣＰＵが全て同期ポイントに到達した場合、後続命令を実行する。したがって、バリア同期を実行するＣＰＵは、同一の同期グループに属する他のＣＰＵが同時に同期ポイントに到達すれば、待たなくてよい。
【００３７】
（マルチコアプロセッサシステム１００の機能）
次に、マルチコアプロセッサシステム１００の機能について説明する。図５は、マルチコアプロセッサシステムの機能例を示すブロック図である。マルチコアプロセッサシステム１００は、スケジューラ５０１と、レジスタ利用ライブラリ５０２と、ディスパッチャ５０３と、を有する。
【００３８】
また、マルチコアプロセッサシステム１００は、検出部５１１と、更新部５１２と、取得部５１３と、判断部５１４と、特定部５１５と、通知部５１６と、実行部５１７と、割当部５１８とを含む。制御部となる機能（検出部５１１〜割当部５１８）は、記憶装置に記憶されたプログラムをＣＰＵｓ３０１のうちのいずれかのＣＰＵが実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図３に示したＲＯＭ３０２、ＲＡＭ３０３、フラッシュＲＯＭ３０４、フラッシュＲＯＭ３０６などである。または、Ｉ／Ｆ３０８を経由して他のＣＰＵが実行することにより、その機能を実現してもよい。
【００３９】
また、図５では各機能部が、ＣＰＵ＃０の機能であるように図示しているが、ＣＰＵ＃１、ＣＰＵ＃２の機能であってもよい。また、検出部５１１〜通知部５１６は、レジスタ利用ライブラリ５０２の機能であり、実行部５１７は、レジスタＩ／Ｆ１０２の機能であり、割当部５１８は、ディスパッチャ５０３の機能である。
【００４０】
また、マルチコアプロセッサシステム１００は、プロファイル情報５２１にアクセス可能である。プロファイル情報５２１の詳細については、図６にて後述する。プロファイル情報５２１は、ＲＡＭ３０３、フラッシュＲＯＭ３０４、フラッシュＲＯＭ３０６等に存在する。
【００４１】
スケジューラ５０１は、マルチコアプロセッサシステム１００内で実行されるスレッドを各ＣＰＵに割り当て、次に実行するスレッドを選択する機能を有する。たとえば、スケジューラ５０１は、スレッドＡ＿０をＣＰＵ＃０に割り当て、スレッドＡ＿１をＣＰＵ＃１に割り当てる。
【００４２】
レジスタ利用ライブラリ５０２は、スケジューラ５０１からのスレッド割当通知を受け付けると、レジスタ共有方法のうち共有方法か複写方法のいずれかを用いるか、またはレジスタ共有を行わないか、ということをレジスタＩ／Ｆ１０２に通知する。また、レジスタ利用ライブラリ５０２は、ディスパッチャ５０３に、スレッドの割当に変更がない場合、スケジューラ５０１から受けたスレッド割当通知をそのまま通知し、変更がある場合、変更されたスレッド割当通知を通知する。
【００４３】
ディスパッチャ５０３は、現在動作中のスレッドに対して、スケジューラ５０１およびレジスタ利用ライブラリ５０２によって決定した次のスレッドに切り替える機能を有する。たとえば、ディスパッチャ５０３は、ＣＰＵ＃０で実行していたスレッドＡ＿０からスレッドＢ＿０に切り替える場合、スレッドＡ＿０のプログラムカウンタ等を含むレジスタ情報を退避する。退避後、ディスパッチャ５０３は退避されてあったスレッドＢ＿０のレジスタ情報を復帰する。復帰後、ディスパッチャ５０３は、スレッドＢ＿０の処理を前回の切り替えられた時点から継続することができる。
【００４４】
検出部５１１は、スレッドが複数のコアのいずれかのコアに割り当てられることを検出する機能を有する。たとえば、検出部５１１は、スレッドＡ＿０がＣＰＵ＃０に割り当てられることを検出する。
【００４５】
また、検出部５１１は、いずれかのスレッドにて同期待ちが完了したことを検出してもよい。たとえば、検出部５１１は、実行中のスレッドＡ＿１にて、同期待ちが完了したことを検出する。また、検出対象は、同期通知、バリア同期が含まれてもよい。なお、検出結果は、ＲＡＭ３０３、フラッシュＲＯＭ３０４、フラッシュＲＯＭ３０６などの記憶領域に記憶される。
【００４６】
更新部５１２は、検出部５１１によっていずれかのスレッドにて同期待ちが完了したことを検出した場合、スレッドに関する同期通知数と同期待ち数とを更新する機能を有する。たとえば、スレッドＡ＿０のプロファイル情報５２１が同期通知数：６、同期待ち数：０、スレッドＡ＿１のプロファイル情報５２１が同期通知数：０、同期待ち数：６とする。この状態から、さらに、たとえば、スレッドＡ＿０から発行された同期通知をスレッドＡ＿１にて同期待ちが完了したことを検出部５１１が検出した場合とする。このとき、更新部５１２は、スレッドＡ＿０のプロファイル情報５２１を、同期通知数：５、同期待ち数：０、スレッドＡ＿１のプロファイル情報５２１を、同期通知数：０、同期待ち数：５に更新する。
【００４７】
取得部５１３は、複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得する機能を有する。同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報とは、同期命令に偏りがあることを示す情報のことであり、同期命令に偏りがあることを示す情報は、プロファイル情報５２１に記録されている。プロファイル情報５２１には、同期命令に偏りがあることを示す識別子が格納されていてもよいし、同期通知数と同期待ち数の各値が格納されていてもよい。また、同期命令に偏りがあることを示す識別子は、マルチコアプロセッサシステム１００の設計者によって設定されていてもよい。
【００４８】
また、スレッドに関する同期命令に偏りがある情報とは、スレッド内のプログラムに記述された同期命令に偏りがあることを示す情報である。したがって、プロファイル情報５２１は、同期命令に偏りがあることを示す情報をスレッドごとに記憶する。たとえば、取得部５１３は、スレッドＡ＿０に関する同期命令に偏りがある情報を取得する。
【００４９】
また、取得部５１３は、複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得してもよい。同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報とは、同期命令に偏りがないことを示す情報のことであり、同期命令に偏りがないことを示す情報は、プロファイル情報５２１に記録されている。たとえば、プロファイル情報５２１には、同期命令に偏りがないことを示す識別子が格納されている。たとえば、取得部５１３は、スレッドＡ＿０〜スレッドＡ＿２のプロファイル情報５２１として、全てスレッドにて同期命令に偏りがないことを示す情報を取得する。なお、取得されたプロファイル情報５２１、または、プロファイル情報５２１へのポインタは、ＲＡＭ３０３、フラッシュＲＯＭ３０４、フラッシュＲＯＭ３０６などの記憶領域に記憶される。
【００５０】
判断部５１４は、複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する機能を有する。
【００５１】
具体的な判断方法として、たとえば、判断部５１４は、同期通知数と同期待ち数の差分の絶対値が所定値より大きいか否かを判断する。また、判断部５１４は、同期通知数と同期待ち数の差分の絶対値を、同期命令の総数で除した値が所定値より大きいか否かを判断してもよい。
【００５２】
また、判断部５１４は、検出部５１１によってスレッドが割り当てられることが検出された場合、または更新部５１２によってスレッドに関する偏りを示す情報が更新された場合に、差分に基づいた値が所定値より大きいか否かを判断してもよい。なお、判断結果は、ＲＡＭ３０３、フラッシュＲＯＭ３０４、フラッシュＲＯＭ３０６などの記憶領域に記憶される。
【００５３】
特定部５１５は、実行部５１７がレジスタを共有させることによりスレッドを実行する場合、スレッドに関する同期通知数と同期待ち数との差の大きさに基づいて、スレッドを特定する機能を有する。具体的な特定方法として、たとえば、特定部５１５は、同期通知数と同期待ち数の差分が最大となるスレッドを特定してもよい。または、特定部５１５は、同期通知数と同期待ち数の差が所定値以上となるスレッドのうちいずれかのスレッドを特定してもよい。または、特定部５１５は、同期通知数と同期待ち数の差を同期命令の総数で除した値が最大となるスレッドを特定してもよい。なお、特定されたスレッドの情報は、ＲＡＭ３０３、フラッシュＲＯＭ３０４、フラッシュＲＯＭ３０６などの記憶領域に記憶される。
【００５４】
通知部５１６は、取得部５１３によって差分に基づいた値が所定値より大きいことを示す情報が取得された場合、複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させる共有方法を用いることをレジスタＩ／Ｆ１０２に通知する機能を有する。また、通知部５１６は、判断部５１４によって差分に基づいた値が所定値より大きいと判断された場合に、共有方法を用いることを通知してもよい。また、通知部５１６は、特定部５１５によって特定されたスレッドを、複数のコアのうちレジスタの共有元となるコアに割り当てるように割当部５１８に通知してもよい。
【００５５】
また、通知部５１６は、取得部５１３によって同期命令に偏りがないというプロファイル情報５２１が取得された場合、複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写する複写方法を用いることを通知してもよい。また、通知部５１６は、判断部５１４によっていずれのスレッドについても同期命令に偏りがないと判断された場合に、複写方法を用いることを通知してもよい。
【００５６】
実行部５１７は、通知部５１６から通知された共有方法を用いるか、または複写方法を用いるか、という指示に従って、複数のコアによりスレッドを実行する機能を有する。たとえば、実行部５１７は、共有方法として、複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、スレッドＡ＿０〜スレッドＡ＿２を実行する。また、実行部５１７は、複写方法として、複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、スレッドＢ＿０〜スレッドＢ＿２を実行する。
【００５７】
割当部５１８は、通知部５１６から通知された、特定されたスレッドをレジスタの共有元となるコアに割り当てる機能を有する。たとえば、割当部５１８は、スレッドＡ＿０を、レジスタの共有元となるＣＰＵ＃０に割り当てる。
【００５８】
図６は、プロファイル情報の記憶内容の一例を示す説明図である。図６で示すプロファイル情報５２１は、レコード５２１−１〜レコード５２１−９を登録している。プロファイル情報５２１は、スレッドＩＤ、同期命令の総数、同期通知数、同期待ち数、バリア同期数という５つのフィールドを含む。スレッドＩＤフィールドには、対象スレッドを一意に識別する情報が格納される。同期命令の総数フィールドには、対象スレッド内にある同期通知、同期待ち、バリア同期の総数が格納される。同期通知数フィールドには、対象スレッド内にある同期通知数が格納される。同期待ち数フィールドには、対象スレッド内にある同期待ち数が格納される。バリア同期数フィールドには、対象スレッド内にあるバリア同期数が格納される。
【００５９】
たとえば、レコード５２１−１は、同期命令の総数が６であり、同期通知数が６であり、同期待ち数とバリア同期数が０であることを示している。なお、プロファイル情報５２１は、開発者がプログラムを作成したときに生成してもよいし、スレッド実行前に、ＯＳがスレッドのバイナリプログラムを解析して生成してもよい。
【００６０】
図７は、同期命令に偏りがあるスレッドの実行結果の一例を示す説明図である。符号７０１で示す図は、共有方法を実行しているマルチコアプロセッサシステム１００が、レジスタの共有元となるＣＰＵ＃０に、同期待ちが多いスレッドＡ＿１を割り当て、ＣＰＵ＃１に、同期通知が多いスレッドＡ＿０を割り当てている。また、符号７０２で示す図は、共有方法を実行しているマルチコアプロセッサシステム１００が、レジスタの共有元となるＣＰＵ＃０に、スレッドＡ＿０を割り当て、ＣＰＵ＃１に、スレッドＡ＿１を割り当てている。
【００６１】
初めに、符号７０１におけるＣＰＵ＃０は、レジスタの共有元であるため、処理が早く完了し、スレッドＡ＿０からの同期通知を待つことになる。たとえば、ＣＰＵ＃０は、スレッドＡ＿１の処理番号｛１｝を終了した後、ＣＰＵ＃１によるスレッドＡ＿０の処理番号２からの同期通知を待つことになる。処理番号｛３｝、処理番号｛５｝でも同様な現象が発生する。このように、レジスタの共有元となるＣＰＵに、同期待ちが多いスレッドを割り当てると、待ち時間の粒度が小さくなる。
【００６２】
次に、符号７０２におけるＣＰＵ＃０は、レジスタの共有元であるため、処理が早く完了し、処理番号｛２｝、｛４｝、｛６｝にて、同期通知をＣＰＵ＃１に通知し、待ちとなる。このように、レジスタの共有元となるＣＰＵに、同期通知が多いスレッドを割り当てると、待ち時間の粒度が大きくなる。待ち時間の粒度が大きくなると、ＤＶＦＳ（Ｄｙｎａｍｉｃ  Ｖｏｌｔａｇｅ  ａｎｄ  Ｆｒｅｑｕｅｎｃｙ  Ｓｃａｌｉｎｇ）が利用しやすくなり、また、他のアプリの処理を実行しやすくなる。理由として、ＤＶＦＳは、適用が可能な最小時間が存在するため、待ち時間の粒度が小さいと、ＤＶＦＳの適用ができない場合が存在するためである。また、他プロセスの処理に関しては、待ち時間の粒度が小さいと、他プロセスに切り替えるオーバヘッドが増大するためである。
【００６３】
図８は、同期命令に偏りがないスレッドの実行結果の一例を示す説明図である。符号８０１で示す図は、共有方法を実行しているマルチコアプロセッサシステム１００が、レジスタの共有元となるＣＰＵ＃０に、同期命令に偏りがないスレッドＢ＿１を割り当て、ＣＰＵ＃１に、同期命令に偏りがないスレッドＢ＿０を割り当てている。また、符号８０２で示す図は、複写方法を実行しているマルチコアプロセッサシステム１００が、ＣＰＵ＃０に、スレッドＢ＿１を割り当て、ＣＰＵ＃１に、スレッドＢ＿０を割り当てている。
【００６４】
初めに、符号８０１におけるＣＰＵ＃０は、レジスタの共有元であるため、処理が早く完了し、スレッドＢ＿０からの同期通知を待つことになる。たとえば、ＣＰＵ＃０は、スレッドＢ＿０の処理番号｛１｝を終了した後、ＣＰＵ＃１によるスレッドＢ＿０の処理番号｛２｝からの同期通知を待つことになる。処理番号｛５｝でも同様な現象が発生する。
【００６５】
次に、符号８０２におけるＣＰＵ＃０とＣＰＵ＃１は、複写方法であるため、処理速度が同一となるため、同期待ちを行う時間が符号８０１で示す図に比べて短くなる。このように、同期命令に偏りがない場合、複写方法を用いてスレッドを実行することで、ＣＰＵの性能差がなくなり、同期待ち時間が減少するため、マルチコアプロセッサシステム１００は、プロセッサの利用効率を向上できる。
【００６６】
図９は、レジスタ値共有方法の判断方法の一例を示す説明図である。図９では、レジスタ値共有方法として利用する方法の判断方法について、共有方法、複写方法のいずれを用いるかの判断方法について説明する。
【００６７】
マルチコアプロセッサシステム１００は、スレッド群のうち、下記（１）式が満たすスレッドが一つ以上ある場合、共有方法を用いる。
【００６８】
｜（同期通知数−同期待ち数）／同期命令の総数｜＞α  …（１）
【００６９】
ここで、｜ｘ｜はｘの絶対値を意味しており、αは定数である。図１、図２で示した所定値は、たとえばαとなる。たとえば、α＝０．４である。また、マルチコアプロセッサシステム１００は、下記（２）式が満たされる場合、複写方法を用いる。
【００７０】
バリア同期数／同期命令の総数＞β  …（２）
【００７１】
ここで、βは定数である。たとえば、β＝０．５である。また、マルチコアプロセッサシステム１００は、共有方法を用いると判断された場合、スレッドごとに下記（３）式で示す評価式を実行し、最も大きい値となったスレッドを、レジスタの共有元になるＣＰＵに割り当てる。
【００７２】
（同期通知数−同期待ち数）／同期命令の総数  …（３）
【００７３】
また、マルチコアプロセッサシステム１００は、（１）式が満たされた場合に共有方法を用い、（１）式が満たされない場合に複写方法を用いてもよい。また、あるスレッドが（１）式を満たし、他のスレッドが（２）式を満たした場合、マルチコアプロセッサシステム１００は、共有方法を用いる。
【００７４】
以下、図９で示したレジスタ値共有方法の判断方法を実行して、第１のスレッド群〜第３のスレッド群の実行結果を図１０〜図１５にて説明する。スレッド群は、たとえば、それぞれ異なるアプリに属しているとする。たとえば、第１のスレッド群がアプリ１に属し、第２のスレッド群がアプリ２に属し、第３のスレッド群がアプリ３に属している。
【００７５】
また、第１のスレッド群は、同期命令に偏りがあるスレッド群を想定しており、たとえば、図６で示したスレッドＡ＿０〜スレッドＡ＿２である。第２のスレッド群は、同期命令に偏りがないスレッド群を想定しており、たとえば、図６で示したスレッドＢ＿０〜スレッドＢ＿２である。第３のスレッド群は、同期命令に偏りがあるスレッドと、同期命令に偏りがないスレッドが混在している場合を想定しており、たとえば、図６で示したスレッドＣ＿０〜スレッドＣ＿２である。
【００７６】
図１０は、第１のスレッド群の前提条件の一例を示す説明図である。表１００１には、共有方法でのＣＰＵの処理能力と、複写方法でのＣＰＵの処理能力を示しており、前提条件１００２では、第１のスレッド群となるスレッドＡ＿０〜スレッドＡ＿２の処理量と、同期通知および同期待ちの詳細について示している。また、表１００３は、スレッドＡ＿０〜スレッドＡ＿２に関する式（１）〜式（３）の算出結果を示している。なお、図１０におけるスレッドＡ＿０〜スレッドＡ＿２のプロファイル情報５２１としては、図６で示した値と同一である。
【００７７】
表１００１に示すように、たとえば、共有方法にて自身のレジスタにアクセスするＣＰＵの処理能力を３００［命令数／ｕｓ］であるとし、共有方法にて他のＣＰＵのレジスタにアクセスするＣＰＵの処理能力を１００［命令数／ｕｓ］であるとする。また、複写方法のＣＰＵの処理能力を１５０［命令数／ｕｓ］であるとする。
【００７８】
また、前提条件１００２では、たとえば、スレッドＡ＿０の処理番号｛１｝は、処理量が６００［命令数］であり、処理番号｛５｝へ同期通知を送信する。続けて、スレッドＡ＿０は、処理番号｛４｝、｛７｝、｛１０｝、｛１３｝、｛１４｝の順で処理を行う。また、スレッドＡ＿１の処理番号｛２｝は、処理量４５０［命令数］であり、同期命令は行わない。続けて、スレッドＡ＿１は、処理番号｛５｝、｛８｝、｛１１｝の順で処理を行う。また、スレッドＡ＿２の処理番号｛３｝は、処理量６００［命令数］であり、同期命令は行わない。続けて、スレッドＡ＿２は、処理番号｛６｝、｛９｝、｛１２｝の順で処理を行う。
【００７９】
また、表１００３で示すように、マルチコアプロセッサシステム１００は、スレッドＡ＿０〜スレッドＡ＿２に対して、（１）式、（２）式を実行する。たとえば、スレッドＡに対する（１）式は、以下のように実行される。
【００８０】
｜（６−０）／６｜＝１＞０．４
【００８１】
このように、スレッドＡ＿０は（１）式を満たしている。同様に、スレッドＡ＿０に対する（２）式、スレッドＡ＿１、スレッドＡ＿２に対する（１）式、（２）式を算出する。（１）式の算出結果について、スレッドＡ＿０〜スレッドＡ＿２全てが（１）式を満たしたため、マルチコアプロセッサシステム１００は、共有方法を用いる。また、マルチコアプロセッサシステム１００は、（３）式を実行し、（３）式の算出結果より、スレッドＡ＿０が最も大きい値となるため、スレッドＡ＿０をＣＰＵ＃０に割り当てる。
【００８２】
図１１は、共有方法、または複写方法を用いて第１のスレッド群を実行した場合の結果の一例を示す説明図である。図１１の例では、タイムチャート１１０１は、図１０で判断したように、共有方法を用い、スレッドＡ＿０をＣＰＵ＃０に割り当てた場合の結果を示している。また、比較として、タイムチャート１１０２は、共有方法を用い、スレッドＡ＿０をＣＰＵ＃２に割り当てた場合の結果を示している。同様に、タイムチャート１１０３は、複写方法を用いた場合の結果を示している。なお、各処理にかかる時間は、前提条件１００２にて示した処理量を、表１００１で示した処理能力で除算した結果である。
【００８３】
タイムチャート１１０１にて、スレッドＡ＿０を実行するＣＰＵ＃０は、処理番号｛１｝、｛４｝、｛７｝、｛１０｝、｛１３｝、｛１４｝を実行し、１１．５［ｕｓ］に処理を終了する。また、スレッドＡ＿１を実行するＣＰＵ＃１は、処理番号｛２｝、｛５｝、｛８｝、｛１１｝を実行し、１９．５［ｕｓ］に処理を終了する。同様に、スレッドＡ＿２を実行するＣＰＵ＃２は、処理番号｛３｝、｛６｝、｛９｝、｛１２｝を実行し、１９．５［ｕｓ］に処理を終了する。
【００８４】
タイムチャート１１０２にて、スレッドＡ＿０を実行するＣＰＵ＃２は、図示していないが、３４．５［ｕｓ］に処理を終了する。タイムチャート１１０１の結果と比較すると、タイムチャート１１０２ではスレッドＡ＿０の処理に時間がかかり、結果、通知待ちを行うスレッドＡ＿１、スレッドＡ＿２の処理にも時間がかかるようになってしまっている。また、スレッドＡ＿２を実行するＣＰＵ＃０は、たとえば、２［ｕｓ］から１２［ｕｓ］まで待ち時間が発生してしまっている。
【００８５】
タイムチャート１１０３にて、スレッドＡ＿０を実行するＣＰＵ＃０は、２３［ｕｓ］に処理を終了する。スレッドＡ＿１を実行するＣＰＵ＃１は、２２［ｕｓ］に処理を終了し、スレッドＡ＿２を実行するＣＰＵ＃２は、２６［ｕｓ］に処理を終了する。タイムチャート１１０１の結果と比較すると、タイムチャート１１０３ではスレッドＡ＿０の処理に時間がかかっている。また、ＣＰＵ＃１、ＣＰＵ＃２は、同期待ちの時間が細切れに発生してしまっている。たとえば、ＣＰＵ＃１では、３［ｕｓ］〜４［ｕｓ］、８［ｕｓ］〜１１［ｕｓ］といった細かい時間で待ちが発生しており、ＣＰＵ＃２では、４［ｕｓ］〜８［ｕｓ］、１１［ｕｓ］〜１５［ｕｓ］といった時間で待ちが発生している。
【００８６】
図１２は、第２のスレッド群の前提条件の一例を示す説明図である。表１００１には、共有方法でのＣＰＵの処理能力と、複写方法でのＣＰＵの処理能力を示しており、前提条件１２０１では、第２のスレッド群となるスレッドＢ＿０〜スレッドＢ＿２の処理量と、同期通知および同期待ちの詳細について示している。また、表１２０２は、スレッドＢ＿０〜スレッドＢ＿２に関する式（１）〜式（３）の算出結果を示している。なお、図１２におけるスレッドＢ＿０〜スレッドＢ＿２のプロファイル情報５２１は、図６で示した値と同一である。なお、表１００１は図１０で説明した値と同一であるため、説明を省略する。
【００８７】
前提条件１２０１で示すように、たとえば、スレッドＢ＿０の処理番号｛１｝は、処理量が６００［命令数］であり、処理番号｛５｝へ同期通知を送信する。次に、スレッドＢ＿０の処理番号｛４｝は、処理量が４５０［命令数］であり、処理番号｛３｝からの同期待ちを行い、処理番号｛８｝へ同期通知を送信する。続けて、スレッドＢ＿０は、処理番号｛７｝、｛１０｝の順で処理を行う。また、スレッドＢ＿１の処理番号｛２｝は、処理量４５０［命令数］であり、処理番号｛６｝へ同期通知を送信する。続けて、スレッドＢ＿１は、処理番号｛５｝、｛８｝、｛１１｝の順で処理を行う。また、スレッドＢ＿２の処理番号｛３｝は、処理量６００［命令数］であり、処理番号｛４｝へ同期通知を送信する。続けて、スレッドＢ＿２は、処理番号｛６｝、｛９｝、｛１２｝の順で処理を行う。
【００８８】
また、表１２０２で示すように、マルチコアプロセッサシステム１００は、スレッドＢ＿０〜スレッドＢ＿２に対して、（１）式、（２）式を実行する。（１）式の算出結果について、スレッドＢ＿０〜スレッドＢ＿２全てが（１）式を満たさないため、マルチコアプロセッサシステム１００は、複写方法を用いる。
【００８９】
図１３は、共有方法、または複写方法を用いて第２のスレッド群を実行した場合の結果の一例を示す説明図である。図１３の例では、タイムチャート１３０１は、図１２で判断したように、複写方法を用いた場合の結果を示している。また、比較として、タイムチャート１３０２は、共有方法を用いた場合の結果を示している。
【００９０】
タイムチャート１３０１にて、スレッドＢ＿０を実行するＣＰＵ＃０は、処理番号｛１｝、｛４｝、｛７｝、｛１０｝を実行し、１６［ｕｓ］に処理を終了する。また、スレッドＢ＿１を実行するＣＰＵ＃１は、処理番号｛２｝、｛５｝、｛８｝、｛１１｝を実行し、１６［ｕｓ］に処理を終了する。同様に、スレッドＢ＿２を実行するＣＰＵ＃２は、処理番号｛３｝、｛６｝、｛９｝、｛１２｝を実行し、１５［ｕｓ］に処理を終了する。
【００９１】
タイムチャート１３０２にて、スレッドＢ＿０を実行するＣＰＵ＃０は、２０［ｕｓ］に処理を終了する。また、スレッドＢ＿１を実行するＣＰＵ＃１は、２１［ｕｓ］に処理を終了する。また、スレッドＢ＿２を実行するＣＰＵ＃２は、２２．５［ｕｓ］に処理を終了する。タイムチャート１３０１の結果と比較すると、タイムチャート１３０２ではスレッドＢ＿１、スレッドＢ＿２の処理に時間がかかるようになってしまっている。
【００９２】
図１４は、第３のスレッド群の前提条件の一例を示す説明図である。表１００１には、共有方法でのＣＰＵの処理能力と、複写方法でのＣＰＵの処理能力を示しており、前提条件１４０１には、第３のスレッド群となるスレッドＣ＿０〜スレッドＣ＿２の処理量と、同期通知および同期待ちの詳細について示している。また、表１４０２は、スレッドＣ＿０〜スレッドＣ＿２に関する式（１）〜式（３）の算出結果を示している。なお、図１４におけるスレッドＣ＿０〜スレッドＣ＿２のプロファイル情報５２１は、図６で示した値と同一である。なお、表１００１は図１０で説明した値と同一であるため、説明を省略する。
【００９３】
前提条件１４０１で示した図のように、たとえば、スレッドＣ＿０の処理番号｛１｝は、処理量が６００［命令数］であり、処理番号｛５｝へ同期通知を送信し、処理番号｛４｝は、処理量が６００［命令数］であり、処理番号｛６｝へ同期通知を送信する。また、スレッドＣ＿１の処理番号｛２｝は、処理量４５０［命令数］であり、同期処理は行わない。また、スレッドＢ＿２の処理番号｛３｝は、処理量６００［命令数］であり、処理番号｛５｝へ同期通知を送信する。
【００９４】
また、表１４０２で示すように、マルチコアプロセッサシステム１００は、スレッドＣ＿０〜スレッドＣ＿２に対して、（１）式、（２）式を実行する。（１）式の算出結果について、スレッドＣ＿０、スレッドＣ＿１が（１）式を満たしたため、マルチコアプロセッサシステム１００は、共有方法を用いる。また、マルチコアプロセッサシステム１００は、（３）式を実行し、（３）式の算出結果より、スレッドＣ＿０が最も大きい値となるため、スレッドＣ＿０をＣＰＵ＃０に割り当てる。
【００９５】
図１５は、共有方法、または複写方法を用いて第３のスレッド群を実行した場合の結果の一例を示す説明図である。図１５の例では、タイムチャート１５０１は、図１４で判断したように、共有方法を用い、スレッドＣ＿０をＣＰＵ＃０に割り当てた場合の結果を示している。また、比較として、タイムチャート１５０２は、共有方法を用い、スレッドＣ＿０をＣＰＵ＃２に割り当てた場合の結果を示している。同様に、タイムチャート１５０３は、複写方法を用いた場合の結果を示している。
【００９６】
タイムチャート１５０１にて、スレッドＣ＿０を実行するＣＰＵ＃０は、処理番号｛１｝、｛４｝、｛７｝、｛１０｝、｛１３｝、｛１４｝を実行し、１１．５［ｕｓ］に処理を終了する。また、スレッドＣ＿１を実行するＣＰＵ＃１は、処理番号｛２｝、｛５｝、｛８｝、｛１１｝を実行し、２１［ｕｓ］に処理を終了する。同様に、スレッドＡ＿２を実行するＣＰＵ＃２は、処理番号｛３｝、｛６｝、｛９｝、｛１２｝を実行し、１９．５［ｕｓ］に処理を終了する。
【００９７】
タイムチャート１５０２にて、スレッドＣ＿０を実行するＣＰＵ＃２は、図示していないが、３４．５［ｕｓ］に処理を終了する。タイムチャート１５０１の結果と比較すると、タイムチャート１５０２ではスレッドＣ＿０の処理に時間がかかり、結果、通知待ちを行うスレッドＣ＿１、スレッドＣ＿２の処理にも時間がかかるようになってしまっている。また、スレッドＣ＿２を実行するＣＰＵ＃０は、たとえば、２［ｕｓ］から１２［ｕｓ］まで待ち時間が発生してしまっている。
【００９８】
タイムチャート１５０３にて、スレッドＣ＿０を実行するＣＰＵ＃０は、２３［ｕｓ］に処理を終了する。スレッドＣ＿１を実行するＣＰＵ＃１は、２２［ｕｓ］に処理を終了し、スレッドＣ＿２を実行するＣＰＵ＃２は、２６［ｕｓ］に処理を終了する。タイムチャート１５０１の結果と比較すると、タイムチャート１５０３ではスレッドＣ＿０の処理に時間がかかっている。また、ＣＰＵ＃１、ＣＰＵ＃２は、同期待ちの時間が細切れに発生してしまっている。たとえば、ＣＰＵ＃１では、３［ｕｓ］〜４［ｕｓ］、８［ｕｓ］〜１１［ｕｓ］といった細かい時間で待ちが発生しており、ＣＰＵ＃２では、４［ｕｓ］〜８［ｕｓ］、１１［ｕｓ］〜１５［ｕｓ］といった時間で待ちが発生している。
【００９９】
図１５で示すように、複数のスレッドのうち１つでも同期命令に偏りがある場合、マルチコアプロセッサシステム１００は、共有方法を用いることで、ボトルネックとなるスレッドを高速に処理することができ、ＣＰＵ＃０〜ＣＰＵ＃２の利用効率を向上できる。
【０１００】
続いて、図１６、図１７にて、図１０〜図１５で示したようなレジスタ利用処理のフローチャートを示す。マルチコアプロセッサシステム１００が実行するレジスタ利用処理は、図１６で示すレジスタ利用処理か、図１７で示すレジスタ利用処理か、のいずれであってもよい。なお、レジスタ利用処理は、ＣＰＵ＃０〜ＣＰＵ＃２のいずれのＣＰＵで行ってもよい。本実施の形態では、たとえば、ＣＰＵ＃０がレジスタ利用処理を実行する場合にて説明する。
【０１０１】
図１６は、レジスタ利用処理の一例を示すフローチャートである。図１６で示すレジスタ利用処理は、スケジューラからスレッド割当の通知をトリガーとして実行される。ＣＰＵ＃０は、スケジューラ５０１により、スレッドがＣＰＵ＃０〜ＣＰＵ＃２のいずれかに割り当てられることを検出する（ステップＳ１６０１）。以下、図１６の説明では、割り当てられるスレッドを対象スレッドと呼称する。ＣＰＵ＃０は、対象スレッドが細粒度並列処理か否かを判断する（ステップＳ１６０２）。なお、対象スレッドが細粒度並列処理か否かの判断方法としては、プロファイル情報５２１に、対象スレッドに対応するレコードの有無によって、細粒度並列処理か否かを判断する。
【０１０２】
細粒度並列処理である場合（ステップＳ１６０２：Ｙｅｓ）、ＣＰＵ＃０は、割当対象のスレッドに対応するプロファイル情報を取得する（ステップＳ１６０３）。次に、ＣＰＵ＃０は、プロファイル情報から、（１）式、（２）式を実行する（ステップＳ１６０４）。また、１つのアプリを実行する際に、複数のスレッドを割り当てる場合、ＣＰＵ＃０は、複数のスレッドの各々のスレッドに対して、（１）式、（２）式を実行する。
【０１０３】
（１）式、（２）式の結果により、ＣＰＵ＃０は、同期命令に偏りがあるか否かを判断する（ステップＳ１６０５）。同期命令に偏りがある場合（ステップＳ１６０５：Ｙｅｓ）、ＣＰＵ＃０は、レジスタＩ／Ｆ１０２に、特定のＣＰＵをレジスタの共有元として共有方法を用いることを通知する（ステップＳ１６０６）。続けて、ＣＰＵ＃０は、プロファイル情報から、（３）式を実行する（ステップＳ１６０７）。（３）式の結果により、ＣＰＵ＃０は、ディスパッチャ５０３に、（３）式の値が最も大きいスレッドを、特定のＣＰＵに割り当てるように通知し（ステップＳ１６０８）、レジスタ利用処理を終了する。
【０１０４】
同期命令に偏りがない場合（ステップＳ１６０５：Ｎｏ）、ＣＰＵ＃０は、レジスタＩ／Ｆ１０２に、複写方法を用いることを通知する（ステップＳ１６０９）。次に、ＣＰＵ＃０は、ディスパッチャ５０３に、スケジューラ５０１の指示通りに対象スレッドを割り当てるように通知し（ステップＳ１６１０）、レジスタ利用処理を終了する。
【０１０５】
また、細粒度並列処理でない場合（ステップＳ１６０２：Ｎｏ）、ＣＰＵ＃０は、レジスタＩ／Ｆに、レジスタ値の共有を行わないことを通知し（ステップＳ１６１１）、ステップＳ１６１０の処理に移行する。
【０１０６】
図１７は、レジスタ利用処理の他の例を示すフローチャートである。図１７で示すレジスタ利用処理は、スレッド内で同期命令が完了したことをトリガーとして実行される。また、図１７で示すステップＳ１７０１、ステップＳ１７０４、ステップＳ１７０５、ステップＳ１７０８以外の処理については、図１６で示した処理と同一であるため、説明を省略する。
【０１０７】
ＣＰＵ＃０は、実行中のスレッドにて、同期命令が完了したことを検出し（ステップＳ１７０１）、ステップＳ１７０２の処理に移行する。以下、図１７の説明では、実行中のスレッドを対象スレッドと呼称する。なお、検出対象となる同期命令は、同期通知、同期待ち、バリア同期のうち、同期待ちのみであってもよい。理由として、同期通知の完了を検出した場合、同期待ちも近いうちに行われることが予想され、頻繁にレジスタ利用処理が実行されるのを防ぐためである。また、バリア同期についても、検出対象となる同期命令に含めなくともよい。
【０１０８】
ステップＳ１７０３の処理を実行後、ＣＰＵ＃０は、プロファイル情報５２１を、発行した同期命令数分減少する（ステップＳ１７０４）。次に、ＣＰＵ＃０は、更新したプロファイル情報５２１から、（１）式、（２）式を実行し（ステップＳ１７０５）、ステップＳ１７０６の処理に移行する。
【０１０９】
また、ステップＳ１７０７の処理を実行後、ＣＰＵ＃０は、更新したプロファイル情報５２１から、（３）式を実行し（ステップＳ１７０８）、ステップＳ１７０９の処理に移行する。
【０１１０】
図１８は、本実施の形態にかかるコンピュータを用いたシステムの適用例を示す説明図である。図１８において、ネットワークＮＷは、サーバ１８０１とクライアント１８１１〜クライアント１８１４とが通信可能なネットワークであり、たとえば、ＬＡＮ、ＷＡＮ、インターネット、携帯電話網などを含む。
【０１１１】
クライアント１８１１はノート型ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）である。クライアント１８１２はデスクトップ型ＰＣ、クライアント１８１３は携帯電話機である。携帯電話機として、クライアント１８１３は、スマートフォンであってもよいし、ＰＨＳ（Ｐｅｒｓｏｎａｌ  Ｈａｎｄｙｐｈｏｎｅ  Ｓｙｓｔｅｍ）であってもよい。クライアント１８１４はタブレット型端末である。
【０１１２】
図１８のサーバ１８０１、クライアント１８１１〜クライアント１８１４は、実施の形態で説明したマルチコアプロセッサシステムとして、本実施の形態にかかるレジスタ利用方法を実行する。たとえば、サーバ１８０１内の複数のＣＰＵが、本実施の形態にかかるレジスタ利用方法を実行する。
【０１１３】
以上説明したように、マルチコアプロセッサシステム、レジスタ利用方法、およびレジスタ利用プログラムによれば、スレッドが発行する同期命令に偏りがあることを取得し、同期通知を行うＣＰＵのレジスタを他のＣＰＵに共有させる共有方法を用いる。これにより、同期通知を行うＣＰＵが速く実行し、通知を待つＣＰＵの待ちが短くなるため、全体の処理性能が向上する。また、レジスタの共有元となるＣＰＵに、同期通知が多いスレッドを割り当てると、待ち時間の粒度が大きくなるため、マルチコアプロセッサシステムは、ＤＶＦＳの利用や、他のアプリを実行しやすくなる。
【０１１４】
また、マルチコアプロセッサシステムは、スレッドが発行する同期命令に偏りがないことを取得し、ＣＰＵが自身のレジスタの値を更新する都度、他のＣＰＵのレジスタに値を複写する複写方法を用いてもよい。これにより、マルチコアプロセッサシステムは、ＣＰＵ間の性能差がなくなるため、同期待ち時間が減少し、ＣＰＵの処理能力を向上させることができる。
【０１１５】
また、マルチコアプロセッサシステムは、少なくとも一つのスレッドについて、差分に基づいた値が所定値より大きいか否かを判断し、大きければ、共有方法を用いてもよい。これにより、マルチコアプロセッサシステムは、同期命令の偏りがあるスレッド群と偏りがないスレッド群を順次実行する場合でも、偏りがあるスレッドを実行する場合、レジスタの利用方法を共有方法に切り替えて、全体の処理能力を向上させることができる。
【０１１６】
また、マルチコアプロセッサシステムは、少なくとも一つのスレッドについて、同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断し、差分値が所定値以下であれば、複写方法を用いてもよい。これにより、マルチコアプロセッサシステムは、同期命令の偏りがあるスレッド群と偏りがないスレッド群を順次実行する場合でも、偏りがないスレッドを実行する場合、レジスタの利用方法を複写方法に切り替えて、全体の処理能力を向上させることができる。
【０１１７】
また、マルチコアプロセッサシステムは、スレッドがＣＰＵに割り当てられるときに、差分に基づいた値が所定値より大きいか否かを判断してもよい。これにより、マルチコアプロセッサシステムは、スレッドが実行される前のタイミングで、利用方法を切り替えることができる。
【０１１８】
また、マルチコアプロセッサシステムは、スレッドにて同期待ちが完了したことを検出した場合、同期通知数と同期待ち数を更新し、更新された同期通知数と同期待ち数の差分に基づいて、同期命令の偏りがあるか否かを判断してもよい。これにより、マルチコアプロセッサシステムは、スレッドの実行中であっても、より最適なレジスタ利用方法を用いることができる。
【０１１９】
たとえば、スレッドの割当時には同期命令の偏りがあり、共有方法を用いて実行されていたスレッド群が、処理の前半部分にて、同期命令を全て発行し終えた場合、処理の後半部分は、複写方法を用いた方が処理能力を向上できる。マルチコアプロセッサシステムは、このようなスレッド群を実行する場合、同期待ちの完了を検出し、共有方法から複写方法に切り替えることで、常に共有方法にし続けた場合と比較して、より全体の処理能力を向上させることができる。
【０１２０】
また、マルチコアプロセッサシステムは、共有方法を用いる場合、スレッドに関する同期通知数と同期待ち数の差の大きさに基づいて、レジスタの共有元となるＣＰＵに割り当てるＣＰＵを特定してもよい。これにより、マルチコアプロセッサシステムは、他のスレッドを待たせる割合が多いスレッドを、処理の高速なＣＰＵに割り当てることができるため、他のスレッドの待ち時間が減少し、処理能力を向上させることができる。
【０１２１】
なお、本実施の形態で説明したレジスタ利用方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本レジスタ利用プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本レジスタ利用プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１２２】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１２３】
（付記１）複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得する取得手段と、
前記取得手段によって前記情報が取得された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する実行手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
【０１２４】
（付記２）複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得する取得手段と、
前記取得手段によって前記情報が取得された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアにより前記スレッドを実行する実行手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
【０１２５】
（付記３）複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する判断手段と、
前記判断手段によって前記値が前記所定値より大きいと判断された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する実行手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
【０１２６】
（付記４）前記実行手段は、
前記判断手段によっていずれのスレッドについても前記値が前記所定値以下であると判断された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアにより前記スレッドを実行する、
ことを特徴とする付記３に記載のマルチコアプロセッサシステム。
【０１２７】
（付記５）前記スレッドが前記複数のコアのいずれかのコアに割り当てられることを検出する検出手段をさらに備え、
前記判断手段は、
前記検出手段によって前記スレッドが割り当てられることが検出された場合、前記複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する、
ことを特徴とする付記３または４に記載のマルチコアプロセッサシステム。
【０１２８】
（付記６）前記スレッドのうちいずれかのスレッドにて同期待ちが完了したことを検出する検出手段と、
前記検出手段によって前記いずれかのスレッドにて同期待ちが完了したことを検出した場合、前記スレッドに関する前記同期通知数と前記同期待ち数とを更新する更新手段と、をさらに備え、
前記判断手段は、
前記更新手段によって前記スレッドに関する前記同期通知数と前記同期待ち数とが更新された場合、前記複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断する、
ことを特徴とする付記３または４に記載のマルチコアプロセッサシステム。
【０１２９】
（付記７）前記実行手段が前記共有させることによって前記スレッドを実行する場合、前記複数のスレッドのうち前記スレッドに関する同期通知数と同期待ち数との差分に基づいて、スレッドを特定する特定手段と、
前記特定手段によって特定されたスレッドを、前記複数のコアのうちレジスタの共有元となるコアに割り当てる割当手段と、
をさらに備えることを特徴とする付記３、５、６のうちいずれか一つに記載のマルチコアプロセッサシステム。
【０１３０】
（付記８）複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する、
処理を前記複数のコアのうち特定のコアが実行するレジスタ利用方法。
【０１３１】
（付記９）複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアにより前記スレッドを実行する、
処理を前記複数のコアのうち特定のコアが実行するレジスタ利用方法。
【０１３２】
（付記１０）複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断し、
前記値が前記所定値より大きいと判断された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアにより前記スレッドを実行する、
処理を前記複数のコアのうち特定のコアが実行するレジスタ利用方法。
【０１３３】
（付記１１）複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいことを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアに前記スレッドを実行させる、
処理を前記複数のコアのうち特定のコアに実行させるレジスタ利用プログラム。
【０１３４】
（付記１２）複数のコアのそれぞれに割り当てられるスレッドのいずれのスレッドについても同期通知数と同期待ち数との差分に基づいた値が所定値以下であることを示す情報を取得し、
前記情報が取得された場合、前記複数のコアのうちいずれかのコアのレジスタの値が更新される都度、他のコアのレジスタに複写することにより、前記複数のコアに前記スレッドを実行させる、
処理を前記複数のコアのうち特定のコアに実行させるレジスタ利用プログラム。
【０１３５】
（付記１３）複数のコアのそれぞれに割り当てられるスレッドのうち少なくともいずれか一つのスレッドに関する同期通知数と同期待ち数との差分に基づいた値が所定値より大きいか否かを判断し、
前記値が前記所定値より大きいと判断された場合、前記複数のコアのうち同期通知を実行するコアのレジスタを他のコアに共有させることにより、前記複数のコアに前記スレッドを実行させる、
処理を前記複数のコアのうち特定のコアに実行させるレジスタ利用プログラム。
【符号の説明】
【０１３６】
＃０〜＃２  ＣＰＵ
Ａ＿１〜Ａ＿２  スレッド
１０１  バス
５０１  スケジューラ
５０２  レジスタ利用ライブラリ
５０３  ディスパッチャ
５１１  検出部
５１２  更新部
５１３  取得部
５１４  判断部
５１５  特定部
５１６  通知部
５１７  実行部
５１８  割当部
５２１  プロファイル情報
【図１】
0005708450.tif 000002
【図２】
0005708450.tif 000003
【図３】
0005708450.tif 000004
【図４】
0005708450.tif 000005
【図５】
0005708450.tif 000006
【図６】
0005708450.tif 000007
【図７】
0005708450.tif 000008
【図８】
0005708450.tif 000009
【図９】
0005708450.tif 000010
【図１０】
0005708450.tif 000011
【図１１】
0005708450.tif 000012
【図１２】
0005708450.tif 000013
【図１３】
0005708450.tif 000014
【図１４】
0005708450.tif 000015
【図１５】
0005708450.tif 000016
【図１６】
0005708450.tif 000017
【図１７】
0005708450.tif 000018
【図１８】
0005708450.tif 000019