(57)【要約】  ＣＰＵ（＃０）は、検出部（３０２）によって、ＣＰＵ（＃０）に割り当てられるスレッド（２１１）と、ＣＰＵ（＃１）に割り当てられるスレッド（２１２）と、が共用リソース（２０１）にアクセスする状態を検出する。検出後、ＣＰＵ（＃０）は、算出部（３０３）によって、スレッド（２１１）が割り当てられる第１の周期とスレッド（２１２）が割り当てられる第２の周期とから、共用リソース（２０１）に対するアクセス競合を発生させる競合周期を算出する。算出後、ＣＰＵ（＃０）は、選択部（３０４）によってスレッド（２１１）とスレッド（２１２）から、スレッド（２１２）の後方に割り当てられるスレッド（２２３）を選択する。ＣＰＵ（＃１）は、スレッド（２１２）が割り当てられる時刻と、スレッド（２１２）が割り当てられる時刻と、スレッド（２２３）が割り当てられる時刻を入れ替える。
2012014313.tif 000002
【特許請求の範囲】
【請求項１】
複数のコアのうち第１のコアに割り当てられる第１のスレッドと、前記複数のコアのうち前記第１のコアとは異なる第２のコアに割り当てられる第２のスレッドと、が同一のリソースにアクセスする状態を検出する検出手段と、
前記検出手段によって前記状態が検出された場合、前記第１のスレッドが前記第１のコアに割り当てられる第１の周期と前記第２のスレッドが前記第２のコアに割り当てられる第２の周期とに基づいて、前記第１および第２のスレッドが前記リソースに対するアクセス競合を発生させる競合周期を算出する算出手段と、
前記算出手段によって算出された前記競合周期にて割り当てられる前記第１および第２のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける前記競合周期の前後いずれかの時刻に割り当てられるスレッドを選択する選択手段と、
前記いずれか一方のスレッドが割り当てられる時刻と、前記選択手段によって選択されたスレッドが割り当てられる時刻と、を入れ替える入替手段と、
を備えることを特徴とするマルチコアプロセッサシステム。
【請求項２】
前記算出手段は、
前記検出手段によって前記状態が検出された場合、前記第１および第２の周期の公倍数を求めることにより、前記競合周期を算出することを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項３】
前記算出手段は、
前記検出手段によって前記状態が検出された場合、前記第１のコアに前記第１のスレッドが割り当てられる時刻より前で前記第２のスレッドが前記第２のコアに最後に割り当てられた時刻と前記第１および第２の周期とから、前記競合周期として前記第１のスレッドが割り当てられる時刻以降で最初の前記アクセス競合が発生する時刻を算出することを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項４】
前記算出手段によって前記競合周期が算出された場合、前記第１および第２のコアに割り当てられる任意のスレッドの割り当てを開始する時刻を同一の時刻に設定する設定手段をさらに備え、
前記選択手段は、
前記設定手段によって前記任意のスレッドの割り当てを開始する時刻が前記同一の時刻に設定された場合、前記競合周期にて割り当てられる前記第１および第２のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける前記競合周期の前後いずれかの時刻に割り当てられるスレッドを選択することを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項５】
複数のコアのうち第１のコアに割り当てられる第１のスレッドと、前記複数のコアのうち前記第１のコアとは異なる第２のコアに割り当てられる第２のスレッドと、が同一のリソースにアクセスする状態を検出する検出工程と、
前記検出工程によって前記状態が検出された場合、前記第１のスレッドが前記第１のコアに割り当てられる第１の周期と前記第２のスレッドが前記第２のコアに割り当てられる第２の周期とに基づいて、前記第１および第２のスレッドが前記リソースに対するアクセス競合を発生させる競合周期を算出する算出工程と、
前記算出工程によって算出された前記競合周期にて割り当てられる前記第１および第２のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける前記競合周期の前後いずれかの時刻に割り当てられるスレッドを選択する選択工程と、
前記いずれか一方のスレッドが割り当てられる時刻と、前記選択工程によって選択されたスレッドが割り当てられる時刻と、を入れ替える指示を前記いずれか一方のスレッドが割り当てられるコアに通知する入替指示工程と、
を前記第１のコアが実行することを特徴とするスレッド制御方法。
【請求項６】
複数のコアのうち第１のコアに割り当てられる第１のスレッドと、前記複数のコアのうち前記第１のコアとは異なる第２のコアに割り当てられる第２のスレッドと、が同一のリソースにアクセスする状態を検出する検出工程と、
前記検出工程によって前記状態が検出された場合、前記第１のスレッドが前記第１のコアに割り当てられる第１の周期と前記第２のスレッドが前記第２のコアに割り当てられる第２の周期とに基づいて、前記第１および第２のスレッドが前記リソースに対するアクセス競合を発生させる競合周期を算出する算出工程と、
前記算出工程によって算出された前記競合周期にて割り当てられる前記第１および第２のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける前記競合周期の前後いずれかの時刻に割り当てられるスレッドを選択する選択工程と、
前記いずれか一方のスレッドが割り当てられる時刻と、前記選択工程によって選択されたスレッドが割り当てられる時刻と、を入れ替える指示を前記いずれか一方のスレッドが割り当てられるコアに通知する入替指示工程と、
を前記第１のコアに実行させることを特徴とするスレッド制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スレッドを制御するマルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムに関する。
【背景技術】
【０００２】
従来、組み込み機器をはじめとするマルチコアプロセッサシステムは、各ＣＰＵ、各スレッドでハードウェア資源であるリソースを共用しながら運用している。たとえば、共用メモリに代表される密結合型マルチプロセッサシステムは、各ＣＰＵでメモリを共用しながら運用する。また、メモリ以外の共用リソースとしては、ファイルシステムや入出力装置も共用リソースの一部となる。共用リソースの運用方式として、大別して、キューイング方式、キャッシュ方式、優先度方式、という３つの方式が存在する。【０００３】
キューイング方式は、各スレッドから通知される共用リソースへのアクセス要求を、リストとして登録し、優先度または到着順に処理を行う方式である。キューイングを行う方式として、マスタコアによるソフトウェア制御で行う方式と、共用リソースに調停回路を実装して行う方式とが存在する。以下、前者のキューイング方式をキューイング方式１、後者のキューイング方式をキューイング方式２と呼称する。【０００４】
キャッシュ方式は、ストレージなどで適用される方式で、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）やフラッシュメモリといった、揮発性メモリのアクセス速度より低速の共用リソースに対し、共用リソースとＣＰＵの間にキャッシュメモリを挟む方式である。これにより、ＣＰＵは揮発性メモリと同等のスループットで共用リソースにアクセスすることができる。共用リソース側は、ＣＰＵによるアクセスの後に、共用リソースの実体にアクセスする。優先度方式は、スレッドに優先度を付加し、高優先度のスレッドを共用リソースへ優先的にアクセスさせる方式である。【０００５】
たとえば、キューイング方式１を適用した技術として、リソース使用中フラグを設定し、他のＣＰＵが共用リソースにアクセス中でなければ、キューよりスレッドを取得して実行する。これにより、共用リソースに対するアクセス競合中を避け、ＣＰＵのアイドルを防止する技術が開示されている（たとえば、下記特許文献１を参照。）。【０００６】
また、共用リソースへのアクセス解析を行い、ディスパッチ時にアクセス状態を監視することで、アクセス競合を回避する技術が開示されている（たとえば、下記特許文献２を参照。）。また、別の技術として、アクセス競合が発生しそうになった場合、スケジュールに併せて、スレッドを停止させるか、スレッドをスピンさせることにより、アクセス競合を回避する技術が開示されている（たとえば、下記特許文献３を参照。）。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開昭６２−２９０９５８号公報
【特許文献２】特開平１０−４９３８９号公報
【特許文献３】特開平６−１２３９４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、上述した従来技術において、キューイング方式２やキャッシュ方式では、特別なハードウェア機構が要求されるため、高コストになるという問題があった。また、キューイング方式２では、ＤＭＡなどの高速アクセスユニットが高優先に大量データのアクセスを行うと、ＣＰＵによるアクセスが阻害されるという問題があった。また、キューイング方式１では、特別なハードウェア機構は要求されないが、アクセス要求を発行してから処理が行われるまでの時間が長く、システムのスループットが低下するという問題があった。また、優先度方式では、同じ優先度のスレッドがアクセスした場合に、処理性能が低下するという問題があった。【０００９】
また、特許文献３にかかる技術では、アクセス競合は回避できるが、そのためにスレッドを停止させたりスピンさせたりするために、スレッドの処理が実行されなくなるため、処理性能が低下するという問題があった。【００１０】
本発明は、上述した従来技術による問題点を解消するため、アクセス競合を回避しつつ、処理性能を維持できるマルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
上述した課題を解決し、目的を達成するため、開示のマルチコアプロセッサシステムは、複数のコアのうち第１のコアに割り当てられる第１のスレッドと、複数のコアのうち第１のコアとは異なる第２のコアに割り当てられる第２のスレッドと、が同一のリソースにアクセスする状態を検出し、第１のスレッドが第１のコアに割り当てられる第１の周期と第２のスレッドが第２のコアに割り当てられる第２の周期とに基づいて、第１および第２のスレッドがリソースに対するアクセス競合を発生させる競合周期を算出し、算出された競合周期にて割り当てられる第１および第２のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける競合周期の前後いずれかの時刻に割り当てられるスレッドを選択し、いずれか一方のスレッドが割り当てられる時刻と、選択されたスレッドが割り当てられる時刻と、を入れ替える。
【発明の効果】
【００１２】
本マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムによれば、アクセス競合を回避しつつ、処理性能を維持できるという効果を奏する。
【図面の簡単な説明】
【００１３】
【図１】実施の形態にかかるマルチコアプロセッサシステムのハードウェアを示すブロック図である。
【図２】マルチコアプロセッサシステム１００の一部のハードウェアと実行されるソフトウェアを示す説明図である。
【図３】マルチコアプロセッサシステム１００の機能を示すブロック図である。
【図４】スレッド制御処理を行うための開発時および実行時の動作概要を示す説明図である。
【図５】マルチコアプロセッサシステム１００の開発時の概要を示す説明図である。
【図６】スレッドディスパッチの概要を示す説明図である。
【図７】ディスパッチの順序を入れ替える方法の概要を示す説明図である。
【図８】スレッド制御処理を行ったタイムチャートを示す説明図である。
【図９】新たにスレッドを起動した際のタイムチャートを示す説明図である。
【図１０】スレッド制御処理を示すフローチャートである。
【図１１】競合周期算出処理を示すフローチャートである。
【図１２】スレッドの起動タイミングが異なる場合、初回の競合周期までのオフセット時間と競合周期を算出する競合周期算出処理を示すフローチャートである。
【図１３】マルチコアプロセッサシステム１００のディスパッチ時間またはインターバルが変更した場合のスレッド制御処理を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下に添付図面を参照して、本発明にかかるマルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムの好適な実施の形態を詳細に説明する。
【００１５】
（マルチコアプロセッサシステムのハードウェア）
図１は、実施の形態にかかるマルチコアプロセッサシステムのハードウェアを示すブロック図である。図１において、マルチコアプロセッサシステム１００は、ＣＰＵを複数搭載するＣＰＵｓ１０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）１０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０３と、を含む。また、マルチコアプロセッサシステム１００は、フラッシュＲＯＭ１０４と、フラッシュＲＯＭコントローラ１０５と、フラッシュＲＯＭ１０６と、を含む。また、マルチコアプロセッサシステム１００は、ユーザやその他の機器との入出力装置として、ディスプレイ１０７と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）１０８と、キーボード１０９と、を含む。また、各部はバス１１０によってそれぞれ接続されている。
【００１６】
ここで、ＣＰＵｓ１０１は、マルチコアプロセッサシステム１００の全体の制御を司る。ＣＰＵｓ１０１は、シングルコアのプロセッサを並列して接続した全てのＣＰＵを指している。ＣＰＵｓ１０１は、ＣＰＵ＃０〜ＣＰＵ＃３を含む。また、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例にあげて説明する。
【００１７】
ＲＯＭ１０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ１０３は、ＣＰＵｓ１０１のワークエリアとして使用される。フラッシュＲＯＭ１０４は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）などのシステムソフトウェアやアプリケーションソフトウェアなどを記憶している。たとえば、ＯＳを更新する場合、マルチコアプロセッサシステム１００は、Ｉ／Ｆ１０８によって新しいＯＳを受信し、フラッシュＲＯＭ１０４に格納されている古いＯＳを、受信した新しいＯＳに更新する。
【００１８】
フラッシュＲＯＭコントローラ１０５は、ＣＰＵｓ１０１の制御に従ってフラッシュＲＯＭ１０６に対するデータのリード／ライトを制御する。フラッシュＲＯＭ１０６は、フラッシュＲＯＭコントローラ１０５の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム１００を使用するユーザがＩ／Ｆ１０８を通して取得した画像データ、映像データなどである。フラッシュＲＯＭ１０６は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００１９】
ディスプレイ１０７は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ１０７は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。
【００２０】
Ｉ／Ｆ１０８は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク１１１に接続され、ネットワーク１１１を介して他の装置に接続される。そして、Ｉ／Ｆ１０８は、ネットワーク１１１と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ１０８には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２１】
キーボード１０９は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード１０９は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００２２】
図２は、マルチコアプロセッサシステム１００の一部のハードウェアと実行されるソフトウェアを示す説明図である。図２で示されるハードウェアは、共用リソース２０１と、共用リソース２０２と、ＣＰＵｓ１０１に含まれるＣＰＵ＃０〜ＣＰＵ＃３とである。共用リソース２０１と、共用リソース２０２と、ＣＰＵ＃０〜ＣＰＵ＃３はバス１１０によって接続されている。
【００２３】
共用リソース２０１と、共用リソース２０２は、ソフトウェアによってアクセスされるデバイスである。デバイスとして、たとえば、Ｉ／Ｆ１０８に接続されるカメラデバイスやサウンドデバイスなどが存在する。また、リソースとしては、ＲＡＭ１０３、フラッシュＲＯＭ１０４などにアクセスするファイルシステムなども含まれる。このように、本実施の形態にかかるマルチコアプロセッサシステム１００では、特別なバッファやキュー、ハードウェア機構は不要である。
【００２４】
図２で示されるソフトウェアは、カーネル２０３と、ディスパッチスケジューラ２０４と、バリア同期機構２０５と、スレッド２１１〜スレッド２１４と、スレッド２２１〜スレッド２２９と、である。カーネル２０３と、ディスパッチスケジューラ２０４と、バリア同期機構２０５は、ＣＰＵ＃０〜ＣＰＵ＃３の各々で実行されており、ＣＰＵ＃０〜ＣＰＵ＃３の各々に対応する意味で接尾記号となる“＃０”〜“＃３”が付与されている。たとえば、カーネル２０３＃０、ディスパッチスケジューラ２０４＃０、バリア同期機構２０５＃０は、ＣＰＵ＃０によって実行されている。
【００２５】
また、スレッド２１１、スレッド２２１、スレッド２２２はＣＰＵ＃０で実行されている。スレッド２１２、スレッド２２３〜スレッド２２５はＣＰＵ＃１で実行されている。スレッド２１３、スレッド２２６、スレッド２２７はＣＰＵ＃２で実行されている。スレッド２１４、スレッド２２８、スレッド２２９はＣＰＵ＃３で実行されている。
【００２６】
カーネル２０３は、各ＣＰＵを制御するプログラムである。カーネル２０３は、ＯＳの中核の機能であり、たとえば、マルチコアプロセッサシステム１００のリソースを管理し、スレッドなどのソフトウェアがハードウェアにアクセスできるようにする。
【００２７】
ディスパッチスケジューラ２０４は、ＣＰＵに割り当てるスレッドを決定し、スレッドを割り当てるプログラムである。たとえば、ディスパッチスケジューラ２０４＃０は、ＣＰＵ＃０にて実行するスレッドを決定し、現在割り当てているスレッドのプログラムカウンタなどのレジスタ情報を、スレッドのコンテキストに格納する。続けて、ディスパッチスケジューラ２０４＃０は、決定されたスレッドのコンテキストからレジスタ情報を取得し、ＣＰＵ＃０のレジスタに設定する。
【００２８】
バリア同期機構２０５は、同期を取るポイントを設定し、同期を取るスレッドが同期を取るべきポイントに到達した場合、ＣＰＵはスレッドを一時的に停止させ、全てのスレッドがバリアポイントに到達した場合にスレッドを再開する機構である。
【００２９】
たとえば、ＣＰＵ＃０で実行されるスレッド２１１と、ＣＰＵ＃１で実行されるスレッド２１２が存在する場合を想定する。先にスレッド２１１が同期を取るポイントに到達した場合、ＣＰＵ＃０は、スレッド２１１を一時的に停止させる。続けて、スレッド２１２が同期を取るポイントに到達した場合、全てのスレッドが同期を取るポイントに到達したため、ＣＰＵ＃１は、スレッド２１２を続行する。さらに、ＣＰＵ＃１は、ＣＰＵ＃０に対して停止の解除を通知し、ＣＰＵ＃０は、スレッド２１１を再開させる。バリア同期機構２０５は、ソフトウェアにて実装されてもよいし、ハードウェアで実装されていてもよい。
【００３０】
スレッド２１１、スレッド２１２は、共用リソース２０１にアクセスするスレッドであり、スレッド２１３、スレッド２１４は、共用リソース２０２にアクセスするスレッドである。また、スレッド２２１〜スレッド２２９は、共用リソース２０１、共用リソース２０２のどちらにもアクセスしないスレッドである。
【００３１】
たとえば、共用リソース２０１をファイルシステムとし、共用リソース２０２をカメラデバイスと想定する。続けて、スレッド２１１を文字入力スレッド、スレッド２１２を文章エディタスレッド、スレッド２１３をビデオチャットスレッド、スレッド２１４をデジタルカメラと同様の機能を提供するカメラスレッドと想定する。スレッド２１１は、ファイルシステムをかな漢字変換辞書ファイルのアクセスのために使用し、スレッド２１２は、ファイルシステムを編集中となる文章ファイルのアクセスのために使用する。スレッド２１３は、カメラデバイスをチャット用の画像データをカメラから取り込むために使用し、スレッド２１４は、カメラデバイスをカメラの操作のために使用する。
【００３２】
このとき、スレッド２１１、スレッド２１２は周期的にＣＰＵ＃０、ＣＰＵ＃１に割り当てられているため、同じタイミングでＣＰＵに割り当てられた場合、ファイルシステムに対するアクセス競合が発生する。具体的には、スレッド２１２となる文章エディタスレッドがファイルシステムにアクセスをしている間にユーザがスレッド２１１となる文字入力を行うことで、たとえば文字入力がひっかかるような操作感が発生するといった弊害が発生する。
【００３３】
また、図示していないが、ファイルシステムをダウンロードの格納先としてアクセスするダウンローダスレッドが存在した場合、ユーザがスレッド２１１となる文字入力を行うたびに、ダウンローダスレッドがアクセス競合のため処理速度が低下する。結果、想定された時間以内にダウンロードが終了しないといった弊害が発生する。
【００３４】
（マルチコアプロセッサシステム１００の機能）
次に、マルチコアプロセッサシステム１００の機能について説明する。図３は、マルチコアプロセッサシステム１００の機能を示すブロック図である。マルチコアプロセッサシステム１００は、検出部３０２と、算出部３０３と、選択部３０４と、入替部３０５と、設定部３０６と、設定部３０７と、を含む。この制御部となる機能（検出部３０２〜設定部３０７）は、記憶装置に記憶されたプログラムをＣＰＵｓ１０１が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図１に示したＲＯＭ１０２、ＲＡＭ１０３、フラッシュＲＯＭ１０４、フラッシュＲＯＭ１０６などである。または、Ｉ／Ｆ１０８を経由して他のＣＰＵが実行することにより、その機能を実現してもよい。
【００３５】
また、マルチコアプロセッサシステム１００は、ＣＰＵで実行されるスレッドごとに、共用リソースへのアクセス情報を記録した共用リソースアクセス情報データベース３０１にアクセス可能である。共用リソースアクセス情報データベース３０１の詳細は、図５にて後述する。
【００３６】
また、図３では、検出部３０２〜選択部３０４、設定部３０６はＣＰＵ＃０の機能として、入替部３０５、設定部３０７はＣＰＵ＃１の機能として図示されている。入替部３０５について、選択部３０４の結果によってはＣＰＵ＃０の機能となってもよい。
【００３７】
検出部３０２は、複数のコアのうち第１のコアに割り当てられる第１のスレッドと、複数のコアのうち第１のコアとは異なる第２のコアに割り当てられる第２のスレッドと、が同一のリソースにアクセスする状態を検出する機能を有する。たとえば、検出部３０２は第１のスレッドとしてＣＰＵ＃０に割り当てられるスレッド２１１と、第２のスレッドとしてＣＰＵ＃１に割り当てられるスレッド２１２と、が共用リソース２０１にアクセスする状態を検出する。なお、検出結果は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ１０３などに記憶される。
【００３８】
算出部３０３は、検出部３０２によって複数のスレッドが同一のリソースにアクセスする状態が検出された場合、第１のスレッドが第１のコアに割り当てられる第１の周期と第２のスレッドが第２のコアに割り当てられる第２の周期とを取得する。続けて、算出部３０３は、第１の周期と第２の周期に基づいて、第１および第２のスレッドがリソースに対するアクセス競合を発生させる競合周期を算出する機能を有する。また、算出部３０３は、第１および第２の周期の公倍数を求めることにより、競合周期を算出してもよい。
【００３９】
ここで、コアに割り当てられる周期とは、該当のスレッドが１度ディスパッチされ、次にディスパッチされるまでの時間である。具体的には、ＣＰＵが周期的にスレッドをディスパッチする状態で、該当のスレッドが６回に１回ディスパッチされ、１回の時間が１０［マイクロ秒］である場合、コアに割り当てられる周期は６×１０＝６０［マイクロ秒］となる。以下、コアに割り当てられる周期をディスパッチ周期と称する。
【００４０】
たとえば、算出部３０３は、スレッド２１１のディスパッチ周期と、スレッド２１２のディスパッチ周期とに基づいて、スレッド２１１とスレッド２１２が共用リソース２０１に対するアクセス競合を発生させる競合周期を算出する。競合周期の算出方法としては、たとえば、スレッド２１１のディスパッチ周期とスレッド２１２のディスパッチ周期を乗算することで、競合周期を求めてもよい。たとえば、スレッド２１１のディスパッチ周期が６０［マイクロ秒］であり、スレッド２１２のディスパッチ周期が４０［マイクロ秒］である場合に、算出部３０３は、競合周期を６０×４０＝２４００［マイクロ秒］として算出する。２つのスレッドのディスパッチ周期が互いに素であれば、算出部３０３は、全ての競合周期を算出できる。
【００４１】
また、算出部３０３は、競合周期の算出方法として、スレッド２１１のディスパッチ周期とスレッド２１２のディスパッチ周期の公倍数を求めることで、競合周期を算出してもよい。スレッド２１１のディスパッチ周期が６０［マイクロ秒］であり、スレッド２１２のディスパッチ周期が４０［マイクロ秒］であれば、算出部３０３は、競合周期を最小公倍数ＬＣＭ（６０、４０）＝１２０［マイクロ秒］として算出してもよい。
【００４２】
また、算出部３０３は、第１のコアに第１のスレッドが割り当てられる時刻より前で第２のスレッドが第２のコアに最後に割り当てられた時刻と第１および第２の周期とを取得する。続けて、算出部３０３は、競合周期として第１のスレッドが割り当てられる時刻以降で最初のアクセス競合が発生する時刻を算出してもよい。これにより、算出部３０３は、最初のアクセス競合が発生するまでのオフセット時間を算出することになる。
【００４３】
たとえば、算出部３０３は、ＣＰＵ＃０にスレッド２１１が割り当てられる時刻より前でスレッド２１２がＣＰＵ＃１に最後に割り当てられた時刻とスレッド２１１およびスレッド２１２のディスパッチ周期を取得する。説明を簡略化するため、スレッド２１１が割り当てられる時刻を基準とし、スレッド２１２がＣＰＵ＃１に最後に割り当てられた時刻を−１０［マイクロ秒］とする。また、スレッド２１１およびスレッド２１２のディスパッチ周期をそれぞれ３０［マイクロ秒］、５０［マイクロ秒］とする。
【００４４】
この例では、スレッド２１１は、αを非負整数とし、０、３０、６０、９０、１２０、・・・、α・３０［マイクロ秒］の時にＣＰＵ＃０に割り当てられる。同様に、スレッド２１２は、βを非負整数とし、−１０、４０、９０、１４０、・・・、（β・５０−１０）［マイクロ秒］の時にＣＰＵ＃１に割り当てられる。このとき、アクセス競合を起こす時刻＝α・３０＝β・５０−１０を満たしており、前述の例では、α＝３、β＝２となる９０［マイクロ秒］の時に、最初のアクセス競合が発生する。具体的なα、βの算出方法については、図９にて後述する。なお、算出された競合周期は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ１０３などに記憶される。
【００４５】
選択部３０４は、算出部３０３によって算出された競合周期にて割り当てられる第１および第２のスレッドのうち、いずれか一方のスレッドが割り当てられるコアにおける競合周期の前後いずれかの時刻に割り当てられるスレッドを選択する機能を有する。また、選択部３０４は、設定部３０６、設定部３０７によって任意のスレッドの割り当てを開始する時刻が同一の時刻に設定された場合、算出部３０３によって算出された競合周期にてスレッドを選択してもよい。
【００４６】
たとえば、選択部３０４は、アクセス競合を発生させるスレッド２１１とスレッド２１２のうち、スレッド２１１をいずれか一方のスレッドとし、スレッド２１１の前後に割り当てられるスレッド２２２かスレッド２２１のいずれかのスレッドを選択する。この場合、入替部３０５は、ＣＰＵ＃０の機能となる。
【００４７】
また、選択部３０４が、スレッド２１１とスレッド２１２のうち、スレッド２１２をいずれか一方のスレッドとした場合、スレッド２１２の前後に割り当てられるスレッド２２５かスレッド２２３のいずれかのスレッドを選択する。この場合、入替部３０５は、ＣＰＵ＃１の機能となる。なお、選択されたスレッドの情報は、ＣＰＵ＃０のレジスタ、キャッシュメモリ、ＲＡＭ１０３などに記憶される。
【００４８】
入替部３０５は、選択部３０４でのいずれか一方のスレッドが割り当てられる時刻と、選択部３０４によって選択されたスレッドが割り当てられる時刻と、を入れ替える機能を有する。たとえば、入替部３０５は、選択部３０４によってスレッド２２３が選択された場合、スレッド２１２が割り当てられる時刻と、スレッド２２３が割り当てられる時刻と、を入れ替える。具体的な入れ替え方法については、図７にて後述する。なお、スレッドが割り当てられる時刻を入れ替えたという情報は、ＣＰＵ＃１のレジスタ、キャッシュメモリ、ＲＡＭ１０３などに記憶されてもよい。
【００４９】
設定部３０６、設定部３０７は、算出部３０３によって競合周期が算出された場合、第１および第２のコアに割り当てられる任意のスレッドの割り当てを開始する時刻を同一の時刻に設定する機能を有する。たとえば、設定部３０６、設定部３０７は、バリア同期機構２０５によって、ＣＰＵ＃０とＣＰＵ＃１で割り当てられるスレッドの割り当てを開始する時刻を同一の時刻に設定する。なお、同一の時刻に設定したという情報は、各ＣＰＵのレジスタ、キャッシュメモリ、ＲＡＭ１０３などに記憶されてもよい。
【００５０】
図４は、スレッド制御処理を行うための開発時および実行時の動作概要を示す説明図である。符号４０１で示す処理は、マルチコアプロセッサシステム１００の開発時に行われる処理であり、符号４０２で示す処理は、マルチコアプロセッサシステム１００の実行時に行われる処理である。
【００５１】
開発時には、スレッド２１１用のソースコードから、コンパイラは、実行コードの生成および共用リソースへのアクセス情報を解析し、スレッド２１１の実行コードと、スレッド２１１に対応する共用リソースアクセス情報データベース３０１を出力する。同様に、コンパイラは、スレッド２１２用のソースコードから、スレッド２１２の実行コードとスレッド２１２に対応する共用リソースアクセス情報データベース３０１を出力する。同様に、コンパイラは、スレッド２１３用のソースコードから、スレッド２１３の実行コードとスレッド２１３に対応する共用リソースアクセス情報データベース３０１を出力する。
【００５２】
実行時には、マルチコアプロセッサシステム１００は、開発時に生成された実行コードによって、マルチスレッドを複数のＣＰＵで同時実行する。また、マルチコアプロセッサシステム１００は、共用リソースアクセス情報データベース３０１を参照し、複数のスレッドが同一時刻に共用リソースにアクセスしないように、スレッドのディスパッチの順序を入れ替える。
【００５３】
図５は、マルチコアプロセッサシステム１００の開発時の概要を示す説明図である。また、図５では、開発時に生成される共用リソースアクセス情報データベース３０１の詳細についても説明を行う。
【００５４】
コンパイラは、入力されたソースコードから、実行コードを生成する際に、共用リソース情報と共用リソースへのアクセス情報を生成する。共用リソース情報は、マルチコアプロセッサシステム１００の共用リソースの情報が記載されており、入力されたソースコードや、Ｍａｋｅｆｉｌｅ上の情報から生成される。共用リソースへのアクセス情報は、共用リソースへのアクセス情報がスレッドごとに記載しており、コンパイラの一部の機能であるリンカによって生成される。コンパイラは、共用リソース情報と共用リソースへのアクセス情報とから、共用リソースアクセス情報データベース３０１を生成する。
【００５５】
共用リソースアクセス情報データベース３０１は、共用リソースへのアクセス情報をスレッドごとに記載している。共用リソースアクセス情報データベース３０１には、大項目としてスレッドフィールドが存在し、スレッドフィールドの内部にＣＰＵフィールドが存在し、ＣＰＵフィールドの内部にアクセスフィールドが存在する。
【００５６】
スレッドフィールドは、スレッドの名称が設定されており、たとえば、“スレッド：スレッド２１１”のように設定される。ＣＰＵフィールドは、スレッドが割り当てられたＣＰＵ番号が設定されており、たとえば、ｍ番目のＣＰＵであるＣＰＵ＃ｍに割り当てられた場合、“ＣＰＵ：ｍ”のように設定される。なお、ＣＰＵフィールドは、実行時に、ディスパッチスケジューラ２０４により動的に決定される。アクセスフィールドは、割り当てられたスレッドがアクセスする共用リソース名が設定されており、たとえば、“アクセス：共用リソース２０１”のように設定される。
【００５７】
図６は、スレッドディスパッチの概要を示す説明図である。ＣＰＵに割り当てられたスレッドは、ディスパッチスケジューラ２０４によって周期的に実行される。図６の例では、図２で示したように、ＣＰＵ＃０は実行中のスレッド数Ｍ０＝３となり、具体的にはスレッド２１１、スレッド２２１、スレッド２２２を実行している。ＣＰＵ＃１は、実行中のスレッド数Ｍ１＝４となり、スレッド２１２、スレッド２２３〜スレッド２２５を実行している。また、スレッド２１１とスレッド２１２は、共用リソース２０１にアクセスする。スレッド２２１〜スレッド２２５は、ＯＳ管轄下のシステムスレッドや共用リソースの競合に関係のないスレッドである。
【００５８】
また、ディスパッチスケジューラ２０４は、各スレッドを時分割でＣＰＵに割り当てる。その際の１単位となる時間をディスパッチ時間τとし、図６の例では、ＣＰＵ＃０のディスパッチ時間τ＃０とＣＰＵ＃１のディスパッチ時間τ＃１とは、τ＃０＝τ＃１＝τとする。また、各スレッドが何単位目でＣＰＵに割り当てられるかを示すインターバルをＴとする。インターバルＴは、優先度が高いほどより頻繁にＣＰＵに割り当てられるようになるため、値が小さくなる。このように、インターバルＴは、優先度の逆数の関係となる。図６の例では、スレッド２１１のインターバルＴ２１１＝３となり、スレッド２１２のインターバルＴ２１２＝４となる。
【００５９】
ここで、運用時におけるマルチコアプロセッサシステム１００の例では、スレッド数Ｍ＝５０〜１００程度のスレッドを実行している。また、ディスパッチスケジューラ２０４は、ＯＳなどで設定されるディスパッチ時間τ＝１〜１００［マイクロ秒］でスレッドを割り当てている。ディスパッチ時間が数マイクロ秒である場合、マルチコアプロセッサシステム１００はリアルタイムシステムと呼ばれる。
【００６０】
たとえば、マルチコアプロセッサシステム１００の各コアのクロック数が全て等しく、優先度が最低であるスレッドのインターバルＴ＝スレッド数Ｍ＝５０であり、ディスパッチ時間τ＝５０［マイクロ秒］である場合を想定する。この場合、優先度が最低であるスレッドは、２５００［マイクロ秒］に一度、５０［マイクロ秒］間実行する。また、優先度が最高であるスレッドは、Ｔ＝２であり、５０［マイクロ秒］ごとに５０［マイクロ秒］間実行される。
【００６１】
スレッドのインターバルＴとディスパッチ時間τを乗算することで、図３で説明したスレッドがディスパッチされるディスパッチ周期を算出することができる。前述の例では、優先度が最低であるスレッドのディスパッチ周期は５０×５０＝２５００［マイクロ秒］となり、優先度が最高であるスレッドのディスパッチ周期は２×５０＝１００［マイクロ秒］となる。
【００６２】
図６の例では、スレッド２１１は、ディスパッチスケジューラ２０４＃０によって、時刻ｔ０、時刻ｔ３、時刻ｔ６、時刻ｔ９、時刻ｔ１２にτ＃０時間分ＣＰＵ＃０で実行される。また、スレッド２１２は、ディスパッチスケジューラ２０４＃１によって、時刻ｔ０、時刻ｔ４、時刻ｔ８、時刻ｔ１２にτ＃１時間分ＣＰＵ＃１で実行される。
【００６３】
ここで、ＣＰＵ＃０は、スレッド２１１のディスパッチ周期Ｔ２１１・τ＃０とディスパッチ周期Ｔ２１２・τ＃１の最小公倍数ＬＣＭ（Ｔ２１１・τ＃０、Ｔ２１２・τ＃１）＝１２τを算出する。時刻ｔ０に算出された値である１２τを加算した時刻ｔ１２にて、スレッド２１１とスレッド２１２が実行されることで、共用リソース２０１に対するアクセス競合が発生することになる。また、時刻ｔ１２にさらにＬＣＭ（Ｔ２１１τ＃０、Ｔ２１２τ＃１）を加算した時刻でもアクセス競合が発生する。このように、図６の例では、ＬＣＭ（Ｔ２１１・τ＃０、Ｔ２１２・τ＃１）を１周期とする競合周期にて、アクセス競合が発生することになる。
【００６４】
図６の例を一般化すると、マルチコアプロセッサシステム１００にて、同一のリソースにアクセスする２つのスレッドのインターバルＴｘ、Ｔｙと、２つのスレッドが割り当てられるＣＰＵ＃ｍ、ＣＰＵ＃ｎのディスパッチ時間τｍ、τｎを想定する。このとき、ＬＣＭ（Ｔｘτｍ、Ｔｙτｎ）を求めることで、マルチコアプロセッサシステム１００は、アクセス競合が発生する競合周期を算出することができる。
【００６５】
図７は、ディスパッチの順序を入れ替える方法の概要を示す説明図である。図７では、図６にて競合周期を算出した際に、アクセス競合を回避する方法として、ディスパッチの順序を入れ替える方法を図示している。符号７０１に示す説明図は、アクセス競合に関係のないスレッドが実行している場合のディスパッチデータ７０４の状態を示している。符号７０２に示す説明図は、符号７０１の状態から、アクセス競合を発生させるスレッドが実行された場合のディスパッチデータ７０４の状態を示している。符号７０３に示す説明図は、符号７０２の状態から、アクセス競合を発生させるスレッドのディスパッチの順序を変更した場合のディスパッチデータ７０４の状態を示している。
【００６６】
符号７０１に示す説明図は、アクセス競合に関係のないスレッドの実行中の状態として、スレッド２２１とスレッド２２２が実行している場合のディスパッチデータ７０４の状態を示している。ディスパッチデータ７０４は、ディスパッチスケジューラ２０４によってアクセスされ、実行中のスレッドへのポインタを格納している。
【００６７】
ディスパッチデータ７０４の構造は、実行中の各スレッドが単方向に連結された単方向リストとなる。具体的には、ディスパッチデータ７０４の各要素は、データ部とポインタ部で成り立ち、データ部には、スレッドコンテキストへのポインタが格納され、ポインタ部には、次の要素へのポインタが格納されている。また、最後の要素のポインタ部には先頭の要素のポインタが格納されている。
【００６８】
たとえば、符号７０１に示す説明図におけるディスパッチデータ７０４は、要素７０５と要素７０６で成り立っている。要素７０５は、データ部にスレッド２２１のコンテキストへのポインタが格納されており、ポインタ部に要素７０６へのポインタが格納されている。また、要素７０６は、データ部にスレッド２２２のコンテキストへのポインタが格納されており、ポインタ部に要素７０５へのポインタが格納されている。
【００６９】
たとえば、ＣＰＵ＃０にてスレッド２２１が実行中で、次のスレッドを割り当てる場合を想定する。ディスパッチスケジューラ２０４＃０は、現在実行中のスレッドの要素へのポインタを保持しており、保持していたポインタから、要素７０５を取得する。続けて、ディスパッチスケジューラ２０４＃０は、要素７０５のポインタ部から要素７０６を取得する。符号７０１に示す説明図の状態におけるＣＰＵ＃０は、スレッド２２１→スレッド２２２→スレッド２２１→…という順序でスレッドを実行する。
【００７０】
符号７０２に示す説明図は、符号７０１の状態から、アクセス競合を発生させるスレッドが実行された場合として、スレッド２１１が新たにＣＰＵ＃０に割り当てられた場合のディスパッチデータ７０４の状態を示している。スレッド２２２の次にスレッド２１１が割り当てられるようにする場合、ディスパッチスケジューラ２０４＃０は、初めに、ディスパッチデータ７０４の内部に要素７０７を確保し、要素７０７のデータ部にスレッド２１１のコンテキストへのポインタを格納する。
【００７１】
また、ポインタ部の操作として、ディスパッチスケジューラ２０４＃０は、要素７０６のポインタ部に格納されていた要素７０５へのポインタを消去し、要素７０７へのポインタとして付け替える。さらに、ディスパッチスケジューラ２０４＃０は、要素７０７のポインタ部に要素７０５へのポインタを設定する。これにより、符号７０２に示す説明図の状態におけるＣＰＵ＃０は、スレッド２２１→スレッド２２２→スレッド２１１→スレッド２２１→スレッド２２２→…という順序でスレッドを実行する。
【００７２】
符号７０３に示す説明図は、符号７０２の状態から、アクセス競合を発生させるスレッドのディスパッチの順序を変更した場合として、スレッド２１１とスレッド２２１の割り当ての順序を入れ替えた場合のディスパッチデータ７０４の状態を示している。また、入れ替えを行うタイミングとしては、符号７０２の状態にて、ＣＰＵ＃０がスレッド２２１→スレッド２２２まで割り当てた状態で、スレッド２１１を割り当てようとするタイミングとする。
【００７３】
スレッド２２２の割り当て後、スレッド２１１の代わりにスレッド２２１を割り当てるため、ディスパッチスケジューラ２０４＃０は、要素７０６のポインタ部を、要素７０７へのポインタから要素７０５へのポインタへ付け替える。また、スレッド２２１の割り当て後、スレッド２１１を割り当てるため、ディスパッチスケジューラ２０４＃０は、要素７０５のポインタ部を、要素７０６へのポインタから要素７０７へのポインタへ付け替える。また、スレッド２１１の割り当て後、スレッド２２２を割り当てるため、ディスパッチスケジューラ２０４＃０は、要素７０７のポインタ部を、要素７０５へのポインタから要素７０６へのポインタへ付け替える。
【００７４】
これにより、符号７０３に示す説明図の状態におけるＣＰＵ＃０は、スレッド２２１→スレッド２２２、ここで入れ替えが発生し、スレッド２２１→スレッド２１１→スレッド２２２→…という順序でスレッドを実行する。なお、図７の例では、ディスパッチスケジューラ２０４＃０は、時系列で隣あった２つのスレッドの割り当ての順序を入れ替えたが、４つ以上スレッドが実行されている場合に、時系列で離れたスレッドの割り当ての順序を入れ替えてもよい。
【００７５】
図８は、スレッド制御処理を行ったタイムチャートを示す説明図である。図８では、図６で示したタイミングでアクセス競合が発生する場合に、図７で示したディスパッチの時順序を入れ替えた場合のタイムチャートを示している。また、図８と後述する図９において、説明の簡略化のため、ディスパッチ時間τは全て等しく、時刻ｔ０、時刻１、・・・、時刻ｔｎの各時間間隔もτとする。
【００７６】
時刻ｔ０にて、ＣＰＵ＃０は、共用リソースアクセス情報データベース３０１から、スレッド２１１とスレッド２１２が共用リソース２０１にアクセスすることを検出すると、競合周期を算出し、競合周期にマーキングを設定する。図８の例では、ＣＰＵ＃０は、時刻ｔ１２にマーキング８０１を設定する。具体的な設定方法としては、ディスパッチスケジューラ２０４＃０の変数となるカウンタを確保し、カウンタに１２を設定する。ＣＰＵ＃０は、設定されたカウンタ分スレッドを割り当てた時に、マーキングを設定した時刻であると判断してもよい。
【００７７】
また、マーキング８０１を設定するＣＰＵは、アクセス競合を発生させるスレッドを割り当てるＣＰＵのうち、どのＣＰＵであってもよい。たとえば、ＣＰＵ＃０は、ＣＰＵ番号の小さいＣＰＵとなるＣＰＵ＃０にマーキング８０１を設定してもよい。また、同時刻に３つ以上のスレッドがアクセス競合を発生させると検出された場合、検出されたスレッドを割り当てるＣＰＵのうち、任意の１つのＣＰＵを除いた他のＣＰＵにマーキング８０１を設定してもよい。たとえば、ＣＰＵ＃０〜ＣＰＵ＃２にてアクセス競合を発生させるスレッドが実行される場合、ＣＰＵ＃０は、ＣＰＵ＃０とＣＰＵ＃１にマーキングを設定してもよい。
【００７８】
マーキング８０１が設定されたあと、ＣＰＵ＃０は、スレッドの実行タイミングを揃えるために、バリア同期機構２０５＃０とバリア同期機構２０５＃１によって、ＣＰＵ＃０とＣＰＵ＃１にバリア同期を実行させる。
【００７９】
マーキング８０１が設定された時刻である時刻ｔ１２になった場合、ＣＰＵ＃０は、スレッド２１１が割り当てられる時刻とスレッド２２１が割り当てられる時刻を入れ替える。具体的には、ＣＰＵ＃０は、スレッド２１１が割り当てられる時刻を時刻ｔ１２から時刻ｔ１３にし、スレッド２２１が割り当てられる時刻を時刻ｔ１３から時刻ｔ１２にする。また、ＣＰＵ＃０は、スレッド２２１の割り当て終了時刻となる時刻ｔ１３にて、ＣＰＵ０とＣＰＵ＃１にバリア同期を実行する。これにより、次の競合周期でも、実行タイミングを揃えることができる。また、時刻ｔ１３にてバリア同期を行うことで、ＣＰＵ＃１によるスレッド２１２の割り当てが完了するまで、ＣＰＵ＃０がスレッド２１１を割り当てることはないため、アクセス競合を回避することができる。
【００８０】
また、ＣＰＵ＃２は、共用リソース２０２にアクセスするスレッド２１３を時刻ｔ７、時刻ｔ１０、時刻ｔ１３で実行し、ＣＰＵ＃３は、共用リソース２０２にアクセスするスレッド２１４を時刻ｔ８、時刻ｔ１１で実行する。インターバルＴ２１３＝インターバルＴ２１４＝３となり、スレッドを実行する周期が一致しており、起動するタイミングが異なる場合には、アクセス競合が発生しないため、マーキングを行わない。
【００８１】
図９は、新たにスレッドを起動した際のタイムチャートを示す説明図である。図８では、時刻ｔ０におけるスレッド２１１とスレッド２１２のように、起動タイミングが揃っていた場合の競合周期を算出した。図９では、特定の共用リソースにアクセスするスレッドがＣＰＵに既に割り当てられている場合に、他のＣＰＵに同じ共用リソースにアクセスするスレッドが割り当てられた場合における初回のアクセス競合が発生するまでのオフセット時間について説明を行う。
【００８２】
図９におけるマルチコアプロセッサシステム１００は、図２で示したソフトウェアの実行状態とは異なる。具体的には、ＣＰＵ＃０は、時刻ｔ３まではスレッド数Ｍ０＝２であり、さらに時刻ｔ４にて、新たなスレッドとして共用リソース２０１にアクセスするスレッド９０１を割り当て、Ｍ０＝３となっている。また、スレッド９０１のインターバルＴ９０１は３となり、スレッド９０１は、時刻ｔ４の後、時刻ｔ７、時刻ｔ１０、時刻ｔ１３にて割り当てられる。
【００８３】
ＣＰＵ＃１は、スレッド数Ｍ１＝５であり、共用リソース２０１にアクセスするスレッド９０２を時刻ｔ３にて割り当てている。また、スレッド９０２のインターバルＴ９０２は５であり、時刻ｔ３の後、時刻ｔ８、時刻ｔ１３にて割り当てられる。
【００８４】
ＣＰＵ＃２は、時刻ｔ０ではスレッド数Ｍ２＝３であり、さらにスレッド９０４とスレッド９０５の優先度が高い状態であり、時刻ｔ１にて、新たなスレッドとして共用リソース２０２にアクセスするスレッド９０３を割り当て、Ｍ２＝４となっている。また、スレッド９０３のインターバルＴ９０３は６となり、時刻ｔ１の後、時刻ｔ７、時刻ｔ１３にて割り当てられる。
【００８５】
ＣＰＵ＃３は、スレッド数Ｍ３＝４であり、共用リソース２０２にアクセスするスレッド９０６を時刻ｔ０にて割り当てている。また、スレッド９０６のインターバルＴ９０６は４であり、時刻ｔ０の後、時刻ｔ４、時刻ｔ８、時刻ｔ１２にて割り当てられる。
【００８６】
以下、図９の示すタイムチャートを利用して、ＣＰＵ＃０による共用リソース２０１にアクセスするスレッド９０１とスレッド９０２による競合周期の算出方法を説明する。続けて、ＣＰＵ＃２による共用リソース２０２にアクセスするスレッド９０３とスレッド９０６による競合周期の算出方法を説明する。
【００８７】
初めに、ＣＰＵ＃０は、スレッド９０１が割り当て開始した時刻から、アクセス競合を発生させる他のスレッドが最後に割り当てられるまでの時間ｔを取得する。図９の例では、スレッド９０２が最後に割り当てられた時刻はｔ３であるため、ＣＰＵ＃０は、時刻ｔ４からスレッド９０２が最後に割り当てられるまでの時間ｔ９０２＝−τを取得する。
【００８８】
次に、αとβを非負整数とし、時刻ｔ４を基準とした際のアクセス競合が発生する時刻は、下記（１）式を満たすことになる。
【００８９】
アクセス競合の時刻＝Ｔ９０１・τ・α＝Ｔ９０２・τ・β＋ｔ９０２…（１）
【００９０】
（１）式の最小のα、βの組合せを求めることで、アクセス競合を発生する時刻を算出することができる。（１）式は、合同方程式で表現でき、下記（２）式となる。
【００９１】
Ｔ９０２・τ・β≡−ｔ９０２（ｍｏｄ  Ｔ９０１・τ）…（２）
【００９２】
式（２）に、ＣＰＵ＃０は、Ｔ９０１＝３、Ｔ９０２＝５、ｔ９０２＝−τを設定し、τで除算することで、下記（３）式を得る。
【００９３】
５β≡１（ｍｏｄ  ３）…（３）
【００９４】
一次合同式となる（３）式はたとえば、以下のように解くことができる。（３）式において、５−３＝２であるため、ＣＰＵ＃０は、下記（４）式を得る。
【００９５】
２β≡１（ｍｏｄ  ３）…（４）
【００９６】
合同式の性質に従って、（４）式を２倍することで、ＣＰＵ＃０は、下記（５）式を得る。
【００９７】
４β≡２（ｍｏｄ  ３）…（５）
【００９８】
（４）式から（５）式を減じることで、ＣＰＵ＃０は、（６）式を得る。
【００９９】
β≡−１（ｍｏｄ  ３）…（６）
【０１００】
（６）式より、β＝３Ｎ−１（Ｎ＝０、１、２、３、４、…）となるが、βは非負整数であるため、最小のβ＝２となり、対応するαを（１）式から算出すると、α＝３となる。したがって、アクセス競合の時刻は、時刻ｔ４に、９τを加算した時刻ｔ１３となる。また、次のアクセス競合の時刻については、時刻ｔ１３から、ＬＣＭ（Ｔ９０１・τ、Ｔ９０２・τ）を加算した時刻となる。
【０１０１】
なお、（３）式の解法は多く知られており、たとえば、ＣＰＵ＃０は、ガウスの計算法によって算出してもよい。また、別の解法として、ＣＰＵ＃０は、逆元を算出してβを算出してもよい。具体的には、３を法とする５の逆元２を求め、（３）式の両辺に逆元２を乗算することで、解を算出する。逆元の算出方法としては、たとえば、拡張ユークリッドの互除法によって、算出することができる。
【０１０２】
次に、ＣＰＵ＃２による共用リソース２０２にアクセスするスレッド９０３とスレッド９０６による競合周期の算出方法を説明する。ＣＰＵ＃２は、スレッド９０３が割り当て開始した時刻から、アクセス競合を発生させる他のスレッドが最後に割り当てられるまでの時間ｔを取得する。図９の例では、スレッド９０６が最後に割り当てられた時刻はｔ０であるため、ＣＰＵ＃０は、時刻ｔ１からスレッド９０２が最後に割り当てられるまでの時間ｔ９０６＝−τを取得する。
【０１０３】
アクセス競合が発生する時刻は、（１）式を適用することで、ＣＰＵ＃２は、下記（７）式を得る。
【０１０４】
アクセス競合の時刻＝Ｔ９０３・τ・α＝Ｔ９０６・τ・β＋ｔ９０６…（７）
【０１０５】
（７）式に対して、（２）式、（３）式で行った手順を行うことで、ＣＰＵ＃２は、下記（８）式を得る。
【０１０６】
４β≡１（ｍｏｄ  ６）…（８）
【０１０７】
一次合同式となる（８）式はβについて解を持たない。もしβが解を持つ場合、合同式の定義より、４β−１は６の倍数となり偶数となるが、４βが偶数であるため、４β−１は奇数となり、矛盾するからである。解を持たない場合、アクセス競合が発生しないということになるため、ＣＰＵ＃０は、マーキングを行わない。
【０１０８】
また、一次合同式ａｘ≡ｂ（ｍｏｄ  ｍ）の解ｘが存在するか否かは、ａとｍの最大公約数ＧＣＤ（ａ、ｍ）がｂを割り切れるという条件と同値である。たとえば、（３）式の例では、ａ＝５、ｂ＝１、ｍ＝３から、ＧＣＤ（５、３）＝１となり、ｂ＝１を割り切れるため、解が存在する。（８）式の例では、ａ＝４、ｂ＝１、ｍ＝６からＧＣＤ（４、６）＝２となり、ｂ＝１を割り切れないため、解を持たない。このように、ＣＰＵ＃０は、（１）式から、各変数を代入し、（３）式、（８）式のような一次合同式を得た状態で、前述の解を持つか否かを前述の条件で判断することで、アクセス競合が発生するか否かを判断してもよい。
【０１０９】
図８、図９にて示すタイムチャートを実現するため、マルチコアプロセッサシステム１００は、図１０〜図１３に示すスレッド制御処理を実行し、アクセス競合を回避する。図１０では、スレッドが新たに割り当てられた場合のスレッド制御処理のフローチャートを示し、図１１、図１２では、スレッド制御処理内部で実行される競合周期算出処理のフローチャートを示している。図１３では、マルチコアプロセッサシステム１００のディスパッチ時間τまたはインターバルＴが変更した場合のスレッド制御処理を示すフローチャートを示している。
【０１１０】
図１３に示すスレッド制御処理が適用される場合は、たとえば、特定のＣＰＵのディスパッチ時間τが変更され、全てのスレッドに対する競合周期の再計算を要する場合に適用される。ディスパッチ時間τが変更される場合は、たとえば、実行中のスレッドの優先度がＯＳ、またはスレッド自身によって変更された場合である。
【０１１１】
図１０は、スレッド制御処理を示すフローチャートである。ＣＰＵ＃０は、ユーザからの操作などにより、スレッドの起動要求を受け付ける（ステップＳ１００１）。受け付け後、ＣＰＵ＃０は、ディスパッチスケジューラ２０４＃０によってスレッドを起動するＣＰＵを決定し（ステップＳ１００２）、決定されたＣＰＵにスレッド情報を通知する。図１０の例では、ｍ番目のＣＰＵとして、ＣＰＵ＃ｍにてスレッドを起動すると想定する。
【０１１２】
また、スレッドを起動するＣＰＵの決定後、ＣＰＵ＃０は、共用リソースアクセス情報データベース３０１を更新し（ステップＳ１００３）、ＣＰＵ＃０におけるスレッド制御処理を終了する。共用リソースアクセス情報データベース３０１の更新例としては、ＣＰＵ＃０は、共用リソースアクセス情報データベース３０１のＣＰＵフィールドに、スレッドを起動するＣＰＵのＣＰＵ番号を設定する。
【０１１３】
スレッド情報の通知を受けたＣＰＵ＃ｍは、起動するスレッドの実行コードをＲＡＭ１０３にロードする（ステップＳ１００４）。ロード後、ＣＰＵ＃ｍは、競合周期算出処理を実行する（ステップＳ１００５）。処理を実行後、ＣＰＵ＃ｍは、起動するスレッドをディスパッチデータ７０４に登録する（ステップＳ１００６）。登録後、ＣＰＵ＃ｍは、競合周期算出処理の結果から、起動するスレッドが共用リソースに対するアクセス競合を発生させるか否かを判断する（ステップＳ１００７）。
【０１１４】
アクセス競合を発生させる場合（ステップＳ１００７：Ｙｅｓ）、ＣＰＵ＃ｍは、競合周期のマーキングを、アクセス競合を発生させるスレッドを実行するＣＰＵに通知する（ステップＳ１００８）。なお、アクセス競合を発生させるスレッドを実行するＣＰＵは、少なくとも２つ以上存在するため、ＣＰＵ＃ｍは、そのうち任意の１つのＣＰＵを除いたＣＰＵにマーキングを通知する。図１０の例では、ｎ番目のＣＰＵとして、ＣＰＵ＃ｎにマーキングを通知すると想定する。
【０１１５】
たとえば、起動するスレッドを実行するＣＰＵ＃ｍがＣＰＵ＃０であり、アクセス競合を発生させるスレッドを実行するＣＰＵが、ＣＰＵ＃０とＣＰＵ＃１であった場合、ＣＰＵ＃０とＣＰＵ＃１のいずれか一つをＣＰＵ＃ｎとし、マーキングを通知する。また、アクセス競合を発生させるスレッドを実行するＣＰＵが、ＣＰＵ＃０〜ＣＰＵ＃２であれば、ＣＰＵ＃０は、たとえば、ＣＰＵ＃０とＣＰＵ＃１に、マーキングを通知してもよい。
【０１１６】
マーキングの通知後、ＣＰＵ＃ｍは、バリア同期機構２０５によってバリア同期を実行する（ステップＳ１００９）。なお、バリア同期は、アクセス競合を発生させるスレッドを実行するＣＰＵ全てに対して発行される。起動するスレッドがアクセス競合を発生させない場合（ステップＳ１００７：Ｎｏ）、または、ステップＳ１００９の処理を終了後、ＣＰＵ＃ｍは、起動するスレッドを実行し（ステップＳ１０１０）、ＣＰＵ＃ｍにおけるスレッド制御処理を終了する。
【０１１７】
マーキングの通知を受けたＣＰＵ＃ｎは、スレッドをディスパッチする際に、マーキングされたタイミングか否かを判断する（ステップＳ１０１１）。マーキングされたタイミングである場合（ステップＳ１０１１：Ｙｅｓ）、ＣＰＵ＃ｎは、ディスパッチの順序を後方のスレッドと入れ替える（ステップＳ１０１２）。入れ替え後、ＣＰＵ＃ｎは、後方だったスレッド実行後、バリア同期を実行する（ステップＳ１０１３）。ステップＳ１０１３の処理を終了後、または、マーキングされたタイミングでない場合（ステップＳ１０１１：Ｎｏ）、ＣＰＵ＃ｎは、ＣＰＵ＃ｍにおけるスレッド制御処理を終了する。
【０１１８】
なお、ステップＳ１０１２にて、ＣＰＵ＃ｎは、ディスパッチの順序を後方のスレッドと入れ替えているが、ディスパッチ時間が１単位以上離れているスレッドと入れ替えてもよい。特に、ディスパッチ時間が１単位以上離れているスレッドとの入れ替えは、ステップＳ１００８にて、アクセス競合を発生させるスレッドを実行するＣＰＵが３つ以上存在し、マーキングを２つ以上のＣＰＵに通知した場合に有効である。このとき、通知を受けたＣＰＵのうち、１番目のＣＰＵは、すぐ後方のスレッドと入れ替え、２番目のＣＰＵは、ディスパッチ時間が１単位離れているスレッドと入れ替える。
【０１１９】
アクセス競合を発生させるスレッドを実行するＣＰＵが３つあり、通知された２つのＣＰＵが後方のスレッドで入れ替えを行うと、競合周期にディスパッチ時間を加えた時刻にてアクセス競合が発生する。しかし、ディスパッチ時間が１単位離れているスレッドと入れ替えることで、競合周期の時刻、競合周期にディスパッチ時間を加えた時刻、競合周期にディスパッチ時間を２単位分加えた時刻の全てにおいて、共用リソースへのアクセス競合を回避できる。
【０１２０】
また、図１０のフローチャートでは、ＣＰＵ＃ｎは、後方のスレッドと入れ替えを行っていたが、前方のスレッドと入れ替えを行ってもよい。前方のスレッドと入れ替えを行う場合、たとえば、ステップＳ１０１１にて、ＣＰＵ＃ｎは、マーキングされたタイミングよりディスパッチ時間が１単位早い時刻かを判断する。１単位早い時刻である場合に、ＣＰＵ＃ｎは、これから割り当てを行うスレッドの割り当て時刻と、１単位後に割り当てるアクセス競合を発生させるスレッドの割り当て時刻と、を入れ替えることで、前方のスレッドと入れ替えを行うことができる。
【０１２１】
図１１は、競合周期算出処理を示すフローチャートである。競合周期算出処理は、起動するスレッドを実行するＣＰＵで実行される。図１１の説明では、図１０の説明に合わせるため、ＣＰＵ＃ｍが競合周期算出処理を実行するとして説明を行う。
【０１２２】
ＣＰＵ＃ｍは、起動するスレッドをＴＨｘとして設定し（ステップＳ１１０１）、変数ｉに１を設定する（ステップＳ１１０２）。設定後、ＣＰＵ＃ｍは、マルチコアプロセッサシステム１００で実行中のスレッドのうち、ｉ番目のスレッドＴＨｉが存在するかを判断する（ステップＳ１１０３）。スレッドＴＨｉが存在する場合（ステップＳ１１０３：Ｙｅｓ）、ＣＰＵ＃ｍは、スレッドＴＨｘとスレッドＴＨｉが同一の共用リソースにアクセスするかを判断する（ステップＳ１１０４）。同一の共用リソースにアクセスする場合（ステップＳ１１０４：Ｙｅｓ）、ＣＰＵ＃ｍは、スレッドＴＨｘとスレッドＴＨｉが同一ＣＰＵで実行されるかを判断する（ステップＳ１１０５）。
【０１２３】
スレッドＴＨｘとスレッドＴＨｉが同一ＣＰＵで実行される場合（ステップＳ１１０５：Ｙｅｓ）、ＣＰＵ＃ｍは、ＬＣＭ（Ｔｘτｘ、Ｔｉτｉ）を算出し、競合周期に設定する（ステップＳ１１０６）。なお、Ｔｘ、τｘは、スレッドＴＨｘのインターバルＴｘとディスパッチ時間τｘを意味し、Ｔｉ、τｉは、スレッドＴＨｉのインターバルＴｉとディスパッチ時間τｉを意味する。競合周期を設定後、ＣＰＵ＃ｍは、スレッドＴＨｘ、スレッドＴＨｉを、アクセス競合を発生させるスレッドに設定し（ステップＳ１１０７）、変数ｉをインクリメントし（ステップＳ１１０８）、ステップＳ１１０３の処理に移行する。
【０１２４】
同一の共用リソースにアクセスしない場合（ステップＳ１１０４：Ｎｏ）、または、同一ＣＰＵで実行されない場合（ステップＳ１１０５：Ｎｏ）、ＣＰＵ＃ｍは、ステップＳ１１０８の処理に移行する。全てのスレッドについて探索し、スレッドＴＨｉが存在しない場合（ステップＳ１１０３：Ｎｏ）、ＣＰＵ＃ｍは、競合周期算出処理を終了する。
【０１２５】
図１２は、スレッドの起動タイミングが異なる場合、初回の競合周期までのオフセット時間と競合周期を算出する競合周期算出処理を示すフローチャートである。競合周期算出処理は、起動するスレッドを実行するＣＰＵで実行される。図１２の説明でも、図１１と同様に、図１０の説明に合わせるため、ＣＰＵ＃ｍが競合周期算出処理を実行するとして説明を行う。また、図１２内のステップＳ１２０１〜ステップＳ１２０５とステップＳ１２１１とステップＳ１２１２は、それぞれステップＳ１１０１〜ステップＳ１１０５とステップＳ１１０７とステップＳ１１０８と等しい処理を行うため、説明を省略する。
【０１２６】
ＣＰＵ＃ｍは、スレッドＴＨｘが起動する時刻から、ＴＨｉが最後に割り当てられるまでの時間ｔｉを取得する（ステップＳ１２０６）。取得後、ＣＰＵ＃ｍは、βＴｉτｉ≡−ｔｉ（ｍｏｄ  Ｔｘτｘ）となる一次合同式にて、非負整数となるβについて解が存在するかを判断する（ステップＳ１２０７）。なお、一次合同式の解が存在するか否かの判断方法は、図９に記載した方法で判断してもよい。
【０１２７】
解が存在する場合（ステップＳ１２０７：Ｙｅｓ）、ＣＰＵ＃ｍは、βＴｉτｉ≡−ｔｉ（ｍｏｄ  Ｔｘτｘ）から、Ｔｘτｘを法とするＴｉτｉの逆元ａを算出する（ステップＳ１２０８）。算出後、β≡−ａ・ｔｉ（ｍｏｄ  Ｔｘτｘ）、かつβが非負整数となる最小のβを算出する（ステップＳ１２０９）。なお、ステップＳ１２０８、ステップＳ１２０９による一次合同式の解法について、ＣＰＵ＃ｍは、図９で記載したガウスの計算法によって算出してもよい。
【０１２８】
βを算出後、ＣＰＵ＃ｍは、βＴｉτｉ＋ｔｉを初回の競合タイミングまでのオフセット時間として設定し、ＬＣＭ（Ｔｘτｘ、Ｔｉτｉ）を競合周期として設定し（ステップＳ１２１０）、ステップＳ１２１１の処理に移行する。また、一次合同式の解が存在しない場合（ステップＳ１２０７：Ｎｏ）、ＣＰＵ＃ｍは、ステップＳ１２１２の処理に移行する。
【０１２９】
図１３は、マルチコアプロセッサシステム１００のディスパッチ時間またはインターバルが変更した場合のスレッド制御処理を示すフローチャートである。図１３で示すスレッド制御処理は、どのＣＰＵでも実行可能であるが、説明の簡略化のため、ＣＰＵ＃０で実行される場合を想定する。
【０１３０】
ＣＰＵ＃０は、変数ｊに１を設定し（ステップＳ１３０１）、ＣＰＵ＃０は、マルチコアプロセッサシステム１００で実行中のスレッドのうち、スレッドＴＨｊが存在するかを判断する（ステップＳ１３０２）。スレッドＴＨｊが存在する場合（ステップＳ１３０２：Ｙｅｓ）、ＣＰＵ＃０は、スレッドＴＨｊを対象のスレッドとなるＴＨｘとして設定する（ステップＳ１３０３）。設定後、ＣＰＵ＃０は、競合周期算出処理の内部で使用される変数ｉにｊ＋１を設定して、競合周期算出処理を実行する（ステップＳ１３０４）。
【０１３１】
具体的には、ＣＰＵ＃０は、たとえば図１１にて、ステップＳ１１０１の処理で設定したＴＨｘについて、ステップＳ１３０３の処理で設定したｊ番目のスレッドを設定する。また、ＣＰＵ＃０は、ステップＳ１１０２の処理で設定した変数ｉについて、ｊ＋１を設定し、競合周期算出処理を実行する。図１２で示した競合周期算出処理も同様である。
【０１３２】
競合周期算出処理の実行後、ＣＰＵ＃０は、スレッドＴＨｘが共用リソースに対するアクセス競合を発生させるかを判断する（ステップＳ１３０５）。アクセス競合を発生させる場合（ステップＳ１３０５：Ｙｅｓ）、ＣＰＵ＃０は、競合周期のマーキングを、アクセス競合を発生させるスレッドを実行するＣＰＵに通知する（ステップＳ１３０６）。マーキングの通知後、ＣＰＵ＃０は、バリア同期機構２０５によってバリア同期を実行する（ステップＳ１３０７）。なお、バリア同期は、アクセス競合を発生させるスレッドを実行するＣＰＵ全てに対して発行される。
【０１３３】
バリア同期を実行後、または、アクセス競合が発生しない場合（ステップＳ１３０５：Ｎｏ）、ＣＰＵ＃０は、変数ｊをインクリメントし（ステップＳ１３０８）、ステップＳ１３０２の処理に移行する。全てのスレッドについて探索し、スレッドＴＨｊが存在しない場合（ステップＳ１３０２：Ｎｏ）、ＣＰＵ＃０は、スレッド制御処理を終了する。
【０１３４】
なお、図１３に示すスレッド制御処理では、複数回の最小公倍数の計算を行うことになる。具体的には、マルチコアプロセッサシステム１００にて、共用リソースにアクセスするスレッドがＮ個あり、スレッドＴＨｎ（ｎ＝１、２、・・・、Ｎ）のインターバルＴｎ、ディスパッチ時間τｎ、ディスパッチ周期Ｔｎτｎと想定する。スレッドＴＨ１のアクセス競合の算出対象となるスレッド数はＮ−１個となる。具体的には、ＣＰＵ＃０は、スレッドＴＨ１に対するアクセス競合としてＬＣＭ（ＴＨ１・τ１、ＴＨ２・τ２）、ＬＣＭ（ＴＨ１・τ１、ＴＨ３・τ３）、・・・、ＬＣＭ（ＴＨ１・τ１、ＴＨＮ・τＮ）を算出する。ただし、ＴＨ１と同一のＣＰＵで実行されるスレッドは算出対象に含まれない。
【０１３５】
同様に、スレッドＴＨ１のアクセス競合の算出対象となるスレッド数はＮ−２個となる。具体的には、ＣＰＵ＃０は、スレッドＴＨ２に対するアクセス競合としてＬＣＭ（ＴＨ２・τ２、ＴＨ３・τ３）、ＬＣＭ（ＴＨ２・τ２、ＴＨ４・τ４）、・・・、ＬＣＭ（ＴＨ２・τ２、ＴＨＮ・τＮ）を算出する。ＣＰＵ＃０は、前述のように算出を続ける。このように、算出対象となるスレッド数は減少していき、スレッドＴＨＮのアクセス競合の算出対象となるスレッド数は０個となる。
【０１３６】
以上より、アクセス競合の算出回数は、Σｎ（ｎ＝１．．Ｎ−１）＝（１／２）・Ｎ・（Ｎ−１）回となる。たとえば、マルチコアプロセッサシステム１００のスレッド数Ｎ＝４である場合、算出回数は６回となる。図１３に示すスレッド制御処理が発生する機会は、数秒に１回のため、図１３に示すスレッド制御処理に伴うオーバーヘッドの増加は微小である。
【０１３７】
以上説明したように、マルチコアプロセッサシステム、スレッド制御方法、およびスレッド制御プログラムによれば、２つのコアで周期的に実行され、共用リソースに対してアクセス競合する２つのスレッドの周期から競合周期を算出する。競合周期にて、マルチコアプロセッサシステムは、片方のスレッドの割り当て時刻を、片方のスレッドの前後のスレッドの割り当て時刻と入れ替える。これにより、マルチコアプロセッサシステムは、共用リソースへのアクセス時刻をずらすためアクセス競合を回避でき、アクセス競合させる２つのスレッドを実行できるため、処理性能を維持することができる。
【０１３８】
また、競合周期の算出方法としては、たとえば、２つのスレッドのディスパッチ周期を乗算して算出してもよい。これにより、マルチコアプロセッサシステムは、大きな負荷をかけることなく競合周期を算出することができる。また、２つのスレッドのディスパッチ周期が互いに素であれば、競合するタイミングを全て算出することができる。
【０１３９】
また、マルチコアプロセッサシステムは、競合周期を２つのスレッドのディスパッチ周期の公倍数によって算出してもよい。これにより、マルチコアプロセッサシステムは、２つのスレッドの競合するタイミングを全て算出でき、全てのアクセス競合を回避しつつ、処理性能を維持することができる。
【０１４０】
また、マルチコアプロセッサシステムは、２つのスレッドのうち第１のスレッドが割り当てられる時刻からみて、第２のスレッドが最後に割り当てられた時刻と、第１および第２のスレッドのディスパッチ周期から、競合周期までのオフセット時間を算出してもよい。これにより、マルチコアプロセッサシステムは、２つのスレッドの割り当てを開始する時刻が異なる場合でも、初回のアクセス競合が発生するタイミングを算出でき、アクセス競合を回避しつつ、処理性能を維持することができる。
【０１４１】
また、マルチコアプロセッサシステムは、アクセス競合が発生する２つのコアにて、任意のスレッドの割り当てを開始する時刻を同一の時刻に設定してもよい。通常、２つのコアでスレッドが割り当てられる場合、割り当てられる時刻はコア間で同一でない。したがって、マルチコアプロセッサシステムが競合周期を算出しても、スレッドを割り当てられる時刻がコアによって異なり、アクセス競合を発生させてしまう場合も存在する。
【０１４２】
具体的には、第１および第２のコアのディスパッチ時間を５０［マイクロ秒］とし、第２のコアのスレッド割り当て時刻が第１のコアのスレッド割り当て時刻より２［マイクロ秒］遅い場合を想定する。競合周期が２５０［マイクロ秒］と算出された場合、第１のスレッドは２５０〜３００［マイクロ秒］、第２のスレッドは２５２〜３０２［マイクロ秒］で割り当てられることになる。もし、第１のスレッドが後方のスレッドと入れ替わり、３００〜３５０［マイクロ秒］で割り当てられた場合、２５２〜３００［マイクロ秒］のアクセス競合は回避できたが、３００〜３０２［マイクロ秒］のアクセス競合は回避できていない状態になる。
【０１４３】
前述の状態を避けるため、バリア同期等により、スレッドの割り当てを開始する時刻を同一の時刻に設定することで、マルチコアプロセッサシステムは、アクセス競合を回避しつつ、処理性能を維持することができる。
【０１４４】
また、本実施の形態におけるマルチコアプロセッサシステムは、キューイングやスレッドの実行抑止といった実行制限を行わないため、制限を受けるスレッド側は、性能劣化せず、処理性能を維持することができる。
【０１４５】
また、本実施の形態におけるマルチコアプロセッサシステムは、特別なハードウェア機構は不要だが、共用リソースのための特別なハードウェア機構が搭載されたマルチコアプロセッサシステムに対して、本実施の形態を適用しても効果をあげることができる。
【０１４６】
たとえば、共用リソースの運用方式として、キューイング方式２が適用されたマルチコアプロセッサシステムに本実施の形態を適用する場合を想定する。キューイング方式２に本実施の形態が適用されたマルチコアプロセッサシステムの場合、調停回路にアクセス要求が蓄積することがないため、調停回路への電力を切断しても、マルチコアプロセッサシステムは正常に動作することができる。このように、本実施の形態を適用することにより不要となるハードウェア機構の電源を切断でき、消費電力を低下させることができる。
【０１４７】
なお、本実施の形態で説明したスレッド制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本スレッド制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本スレッド制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０１４８】
＃０、＃１  ＣＰＵ
１０３  ＲＡＭ
１１０  バス
２０１  共用リソース
２１１、２１２、２２１、２２２、２２３、２２５  スレッド
３０１  共用リソースアクセス情報データベース
３０２  検出部
３０３  算出部
３０４  選択部
３０５  入替部
３０６、３０７  設定部
【図１】
2012014313.tif 000003
【図２】
2012014313.tif 000004
【図３】
2012014313.tif 000005
【図４】
2012014313.tif 000006
【図５】
2012014313.tif 000007
【図６】
2012014313.tif 000008
【図７】
2012014313.tif 000009
【図８】
2012014313.tif 000010
【図９】
2012014313.tif 000011
【図１０】
2012014313.tif 000012
【図１１】
2012014313.tif 000013
【図１２】
2012014313.tif 000014
【図１３】
2012014313.tif 000015
【国際調査報告】
2012014313.tif 000016
2012014313.tif 000017
2012014313.tif 000018
2012014313.tif 000019