(57)【特許請求の範囲】
【請求項１】
第１のコアモデルと第２のコアモデルを備えるマルチコアプロセッサモデルを用いて検証対象ソフトウェアを模擬するコンピュータに、
前記検証対象ソフトウェアの模擬中に前記第１のコアモデルに割り当てられた生成元スレッドから対象スレッドの生成命令を検出する検出工程と、
前記検出工程により前記対象スレッドの生成命令が検出されると、前記対象スレッドの生成命令の一命令前における前記生成元スレッドの実行状態を保持する保持工程と、
前記検出工程により前記対象スレッドの生成命令が検出された場合、前記第２のコアモデルに前記対象スレッドを割り当てる割り当て工程と、
前記割り当て工程により前記第２のコアモデルへ前記対象スレッドが割り当てられると、前記対象スレッドを所定遅延時間遅延させてから実行する実行制御工程と、
前記第１のコアモデル上で、マルチスレッド環境において前記対象スレッドを実行させた場合の前記生成元スレッドの第１の実行結果と、前記実行制御工程により遅延させて前記対象スレッドを実行させた場合の前記生成元スレッドの第２の実行結果とが一致するか否かを判断する一致判断工程と、
前記一致判断工程により前記第１の実行結果と前記第２の実行結果とが一致すると判断された場合、遅延させた場合の前記対象スレッドの実行開始時刻が前記生成元スレッドの実行終了時刻以降であるか否かを判断する時刻判断工程と、
前記時刻判断工程により前記対象スレッドの実行開始時刻が前記生成元スレッドの実行終了時刻以降でないと判断された場合、前記保持工程により保持された前記生成元スレッドの実行状態に設定する設定工程と、
前記所定遅延時間を所定時間長くする調整工程と、
前記一致判断工程により前記第１の実行結果と前記第２の実行結果とが不一致であると判断された場合、前記対象スレッドに排他制御が必要な旨の情報を出力し、前記時刻判断工程により前記対象スレッドの実行開始時刻が前記生成元スレッドの実行終了時刻以降であると判断された場合、前記対象スレッドに排他制御が必要でない旨の情報を出力する出力工程と、
を実行させ、
前記実行制御工程は、
前記設定工程による設定後の生成元スレッドを実行し、前記対象スレッドを前記調整工程により長くされた前記所定遅延時間遅延させてから実行することを特徴とする検証支援プログラム。
【請求項２】
第１のコアモデルと第２のコアモデルを備えるマルチコアプロセッサモデルを用いて検証対象ソフトウェアを模擬中に、前記第１のコアモデルに割り当てられた生成元スレッドから対象スレッドの生成命令を検出する検出手段と、
前記検出手段により前記対象スレッドの生成命令が検出されると、前記対象スレッドの生成命令の一命令前における前記生成元スレッドの実行状態を保持する保持手段と、
前記検出手段により前記対象スレッドの生成命令が検出された場合、前記第２のコアモデルに前記対象スレッドを割り当てる割り当て手段と、
前記割り当て手段により前記第２のコアモデルへ前記対象スレッドが割り当てられると、前記対象スレッドを所定遅延時間遅延させてから実行する実行制御手段と、
前記第１のコアモデル上で、マルチスレッド環境において前記対象スレッドを実行させた場合の前記生成元スレッドの第１の実行結果と、前記実行制御手段により遅延させて前記対象スレッドを実行させた場合の前記生成元スレッドの第２の実行結果とが一致するか否かを判断する一致判断手段と、
前記一致判断手段により前記第１の実行結果と前記第２の実行結果とが一致すると判断された場合、遅延させた場合の前記対象スレッドの実行開始時刻が前記生成元スレッドの実行終了時刻以降であるか否かを判断する時刻判断手段と、
前記時刻判断手段により前記対象スレッドの実行開始時刻が前記生成元スレッドの実行終了時刻以降でないと判断された場合、前記保持手段により保持された前記生成元スレッドの実行状態に設定する設定手段と、
前記所定遅延時間を所定時間長くする調整手段と、
前記一致判断手段により前記第１の実行結果と前記第２の実行結果とが不一致であると判断された場合、前記対象スレッドに排他制御が必要な旨の情報を出力し、前記時刻判断手段により前記対象スレッドの実行開始時刻が前記生成元スレッドの実行終了時刻以降であると判断された場合、前記対象スレッドに排他制御が必要でない旨の情報を出力する出力手段と、
を有し、
前記実行制御手段は、
前記設定手段による設定後の生成元スレッドを実行し、前記対象スレッドを前記調整手段により長くされた前記所定遅延時間遅延させてから実行することを特徴とする検証支援装置。
【請求項３】
第１のコアモデルと第２のコアモデルを備えるマルチコアプロセッサモデルを用いて検証対象ソフトウェアを模擬するコンピュータが、
前記検証対象ソフトウェアの模擬中に前記第１のコアモデルに割り当てられた生成元スレッドから対象スレッドの生成命令を検出する検出工程と、
前記検出工程により前記対象スレッドの生成命令が検出されると、前記対象スレッドの生成命令の一命令前における前記生成元スレッドの実行状態を保持する保持工程と、
前記検出工程により前記対象スレッドの生成命令が検出された場合、前記第２のコアモデルに前記対象スレッドを割り当てる割り当て工程と、
前記割り当て工程により前記第２のコアモデルへ前記対象スレッドが割り当てられると、前記対象スレッドを所定遅延時間遅延させてから実行する実行制御工程と、
前記第１のコアモデル上で、マルチスレッド環境において前記対象スレッドを実行させた場合の前記生成元スレッドの第１の実行結果と、前記実行制御工程により遅延させて前記対象スレッドを実行させた場合の前記生成元スレッドの第２の実行結果とが一致するか否かを判断する一致判断工程と、
前記一致判断工程により前記第１の実行結果と前記第２の実行結果とが一致すると判断された場合、遅延させた場合の前記対象スレッドの実行開始時刻が前記生成元スレッドの実行終了時刻以降であるか否かを判断する時刻判断工程と、
前記時刻判断工程により前記対象スレッドの実行開始時刻が前記生成元スレッドの実行終了時刻以降でないと判断された場合、前記保持工程により保持された前記生成元スレッドの実行状態に設定する設定工程と、
前記所定遅延時間を所定時間長くする調整工程と、
前記一致判断工程により前記第１の実行結果と前記第２の実行結果とが不一致であると判断された場合、前記対象スレッドに排他制御が必要な旨の情報を出力し、前記時刻判断工程により前記対象スレッドの実行開始時刻が前記生成元スレッドの実行終了時刻以降であると判断された場合、前記対象スレッドに排他制御が必要でない旨の情報を出力する出力工程と、
を実行し、
前記実行制御工程は、
前記設定工程による設定後の生成元スレッドを実行し、前記対象スレッドを前記調整工程により長くされた前記所定遅延時間遅延させてから実行することを特徴とする検証支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、回路情報をシミュレーションする検証支援プログラム、検証支援装置、および検証支援方法に関する。さらに、スレッドの割り当てを制御する制御プログラム、マルチコアプロセッサシステム、および制御方法に関する。
【背景技術】
【０００２】
従来、マルチスレッド処理を行う場合、スレッド間で依存関係のある共有データへのアクセス競合に対して共有データの一貫性を維持するために、排他制御が行われていた。排他制御の主な手法としてセマフォが挙げられる。マルチコアプロセッサを例に挙げると、セマフォでは、共有データへのアクセスに関して、先にアクセスしたスレッドを動かす一のＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）が該共有データにロックをかける。そして、該スレッドと異なるスレッドを動作する他のＣＰＵは一のＣＰＵがロックを解除するまで共有データへのアクセスは待ちとなる。【０００３】
他のＣＰＵは一定時間ごとにロックを示すロック変数の値を確認すること（スピンループ処理）によりロックの解除が行われたか否かを判断していた。これにより、ＣＰＵ間で共有データの一貫性を保つことができる。なお、共有データに対してセマフォによるロックをかけるか否かについては検証対象ソフトウェアを参照することで判断することができる（たとえば、下記特許文献１を参照。）。【０００４】
また、スレッド間でデータに依存関係があるか否かについては、コンパイラを用いて各変数の生存範囲解析を行うことで検出することができる（たとえば、下記特許文献２を参照。）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００２−１３２７４３号公報
【特許文献２】特開２００３−５９８１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、シングルコアプロセッサシステムを用いて正常に動作していたマルチスレッドを、マルチコアプロセッサシステムを用いて動作させると、正常に動作しない場合があった。シングルコアプロセッサシステムを用いた場合にデータに依存関係のある２つのスレッドであっても、実行結果が正常であればセマフォのような排他制御を行っていなかった。【０００７】
マルチコアプロセッサシステムでは、各ＣＰＵに複数のスレッドが割り当てられており、データ依存関係のある２つのスレッドが異なるＣＰＵに割り当てられると、該２つのスレッドの実行のタイミングがずれるという問題点があった。そのため、マルチコアプロセッサシステムを用いた場合の実行結果とシングルコアプロセッサシステムを用いた場合の実行結果とが異なるという問題点があった。【０００８】
利用者がスレッド間で依存関係のあるすべての共有データに対して排他制御を行うように検証対象プログラムをコーディングすることで、実行結果が異なるとういう問題点を解決することができる。しかしながら、スピンループ処理が行われると、ロック変数の確認のためだけにＣＰＵ資源を浪費してしまうため、セマフォをかける数が多いほど性能が劣化するという問題点があった。さらに、利用者がスレッド間で依存関係のある共有データに対して排他制御を行うか否かを判断するが、依存関係の有無の判断は非常に難しく、プログラムを安全に実行するために、本来必要ではない箇所に対しても排他制御をかけてしまい、ＣＰＵのスループットが下がるという問題点があった。【０００９】
本発明は、上述した従来技術による問題点を解消するため、排他制御が必要なスレッドを自動で特定することにより、必要最低眼のスレッドに対してのみセマフォを用意することができ、スピンループ処理によるＣＰＵの性能劣化を防止することができる検証支援プログラム、検証支援装置、および検証支援方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するため、開示の検証支援プログラム、検証支援装置、および検証支援方法は、第１のコアモデルと第２のコアモデルを備えるマルチコアプロセッサモデルを用いて検証対象ソフトウェアを模擬し、該検証対象ソフトウェアの模擬中に前記第１のコアモデルに割り当てられた生成元スレッドから対象スレッドの生成命令を検出し、前記対象スレッドの生成命令が検出された場合、前記第２のコアモデルに前記対象スレッドを割り当て、前記第２のコアモデルへ前記対象スレッドが割り当てられると、前記対象スレッドを所定遅延時間遅延させてから実行し、前記第１のコアモデル上で、マルチスレッド環境において前記対象スレッドを実行させた場合の前記生成元スレッドの第１の実行結果と、遅延させて前記対象スレッドを実行させた場合の前記生成元スレッドの第２の実行結果とが一致するか否かを判断し、前記第１の実行結果と前記第２の実行結果とが不一致であると判断された場合、前記対象スレッドに排他制御が必要な旨の情報を出力することを要件とする。
【発明の効果】
【００１１】
本検証支援プログラム、検証支援装置、および検証支援方法によれば排他制御が必要なスレッドを自動で特定することにより、必要最低眼のスレッドに対してのみセマフォを用意することができ、スピンループ処理によるＣＰＵの性能劣化を防止することができるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】本発明の一実施例を示す説明図である。
【図２】マルチコアプロセッサシステムモデルに関する回路情報を示す説明図である。
【図３】検証対象ソフトウェアの一例を示す説明図である。
【図４】検証対象ソフトウェア３００における変数の生存区間を示す説明図である。
【図５】データ依存テーブルの一例を示す説明図である。
【図６】実施の形態１にかかる検証支援装置のハードウェア構成を示すブロック図である。
【図７】検証支援装置６００の機能的構成を示すブロック図である。
【図８】マルチコアプロセッサシステムを用いて検証対象ソフトウェア３００がシミュレーションされている例を示す説明図である。
【図９】対象スレッド８０２が遅延されてから実行される例を示す説明図である。
【図１０】対象スレッド８０２を遅延する遅延時間が増える例１を示す説明図である。
【図１１】対象スレッド８０２を遅延する遅延時間が増える例２を示す説明図である。
【図１２】検証支援装置６００による検証処理手順の一例を示すフローチャートである。
【図１３】図１２で示した特定処理（ステップＳ１２０７）の詳細な説明を示すフローチャートである。
【図１４】図１２および図１３で示したスレッド管理テーブル１４００の一例を示す説明図である。
【図１５】図１２で示した特定処理（ステップＳ１２０８）の詳細な説明を示すフローチャートである。
【図１６】図１２および図１５で示したスレッド管理テーブル１６００の一例を示す説明図である。
【図１７】実施の形態２にかかるマルチコアプロセッサシステムのハードウェア構成を示す説明図である。
【図１８】実施の形態２にかかるスケジューラ１７２１の機能的構成を示すブロック図である。
【図１９】スケジューラ１７２１によるスレッドＡの割り当て例１を示す説明図である。
【図２０】スレッドＢがスピンループ処理を行う例を示す説明図である。
【図２１】スケジューラ１７２１によるスレッドＡの割り当て例２を示す説明図である。
【図２２】スケジューラ１７２１による制御処理手順を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下に添付図面を参照して、本発明にかかる検証支援プログラム、検証支援装置、および検証支援方法の好適な実施の形態を詳細に説明する。なお、スレッドとは周知のようにアプリケーション内で行われる処理の実行単位である。
【００１４】
図１は、本発明の一実施例を示す説明図である。まず、マルチコアプロセッサシステムモデルを用いて検証対象ソフトウェアをシミュレーションし、スレッド１０１から生成されたスレッド１０２が同一のプロセッサモデル上でマルチスレッド処理において実行された場合を例に挙げて説明する。変数ａ〜ｅまでの初期値は下記とする。
【００１５】
初期値：ａ＝０，ｂ＝１，ｃ＝２，ｄ＝３，ｅ＝０
【００１６】
スレッド１０１は一のＣＰＵモデルに割り当てられている。まず、検証支援装置はａ＝ｂとｃ＝ｄを計算する。ここで、ａは１となり、ｃは３となる。
【００１７】
そして、スレッド１０１が「ａ＝ｃ」の計算をスレッド１０２として生成する。そして、生成したスレッド１０２が「ａ＝ｃ」を計算し、ａは３となる。つぎに、「ｂ＝ｂ＋ｄ」により、ｂは４となり、「ｃ＝ｄ」によりｃは３となり、「ｅ＝ａ−ｃ」によりｅは０となり、「ｄ＝ｃ」によりｄは３となる。すなわち、シングルコア・マルチスレッド環境においてスレッド１０２を実行させた場合のスレッド１０１の第１の実行結果を下記に示す。
【００１８】
・第１の実行結果：ａ＝３，ｂ＝４，ｃ＝３，ｄ＝３，ｅ＝０
【００１９】
検証支援装置は、実行結果をアクセス可能な記憶装置に記憶して、該第１の実行結果を、遅延させてスレッド１０２を実行させた場合のスレッド１０１の第２の実行結果と比較するために用いる。
【００２０】
つぎに、スレッド１０１から生成されたスレッド１０２が負荷を与えられて実行された場合を例に挙げて説明する。まず、検証支援装置は「ａ＝ｂ」と「ｃ＝ｄ」とを計算する。ａは１となり、ｃは３となる。つぎに、「ａ＝ｃ」の計算があらたにスレッド１０２として生成されると、検証支援装置が、該スレッド１０２の生成を検出し、マルチコアプロセッサのうち、該親スレッドが割り当てられている一のＣＰＵモデルと異なる他のＣＰＵモデルに生成されたスレッドを割り当てる。
【００２１】
ここで、検証支援装置が、スレッド１０２に負荷を与えている。ここで、スレッド１０２に負荷を与えるとは、スレッド１０２をＤＥＬＡＹ分遅延させてから実行させることである。よって、図１では、「ｃ＝ｄ」のつぎに「ｂ＝ｂ＋ｄ」が計算され、「ｅ＝ａ―ｃ」が計算され、「ｄ＝ｃ」が計算されてから「ａ＝ｃ」が計算される。すなわち、遅延させてスレッド１０２を実行させた場合のスレッド１０１の第２の実行結果を下記に示す。
【００２２】
・第２の実行結果：ａ＝３，ｂ＝４，ｃ＝３，ｄ＝３，ｅ＝−３
【００２３】
そして、検証支援装置が、記憶装置に記憶されている第１の実行結果と第２の実行結果とが一致しているか否かを判断する。ここで、第１の実行結果と第２の実行結果とは変数ｅの値が異なるため、不一致であると判断される。不一致であると判断されると、検証支援装置は、スレッド１０１が排他制御を必要とするスレッドであることを出力する。なお、排他制御を必要とするスレッドとは、スレッド間で依存関係のあるデータに対して、排他制御が必要であることを意味する。図１では、スレッド間で依存関係のあるデータは変数ａである。
【００２４】
まず、実施の形態１では、スレッド間で依存関係のあるデータに排他制御の必要があるか否かを自動で特定する例と、排他制御が必要な場合であっても排他制御を必要としない遅延可能時間を特定する例とについて説明する。そして、実施の形態２では、マルチコアプロセッサシステムにおいてスケジューラが実施の形態１で特定された遅延可能時間を用いてスレッドの割り当て時に共有データに対してロックをかけるか否かを判断する例について説明する。
【００２５】
（実施の形態１）
（マルチコアプロセッサシステムモデルに関する回路情報）
図２は、マルチコアプロセッサシステムモデルに関する回路情報を示す説明図である。回路情報２００は、ＥＳＬ（Ｅｌｅｃｔｒｏｎｉｃ  Ｓｙｓｔｅｍ  Ｌｅｖｅｌ）用のモデルである。そして、回路情報２００は、マルチコアプロセッサモデルを備えるマルチコアプロセッサシステムモデルの各ＣＰＵモデルや該各ＣＰＵモデルの接続関係などがＳｙｓｔｅｍＣおよびＸＭＬ（Ｅｘｔｅｎｓｉｂｌｅ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）スクリプトによるハードウェア記述で表されている。
【００２６】
ここで、ＥＳＬ技術とは、システムＬＳＩの設計を、段階ごとに詳細性（抽象性）を変えながら行うシステム上流工程設計での高速シミュレーション技術である。ＥＳＬ技術では、詳細なクロック動作などを適宜スキップ、隠蔽することで高速動作を行うことができる。ＥＳＬ技術は、ＣＰＵのインストラクションシミュレータと連動させることで、ソフトウェア動作可能なシミュレーション環境として利用されている。ＥＳＬ技術は、ＳｏＣ（Ｓｙｓｔｅｍ  ｏｎ  ａ  Ｃｈｉｐ）などの大規模システムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｅｄ）開発に用いられる。
【００２７】
回路情報２００では、第１のＣＰＵモデル２０１と第２のＣＰＵモデル２０２と共有メモリモデル２０４が備えられている。各構成部はバスモデル２０３を介して接続されている。第１のＣＰＵモデル２０１と第２のＣＰＵモデル２０２とはそれぞれキャッシュやレジスタを備えている。検証支援装置がシミュレーションを実行すると、第１のＣＰＵモデル２０１はマスタＯＳ２１１を起動し、第２のＣＰＵモデル２０２はスレーブＯＳ２１２を起動する。
【００２８】
（検証対象ソフトウェア）
図３は、検証対象ソフトウェアの一例を示す説明図である。検証対象ソフトウェア３００では、プログラムの一例を示している。検証支援装置が、マルチコアプロセッサシステムを用いて検証対象ソフトウェア３００をシミュレーションすることで、検証対象ソフトウェア３００内にコーディングされている処理（スレッド）が第１のＣＰＵモデル２０１（または第２のＣＰＵモデル２０２）に割り当てられる。
【００２９】
検証対象ソフトウェア３００には、「ａ＝ｂ」と「ａ＝ｃ」と「ｃ＝ｄ」と「ｅ＝ａ−ｃ」との計算式と、スレッドの生成命令である「ｐｔｈｒｅａｄ＿ｃｒｅａｔｅ（）；」と、スレッドの結合命令である「ｐｔｈｒｅａｄ＿ｊｏｉｎ（）；」とがコーディングされている。検証対象ソフトウェア３００にコーディングされている処理を生成元スレッドと称する。
【００３０】
また、検証支援装置が、生成元スレッドから対象スレッドの生成命令を検出するとは、たとえば、「ｐｔｈｒｅａｄ＿ｃｒｅａｔｅ（）；」を検出することである。ここで、生成元スレッドから「ｐｔｈｒｅａｄ＿ｃｒｅａｔｅ（）；」により生成されるスレッドを対象スレッドと呼ぶ。
【００３１】
また、生成元スレッドと対象スレッド間で依存関係があるか否かについては、コンパイラにより検出することができる。つぎに、変数の生存区間について説明する。
【００３２】
図４は、検証対象ソフトウェア３００における変数の生存区間を示す説明図である。変数の生存区間とは、ある変数が検証対象ソフトウェア３００においてどこからどこまでの間で変化するかを示す。検証対象ソフトウェア３００の先頭で変数ａは「ａ＝ｂ」の計算が行われ、その後、「ａ＝ｃ」が行われている。よって、「ａ＝ｂ」から「ａ＝ｃ」までが変数ａの生存区間である。変数の生存区間は、検証対象ソフトウェア３００をコンパイラの解析部により検出することができる。
【００３３】
変数ａのように変数の生存区間がスレッドの生成命令をまたがっている場合、生成元スレッドと対象スレッドには依存関係がある。すなわち、変数の生存区間をコンパイラにより解析することで、生成元スレッドと対象スレッドとに依存関係があるか否かが判別される。さらに、コンパイラによりセマフォがあるか否かを解析することにより、各スレッドにセマフォがあるか否かが判別される。
【００３４】
（データ依存テーブル）
図５は、データ依存テーブルの一例を示す説明図である。データ依存テーブル５００では、親スレッドと該親スレッドにより生成される子スレッドとにデータの依存関係があるか否かと、親スレッドと子スレッドとにセマフォがあるか否かを示すテーブルである。データ依存テーブル５００は、子スレッドごとに用意されていることとする。なお、データ依存テーブル５００は、コンピュータがアクセス可能な記憶装置に記憶されている。
【００３５】
（実施の形態１にかかる検証支援装置のハードウェア構成）
図６は、実施の形態１にかかる検証支援装置のハードウェア構成を示すブロック図である。図６において、検証支援装置６００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）６０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）６０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）６０３と、磁気ディスクドライブ６０４と、磁気ディスク６０５と、光ディスクドライブ６０６と、光ディスク６０７と、ディスプレイ６０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）６０９と、キーボード６１０と、マウス６１１と、スキャナ６１２と、プリンタ６１３と、を備えている。また、各構成部はバス６１５によってそれぞれ接続されている。
【００３６】
ここで、ＣＰＵ６０１は、検証支援装置６００の全体の制御を司る。ＲＯＭ６０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ６０３は、ＣＰＵ６０１のワークエリアとして使用される。磁気ディスクドライブ６０４は、ＣＰＵ６０１の制御にしたがって磁気ディスク６０５に対するデータのリード／ライトを制御する。磁気ディスク６０５は、磁気ディスクドライブ６０４の制御で書き込まれたデータを記憶する。
【００３７】
光ディスクドライブ６０６は、ＣＰＵ６０１の制御にしたがって光ディスク６０７に対するデータのリード／ライトを制御する。光ディスク６０７は、光ディスクドライブ６０６の制御で書き込まれたデータを記憶したり、光ディスク６０７に記憶されたデータをコンピュータに読み取らせたりする。
【００３８】
ディスプレイ６０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ６０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００３９】
インターフェース（以下、「Ｉ／Ｆ」と略する。）６０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク６１４に接続され、このネットワーク６１４を介して他の装置に接続される。そして、Ｉ／Ｆ６０９は、ネットワーク６１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ６０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００４０】
キーボード６１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力を行う。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス６１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００４１】
スキャナ６１２は、画像を光学的に読み取り、検証支援装置６００内に画像データを取り込む。なお、スキャナ６１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ６１３は、画像データや文書データを印刷する。プリンタ６１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【００４２】
（検証支援装置６００の機能的構成）
図７は、検証支援装置６００の機能的構成を示すブロック図である。検証支援装置６００は、検出部７０１と、割り当て部７０２と、保持部７０３と、実行制御部７０４と、一致判断部７０５と、時刻判断部７０６と、設定部７０７と、調整部７０８と、出力部７０９と、を含む構成である。各機能（検出部７０１〜出力部７０９）は、具体的には、たとえば、図６に示したＲＯＭ６０２、ＲＡＭ６０３、磁気ディスク６０５、光ディスク６０７などの記憶装置に記憶されたプログラムをＣＰＵ６０１に実行させることにより、または、Ｉ／Ｆ６０９により、各機能を実現する。
【００４３】
まず、検出部７０１は、回路情報２００を用いて検証対象ソフトウェア３００のシミュレーション中に第１のＣＰＵモデル２０１に割り当てられた生成元スレッドから対象スレッドの生成命令を検出する。
【００４４】
割り当て部７０２は、検出部７０１により対象スレッドの生成命令が検出された場合、第２のＣＰＵモデル２０２に対象スレッドを割り当てる。なお、生成元スレッドが第１のＣＰＵモデル２０１に割り当てられているとし、対象スレッドを第２のＣＰＵモデル２０２に割り当てることとしているが、対象スレッドと生成元スレッドが異なるＣＰＵモデルに割り当てられればよい。
【００４５】
実行制御部７０４は、割り当て部７０２により第２のＣＰＵモデル２０２へ対象スレッドが割り当てられると、対象スレッドを所定遅延時間遅延させてから実行する。
【００４６】
一致判断部７０５は、シングルコア・マルチスレッド環境において対象スレッドを実行させた場合の生成元スレッドの第１の実行結果と、実行制御部７０４により遅延させて対象スレッドを実行させた場合の生成元スレッドの第２の実行結果とが一致するか否かを判断する。なお、シングルコア・マルチスレッド環境において対象スレッドを実行させた場合の生成元スレッドの第１の実行結果とは、マルチコアプロセッサシステムのモデルにおいて遅延させずに対象スレッドを実行させた場合の生成元スレッドの第１の実行結果と同一である。よって、第１の実行結果とは、遅延させずに対象スレッドを実行させた場合の生成元スレッドの実行結果である。
【００４７】
出力部７０９は、第１の実行結果と第２の実行結果とが不一致であると判断された場合、対象スレッドに排他制御が必要な旨の情報を出力する。
【００４８】
また、保持部７０３は、検出部７０１により対象スレッドの生成命令が検出されると、対象スレッドの生成命令の一命令前における生成元スレッドの実行状態を保持する。
【００４９】
そして、時刻判断部７０６は、一致判断部７０５により第１の実行結果と第２の実行結果とが一致すると判断された場合、遅延させた場合の対象スレッドの実行開始時刻が生成元スレッドの実行終了時刻以降であるか否かを判断する。
【００５０】
設定部７０７は、時刻判断部７０６により対象スレッドの実行開始時刻が生成元スレッドの実行終了時刻以降でないと判断された場合、保持部７０３により保持された生成元スレッドの実行状態に設定する。
【００５１】
調整部７０８は、所定遅延時間を所定時間長くする。そして、実行制御部７０４は、設定部７０７による設定後の生成元スレッドを実行し、対象スレッドを調整部７０８により長くされた所定遅延時間遅延させてから実行する。一致判断部７０５は、第１の実行結果と第２の実行結果とが一致するか否かを判断する。
【００５２】
また、出力部７０９は、時刻判断部７０６により対象スレッドの実行開始時刻が生成元スレッドの実行終了時刻以降であると判断された場合、対象スレッドに排他制御が必要でない旨の情報を出力する。
【００５３】
また、設定部７０７は、一致判断部７０５により第１の実行結果と第２の実行結果とが不一致であると判断された場合、生成元スレッドの実行状態を保持された生成元スレッドの実行状態に設定する。
【００５４】
調整部７０８は、所定遅延時間を所定時間短くする。つぎに、実行制御部７０４は、設定部７０７による設定後の生成元スレッドを実行し、対象スレッドを調整部７０８により短くした所定遅延時間遅延させてから実行する。
【００５５】
そして、一致判断部７０５は、短くした所定遅延時間遅延させて対象スレッドを実行制御部７０４により実行させた場合の生成元スレッドの第２の実行結果と、第１の実行結果とが一致するか否かを判断する。
【００５６】
出力部７０９は、一致判断部７０５により第１の実行結果と第２の実行結果とが一致すると判断された場合、短くした所定遅延時間を遅延可能時間とし、対象スレッドに排他制御が必要な旨の情報に遅延可能時間を関連付けて出力する。
【００５７】
以上を踏まえて図を用いて詳細に説明する。
【００５８】
図８は、マルチコアプロセッサシステムを用いて検証対象ソフトウェア３００がシミュレーションされている例を示す説明図である。図８では、検証対象ソフトウェア３００にコーディングされている生成元スレッド８０１が第１のＣＰＵモデル２０１に割り当てられて実行されて。具体的には、たとえば、ＣＰＵ６０１が、（１）検証対象ソフトウェア３００内にコーディングされている生成元スレッド８０１から対象スレッド８０２の生成命令を検出する。
【００５９】
そして、具体的には、たとえば、ＣＰＵ６０１が、対象スレッド８０２の生成命令を検出すると、データ依存テーブル５００に基づいて対象スレッド８０２と生成元スレッド８０１とに依存関係があるか否かを判断する。対象スレッド８０２と生成元スレッド８０１とに依存関係があると判断された場合、ＣＰＵ６０１が、対象スレッド８０２にセマフォがあるか否かをデータ依存テーブル５００に基づいて判断する。対象スレッド８０２にセマフォがないと判断された場合、ＣＰＵ６０１が、（２）対象スレッド８０２を第２のＣＰＵモデル２０２に割り当てる。そして、具体的には、たとえば、ＣＰＵ６０１が、対象スレッド８０２の生成命令の一つ前の命令の生成元スレッド８０１の実行状態を保存する。ここで、実行状態とは、具体的には、たとえば、各変数の値と、検証対象ソフトウェア３００上での実行位置である。
【００６０】
図９は、対象スレッド８０２が遅延されてから実行される例を示す説明図である。あらかじめ遅延させる所定遅延時間を定義し、ＣＰＵ６０１が、該所定遅延時間分対象スレッド８０２の実行を遅延させる。本実施の形態では、所定遅延時間をＤＥＬＡＹとし、所定時間をＤＥＬとしている。ここでは、たとえば、ＤＥＬ＝１［μｓ］とする。まず、ＤＥＬＡＹ＝ＤＥＬとし、対象スレッド８０２が第２のＣＰＵモデル２０２に割り当てられ、ＤＥＬＡＹ分遅延されて実行されている。
【００６１】
そして、たとえば、ＣＰＵ６０１が、生成元スレッド８０１および対象スレッド８０２の実行が終了すると、記憶装置から、シングルコア・マルチスレッド環境において対象スレッド８０２が実行された場合の生成元スレッド８０１の第１の実行結果を取得する。なお、ここでは、遅延されずに対象スレッド８０２が実行された場合の生成元スレッド８０１の第１の実行結果は、図１で示した第１の実行結果と同一であり、ＲＡＭ６０３、磁気ディスク６０５、光ディスク６０７などの記憶装置に記憶されていることとする。つぎに、ＣＰＵ６０１が、遅延されて対象スレッド８０２が実行された第２の実行結果と取得した第１の実行結果が一致するか否かを判断する。ここで、第１の実行結果と第２の実行結果とを下記に示す。ここでは、第１の実行結果と第２の実行結果とは一致すると判断される。
【００６２】
・第１の実行結果：ａ＝３，ｂ＝４，ｃ＝３，ｄ＝３，ｅ＝０
・第２の実行結果：ａ＝３，ｂ＝４，ｃ＝３，ｄ＝３，ｅ＝０
【００６３】
そして、第１の実行結果と第２の実行結果が一致すると判断された場合、具体的には、たとえば、ＣＰＵ６０１が、対象スレッド８０２の実行開始時刻が生成元スレッド８０１の実行終了時刻以降であるか否かを判断する。なお、たとえば、ＣＰＵ６０１は、各スレッドの実行開始時刻や実行終了時刻についてはあらかじめ実行時および実行終了時にＲＡＭ６０３、磁気ディスク６０５、光ディスク６０７などの記憶装置に記憶することとする。ここでは、ＣＰＵ６０１が、対象スレッド８０２の実行開始時刻が生成元スレッド８０１の実行終了時刻以降でないと判断する。
【００６４】
図１０は、対象スレッド８０２を遅延する遅延時間が増える例１を示す説明図である。対象スレッド８０２の実行開始が生成元スレッド８０１の実行終了よりも早いと判断されると、ＣＰＵ６０１が、ＤＥＬＡＹ＝ＤＥＬＡＹ＋ＤＥＬとし、生成元スレッド８０１の実行状態を保存した実行状態に設定する。
【００６５】
生成元スレッド８０１の実行状態を保存した実行状態に設定するとは、ＣＰＵ６０１が、たとえば、第１のＣＰＵモデル２０１の命令位置を保存された実行状態の実行位置にジャンプさせる。そして、ＣＰＵ６０１が、第１のＣＰＵモデル２０１のキャッシュに記憶されている各変数を該保存された実行状態の各変数に変更することである。
【００６６】
つぎに、具体的には、たとえば、ＣＰＵ６０１が、生成元スレッド８０１を実行し、対象スレッド８０２をＤＥＬＡＹ分遅延させてから実行する。そして、たとえば、ＣＰＵ６０１が、生成元スレッド８０１および対象スレッド８０２の実行が終了すると、記憶装置から第１の実行結果を取得する。以下に第１の実行結果と第２の実行結果を示す。
【００６７】
・第１の実行結果：ａ＝３，ｂ＝４，ｃ＝３，ｄ＝３，ｅ＝０
・第２の実行結果：ａ＝３，ｂ＝４，ｃ＝３，ｄ＝３，ｅ＝０
【００６８】
ここでは、第１の実行結果と第２の実行結果が一致すると判断される。そして、第１の実行結果と第２の実行結果が一致すると判断された場合、具体的には、たとえば、ＣＰＵ６０１が、対象スレッド８０２の実行開始が生成元スレッド８０１の実行終了よりも早いか否かを判断する。
【００６９】
第１の実行結果と第２の実行結果が一致すると判断された場合には、対象スレッド８０２の実行開始時刻が生成元スレッド８０１の実行終了時刻以降であると判断されるまで、ＣＰＵ６０１がＤＥＬＡＹを増加し、遅延させて対象スレッド８０２を実行する処理を繰り返す。
【００７０】
図１１は、対象スレッド８０２を遅延する遅延時間が増える例２を示す説明図である。具体的には、たとえば、ＣＰＵ６０１が、ＤＥＬＡＹ＝ＤＥＬＡＹ＋ＤＥＬとし、生成元スレッド８０１の実行状態を保存した対象スレッド８０２の生成命令直前までの生成元スレッド８０１の実行状態に戻す。
【００７１】
つぎに、具体的には、たとえば、ＣＰＵ６０１が、生成元スレッド８０１を実行し、対象スレッド８０２をＤＥＬＡＹ分遅延させてから実行する。以下に第１の実行結果と第２の実行結果を示す。
【００７２】
・第１の実行結果：ａ＝３，ｂ＝４，ｃ＝３，ｄ＝３，ｅ＝０
・第２の実行結果：ａ＝３，ｂ＝４，ｃ＝３，ｄ＝３，ｅ＝−３
【００７３】
ここでは、第１の実行結果と第２の実行結果が一致しないと判断され、具体的には、たとえば、ＣＰＵ６０１が、対象スレッド８０２にセマフォが必要であることを出力する。たとえば、対象スレッド８０２と検証対象ソフトウェア３００で対象スレッド８０２の行番号等を併せて出力してもよい。出力形式としては、たとえば、ディスプレイ６０８への表示、プリンタ６１３への印刷出力、Ｉ／Ｆ６０９による外部装置への送信がある。また、ＲＡＭ６０３、磁気ディスク６０５、光ディスク６０７などの記憶装置に記憶することとしてもよい。
【００７４】
（検証支援装置６００による検証処理手順）
図１２は、検証支援装置６００による検証処理手順の一例を示すフローチャートである。まず、検証支援装置６００が、検証対象ソフトウェアを実行し（ステップＳ１２０１）、検出部７０１により、実行中のスレッド（生成元スレッド）から対象スレッドの生成命令を検出したか否かを判断する（ステップＳ１２０２）。検証支援装置６００が、対象スレッドの生成命令を検出していないと判断した場合（ステップＳ１２０２：Ｎｏ）、ステップＳ１２０２へ戻る。一方、検証支援装置６００が、対象スレッドの生成命令を検出したと判断した場合（ステップＳ１２０２：Ｙｅｓ）、対象スレッドがセーフスレッドに登録されているか、またはセマフォの必要ありと判断されたか否かを判断する（ステップＳ１２０３）。セーフスレッドとは、セマフォの必要がないスレッドを示している。
【００７５】
検証支援装置６００が、対象スレッドがセーフスレッドに登録されている、またはセマフォの必要ありと判断されていると判断した場合（ステップＳ１２０３：Ｙｅｓ）、任意のＣＰＵモデルに割り当て、対象スレッドを実行し（ステップＳ１２０４）、検証対象ソフトウェアが終了したか否かを判断する（ステップＳ１２０５）。検証支援装置６００が検証対象ソフトウェアが終了していないと判断した場合（ステップＳ１２０５：Ｎｏ）、ステップＳ１２０２へ戻る。
【００７６】
一方、検証支援装置６００が、対象スレッドがセーフスレッドに登録されていない、かつセマフォの必要ありと判断されていないと判断した場合（ステップＳ１２０３：Ｎｏ）、対象スレッドと生成元スレッドとに依存関係があり、かつセマフォがないかを判断する（ステップＳ１２０６）。
【００７７】
検証支援装置６００が、対象スレッドと生成元スレッドとに依存関係がない、またはセマフォがあると判断した場合（ステップＳ１２０６：Ｎｏ）、ステップＳ１２０４へ移行する。一方、検証支援装置６００が、対象スレッドと生成元スレッドとに依存関係があり、かつセマフォがないと判断した場合（ステップＳ１２０６：Ｙｅｓ）、特定処理を実行し（ステップＳ１２０７（またはステップＳ１２０８））、ステップＳ１２０１へ戻る。
【００７８】
一方、ステップＳ１２０５において、検証支援装置６００が、検証対象ソフトウェアが終了したと判断した場合（ステップＳ１２０５：Ｙｅｓ）、一連の処理を終了する。
【００７９】
図１３は、図１２で示した特定処理（ステップＳ１２０７）の詳細な説明を示すフローチャートである。まず、検証支援装置６００が、保持部７０３により、対象スレッドの生成命令の一つ前の命令の生成元スレッドの実行状態を保存する（ステップＳ１３０１）。そして、検証支援装置６００が、割り当て部７０２により、対象スレッドを生成元スレッドと異なるＣＰＵモデルに割り当てる（ステップＳ１３０２）。
【００８０】
そして、検証支援装置６００が、ＤＥＬＡＹ＝ＤＥＬとし（ステップＳ１３０３）、実行制御部７０４により、対象スレッドをＤＥＬＡＹ分遅延させてから実行する（ステップＳ１３０４）。つぎに、検証支援装置６００が、一致判断部７０５により、シングルコア・マルチスレッド環境において対象スレッドを実行させた場合の生成元スレッドの第１の実行結果と遅延させて対象スレッドを実行させた場合の生成元スレッドの第２の実行結果とが一致するか否かを判断する（ステップＳ１３０５）。
【００８１】
まず、第１の実行結果と第２の実行結果とが不一致であると判断された場合（ステップＳ１３０５：Ｎｏ）、検証支援装置６００が、出力部７０９により、対象スレッドにセマフォの必要があることを出力し（ステップＳ１３０６）、ステップＳ１２０１へ戻る。ここでは、検証支援装置６００がスレッド管理テーブル１４００に出力している。スレッド管理テーブルの例は後述する。一方、第１の実行結果と第２の実行結果とが一致すると判断された場合（ステップＳ１３０５：Ｙｅｓ）、検証支援装置６００が、時刻判断部７０６により、対象スレッドの実行開始時刻が生成元スレッドの実行終了時刻以降であるか否かを判断する（ステップＳ１３０７）。
【００８２】
対象スレッドの実行開始時刻が生成元スレッドの実行終了時刻以降であると判断された場合（ステップＳ１３０７：Ｙｅｓ）、検証支援装置６００が、出力部７０９により、対象スレッドをスレッド管理テーブル１４００内のセーフスレッドに登録し（ステップＳ１３０８）、ステップＳ１２０１へ戻る。一方、対象スレッドの実行開始時に生成元スレッドの実行が終了していないと判断された場合（ステップＳ１３０７：Ｎｏ）、検証支援装置６００が、調整部７０８により、ＤＥＬＡＹ＝ＤＥＬＡＹ＋ＤＥＬとする（ステップＳ１３０９）。検証支援装置６００が、設定部７０７により、対象スレッドの実行状態を保存した実行状態に設定し（ステップＳ１３１０）、ステップＳ１３０４へ戻る。
【００８３】
図１３では、ＤＥＬＡＹを増加させているが、検証支援装置６００が、生成元スレッドの実行時間より大きい値をＤＥＬＡＹに設定し、第１の実行結果と第２の実行結果とが一致するか否かを判定し、セマフォの必要があるか否かを判断しても良い。
【００８４】
図１４は、図１２および図１３で示したスレッド管理テーブル１４００の一例を示す説明図である。スレッド管理テーブル１４００では、検証対象プログラムで親スレッドと子スレッド間でデータ依存関係があり、かつセマフォがない各スレッドが排他制御の必要がないセーフスレッドか排他制御が必要なスレッドであるかのいずれかに登録されている。スレッド管理テーブル１４００では、スレッドＣとスレッドＤがセーフスレッドとして登録され、スレッドＡが排他制御の必要なスレッドとして登録されている。検証対象ソフトウェアの設計者はスレッド管理テーブル１４００を参照することにより、排他制御が必要なスレッドが分かり、必要最低限の共有データに対してのみ排他制御を行うように検証対象ソフトウェアに入れることができる。これにより、スピンループ処理を減らすことができ、ＣＰＵのスループットを向上させることができる。
【００８５】
また、図１３では対象スレッドに排他制御が必要か否かについて示したが、遅延時間が短ければ排他制御が必要でない場合があるため、排他制御が必要でない遅延時間を遅延可能時間として特定する特定処理手順を図１５で示す。
【００８６】
図１５は、図１２で示した特定処理（ステップＳ１２０８）の詳細な説明を示すフローチャートである。図１５のステップＳ１５０１〜ステップＳ１５０５とステップＳ１５０８〜ステップＳ１５１１とは、それぞれ図１３のステップＳ１３０１〜ステップＳ１３０５とステップＳ１３０７〜ステップＳ１３１０と同一ステップであるため、詳細な説明を省略する。そして、ステップＳ１５０６において、検証支援装置６００が、遅延可能時間＝ＤＥＬＡＹ−ＤＥＬとし（ステップＳ１５０６）、対象スレッドを排他制御が必要なスレッドとして遅延可能時間と関連付けて出力する（ステップＳ１５０７）。ここでは、検証支援装置６００がスレッド管理テーブル１６００へ出力する。
【００８７】
図１３では、ＤＥＬＡＹを増加させることにより、遅延可能時間を特定しているが、あらかじめＤＥＬＡＹに大きな値を入れて、第１の実行結果と第２の実行結果とが不一致した場合のＤＥＬＡＹから遅延時間を減少させることにより遅延可能時間を特定してもよい。
【００８８】
たとえば、検証支援装置６００が、ＤＥＬＡＹの初期値を子スレッドの生成命令の一つ前の命令の実行開始時刻から親スレッドの実行終了時刻までの時間に設定し、子スレッドをＤＥＬＡＹ分遅延させて実行させる。そして、検証支援装置６００が、第１の実行結果と第２の実行結果が一致するか否かを判断する。一致しない場合には、検証支援装置６００が、調整部７０８によりＤＥＬＡＹ＝ＤＥＬＡＹ−ＤＥＬとして、親スレッドの実行状態を子スレッドの実行開始の一つ前の命令の実行状態に戻す。そして、検証支援装置６００が、親スレッドを実行し、子スレッドを、減少させたＤＥＬＡＹ分遅延させてから実行する。検証支援装置６００は、第１の実行結果と第２の実行結果とが一致するまでＤＥＬＡＹの減少と再実行を繰り返すことで、遅延可能時間を特定することができる。つぎに、図１６を用いてスレッド管理テーブル１６００について説明する。
【００８９】
図１６は、図１２および図１５で示したスレッド管理テーブル１６００の一例を示す説明図である。スレッド管理テーブル１６００では、親スレッドと子スレッド間でデータ依存関係があり、かつセマフォがない各スレッドが排他制御の必要がないセーフスレッドか排他制御が必要なスレッドであるかのいずれかに登録されている。スレッド管理テーブル１６００では、スレッドＣとスレッドＤがセーフスレッドとして登録され、排他制御が必要なスレッドには、スレッド名と、該スレッド名で示すスレッドに依存関係があるスレッドと、遅延可能時間とが登録されている。排他制御が必要なスレッドとしてスレッドＡが登録され、スレッドＢとデータに依存関係があることと、遅延可能時間が９９［μｓ］であることが示されている。なお、遅延可能時間に０が登録されている場合は遅延させることができないため、セマフォによるロックが必要である。
【００９０】
マルチコアプロセッサシステムでスケジューラが、スレッド管理テーブル１６００を用いることで排他制御が必要なスレッドを特定でき、かつ遅延可能時間を参照することで動的にロックをかけるか否かを決定することができる。
【００９１】
（実施の形態２）
つぎに、実施の形態２では、マルチコアプロセッサシステムにおいてスケジューラによる実施の形態１で作成されたメモリ管理テーブルを用いてスレッド間で依存関係のあるデータにロックをかけるか否かの制御例について説明する。なお、実施の形態２のマルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、実施の形態２では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
【００９２】
（実施の形態２にかかるマルチコアプロセッサシステムのハードウェア構成）
図１７は、実施の形態２にかかるマルチコアプロセッサシステムのハードウェア構成を示す説明図である。マルチコアプロセッサシステム１７００は、ＣＰＵ１７０１およびＣＰＵ１７０２と、共有メモリ１７０４とを備えている。各構成部はバス１７０３により接続されている。
【００９３】
ＣＰＵ１７０１とＣＰＵ１７０２とは、それぞれキャッシュとレジスタとコアを備えている。ＣＰＵ１７０１上ではマスタＯＳであるＯＳ１７１１が動作し、ＣＰＵ１７０２上ではスレーブＯＳであるＯＳ１７１２が動作する。ＯＳ１７１１はスケジューラ１７２１を備え、スケジューラ１７２１が、スレッドの割り当てを決定する。
【００９４】
共有メモリ１７０４には、マルチコアプロセッサに共有されるメモリであり、ＯＳ１７１１やＯＳ１７１２などのブートプログラムとアプリケーションソフトウェアなどのプログラムやスレッド管理テーブル１６００や実行時間テーブル１７３１を記憶している。共有メモリ１７０４は、具体的には、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）と、フラッシュＲＯＭなどを備えている。
【００９５】
たとえば、ＲＯＭが、該プログラムなどを記憶し、ＲＡＭは、ＣＰＵ１７０１とＣＰＵ１７０２のワークエリアとして使用される。共有メモリ１７０４に記憶されているプログラムは、各ＣＰＵにロードされることで、コーディングされている処理をＣＰＵに実行させることとなる。
【００９６】
ここで、実行時間テーブル１７３１とは、各スレッドの実行時間が登録されているテーブルである。各スレッドの実行時間については、周知のようにシミュレータがアプリケーションソフトウェアをシミュレーションすることにより算出することができる。
【００９７】
（実施の形態２にかかるスケジューラ１７２１の機能的構成）
図１８は、実施の形態２にかかるスケジューラ１７２１の機能的構成を示すブロック図である。スケジューラ１７２１は、受付部１８０１と、排他判断部１８０２と、遅延時刻算出部１８０３と、終了時刻算出部１８０４と、時刻判断部１８０５と、実行制御部１８０６と、を含む構成である。各機能（受付部１８０１〜実行制御部１８０６）は、具体的には、たとえば、共有メモリ１７０４に記憶されたスケジューラ１７２１をロードしてＣＰＵ１７０１に実行させることにより、各機能を実現する。
【００９８】
まず、受付部１８０１は、対象スレッドの生成指示を受け付ける。そして、排他判断部１８０２は、対象スレッドの生成指示を受け付けると、対象スレッドが排他制御を必要とするスレッドであるか否かを判断する。
【００９９】
遅延時刻算出部１８０３は、排他判断部１８０２により対象スレッドが排他制御を必要とするスレッドであると判断された場合、生成指示を受け付けた第１の受付時刻に排他制御が不要な遅延可能時間を加算することにより遅延可能時刻を算出する。
【０１００】
終了時刻算出部１８０４は、第１の受付時刻経過後、対象スレッドの実行開始指示を受け付けると、実行開始指示を受け付けた第２の受付時刻に対象スレッドの実行時間を加算することにより予定実行終了時刻を算出する。
【０１０１】
時刻判断部１８０５は、終了時刻算出部１８０４により算出された予定実行終了時刻が遅延時刻算出部１８０３により算出された遅延可能時刻以降であるか否かを判断する。
【０１０２】
実行制御部１８０６は、時刻判断部１８０５により予定実行終了時刻が遅延可能時刻以降であると判断された場合、対象スレッドに依存関係がある生成元スレッドのデータをロックしてから対象スレッドをマルチコアプロセッサのうちの任意のコアで実行させる。一方、実行制御部１８０６は、時刻判断部１８０５により予定実行終了時刻が遅延可能時刻以降でないと判断された場合、対象スレッドを該任意のコアで実行させる。
【０１０３】
以上を踏まえて図を用いて詳細に説明する。
【０１０４】
図１９は、スケジューラ１７２１によるスレッドＡの割り当て例１を示す説明図である。図１９では、スレッドＢがＣＰＵ１７０１に割り当てられ、スレッドＣがＣＰＵ１７０２に割り当てられているとする。具体的には、たとえば、スレッドＢがスレッドＡを生成し、スレッドＡの生成指示をスケジューラ１７２１へ通知すると、スケジューラ１７２１が、スレッドＡの生成指示を受け付ける。
【０１０５】
そして、スケジューラ１７２１がスレッドＡをＣＰＵ１７０２に割り当てると決定し、ＣＰＵ１７０２のレディーキューに登録する。なお、スレッドＡをレディーキューに登録するとは、具体的には、スレッドＡがローディングされた記憶領域のアドレスをコンテキストとして生成し、該コンテキストをレディーキューに入れることである。レディーキューに積まれているコンテキスト順にスレッドが実行される。すなわち、レディーキューにコンテキストが登録されているスレッドは、実行待ち状態である。
【０１０６】
そして、スケジューラ１７２１が、共有メモリ１７０４からスレッド管理テーブル１６００を読み出す。なお、スレッド管理テーブル１６００は、ＯＳ１７１１の起動時にＣＰＵ１７０１のキャッシュに記憶させておいてもよい。スケジューラ１７２１が、スレッド管理テーブル１６００を参照することでスレッドＡは排他制御が必要なスレッドであるか否かを判断する。
【０１０７】
スレッドＡは排他制御が必要なスレッドであり、遅延可能時間が９９［μｓ］である。スケジューラ１７２１が、スレッドＡの生成指示を受け付けた第１の受付時刻に遅延可能時間を加算することで遅延可能時刻を算出する。なお、遅延可能時刻は該ＣＰＵ１７０１のキャッシュに記憶させておいてもよい。
【０１０８】
そして、スケジューラ１７２１が、スレッドＡの実行開始指示を受け付ける。スレッドＡの実行開始指示を受け付けるとは、たとえば、タスクスイッチを監視することにより、スレッドＡが実行待ち状態から実行状態になることを検出する。
【０１０９】
つぎに、スケジューラ１７２１が、実行時間テーブル１７３１にアクセスしてスレッドＡの実行時間を取得する。ここで、スレッドＡの実行時間を７０［μｓ］とする。スケジューラ１７２１が、スレッドＡの実行開始指示を受け付けると実行開始指示を受け付けた第２の受付時刻にスレッドＡの実行時間を加算することによりスレッドＡの予定実行終了時刻を算出する。
【０１１０】
そして、スケジューラ１７２１が、予定実行終了時刻が遅延可能時刻以降であるか否かを判断する。図１９で示すように、ここでは、予定実行終了時刻が遅延可能時刻以降であると判断される。
【０１１１】
図２０は、スレッドＢがスピンループ処理を行う例を示す説明図である。つぎに、予定実行終了時刻が遅延可能時刻以降であると判断され、スケジューラ１７２１が、スレッドＡとスレッドＢとで依存関係のあるデータにロックをかけ、スレッドＡをＣＰＵ１７０２に実行させる。なお、スレッドＢからのアクセスに対して該データはロックがかけられているが、スレッドＡからのアクセスに対して該データはロックがかけられていない。そして、スレッドＢはスピンループ処理を行うことで該データのロック解除を確認する。
【０１１２】
図２１は、スケジューラ１７２１によるスレッドＡの割り当て例２を示す説明図である。図２１では、スレッドＢがＣＰＵ１７０１に割り当てられ、スレッドＣがＣＰＵ１７０２に割り当てられているとする。具体的には、たとえば、スレッドＢがスレッドＡを生成し、スレッドＡの生成指示をスケジューラ１７２１へ通知すると、スケジューラ１７２１が、スレッドＡの生成指示を受け付ける。
【０１１３】
そして、スケジューラ１７２１がスレッドＡをＣＰＵ１７０２に割り当てると決定し、ＣＰＵ１７０２のレディーキューに登録する。なお、スレッドＡをレディーキューに登録するとは、具体的には、スレッドＡがローディングされた記憶領域のアドレスをコンテキストとして生成し、該コンテキストをレディーキューに入れることである。レディーキューに積まれているコンテキスト順にスレッドが実行される。すなわち、レディーキューにコンテキストが登録されているスレッドは、実行待ち状態である。
【０１１４】
そして、スケジューラ１７２１が、共有メモリ１７０４からスレッド管理テーブル１６００を読み出す。スケジューラ１７２１が、スレッド管理テーブル１６００を参照することでスレッドＡは排他制御が必要なスレッドであるか否かを判断する。
【０１１５】
スレッドＡは排他制御が必要なスレッドであり、遅延可能時間が９９［μｓ］である。なお、遅延可能時刻の算出例については図１９で示した処理と同様であるため、ここでの説明は省略する。
【０１１６】
そして、スケジューラ１７２１が、スレッドＡの実行開始指示を受け付ける。スレッドＡの実行開始指示を受け付けるとは、たとえば、タスクスイッチを監視することにより、スレッドＡが実行待ち状態から実行状態になることを検出する。
【０１１７】
つぎに、スケジューラ１７２１が、実行時間テーブル１７３１にアクセスしてスレッドＡの実行時間を取得する。ここで、スレッドＡの実行時間を７０［μｓ］とする。スケジューラ１７２１が、スレッドの実行開始指示を受け付けると実行開始指示を受け付けた第２の受付時刻にスレッドＡの実行時間を加算することによりスレッドＡの予定実行終了時刻を算出する。
【０１１８】
そして、スケジューラ１７２１が、予定実行終了時刻が遅延可能時刻以降であるか否かを判断する。図２１で示すように、ここでは、予定実行終了時刻が遅延可能時刻以降でないと判断される。スケジューラ１７２１が、予定実行終了時刻が遅延可能時刻以降でないと判断すると、スレッドＡとスレッドＢとに依存関係があるデータに対してロックをかけずにスレッドＡを実行させる。
【０１１９】
（実施の形態２にかかるスケジューラ１７２１による制御処理手順）
図２２は、スケジューラ１７２１による制御処理手順を示すフローチャートである。まず、スケジューラ１７２１が、受付部１８０１により、対象スレッドの生成指示を受け付けたか否かを判断し（ステップＳ２２０１）、対象スレッドの生成指示を受け付けていないと判断した場合（ステップＳ２２０１：Ｎｏ）、ステップＳ２２０１へ戻る。一方、スケジューラ１７２１が、対象スレッドの生成指示を受け付けたと判断した場合（ステップＳ２２０１：Ｙｅｓ）、スレッドの生成指示が受け付けられたスレッドを割り当てるＣＰＵを決定する（ステップＳ２２０２）。
【０１２０】
つぎに、スケジューラ１７２１が、決定したＣＰＵのレディーキューへ対象スレッドを登録し（ステップＳ２２０３）、排他判断部１８０２により、スレッド管理テーブル１６００を参照することで排他制御が必要なスレッドであるか否かを判断する（ステップＳ２２０４）。まず、スケジューラ１７２１が、排他制御が必要なスレッドでないと判断した場合（ステップＳ２２０４：Ｎｏ）、受付部１８０１により、実行開始指示を受け付けたか否かを判断する（ステップＳ２２０５）。スケジューラ１７２１が、実行開始指示を受け付けていないと判断した場合（ステップＳ２２０５：Ｎｏ）、ステップＳ２２０５へ戻る。一方、スケジューラ１７２１が、実行開始指示を受け付けたと判断した場合（ステップＳ２２０５：Ｙｅｓ）、ステップＳ２２１１へ移行する。
【０１２１】
また、ステップＳ２２０４において、スケジューラ１７２１が、排他制御が必要なスレッドであると判断した場合（ステップＳ２２０４：Ｙｅｓ）、遅延時刻算出部１８０３により、遅延可能時刻＝生成指示を受け付けた第１の受付時刻＋対象スレッドの遅延可能時刻とする（ステップＳ２２０６）。なお、スケジューラ１７２１は、遅延可能時刻をスレッド管理テーブル１６００から取得することができる。
【０１２２】
つぎに、スケジューラ１７２１が、受付部１８０１により、対象スレッドの実行開始指示を受け付けたか否かを判断し（ステップＳ２２０７）、対象スレッドの実行開始指示を受け付けていないと判断した場合（ステップＳ２２０７：Ｎｏ）、ステップＳ２２０７へ戻る。一方、スケジューラ１７２１が、対象スレッドの実行開始指示を受け付けたと判断した場合（ステップＳ２２０７：Ｙｅｓ）、終了時刻算出部１８０４により、予定実行終了時刻＝実行開始指示を受け付けた第２の受付時刻＋対象スレッドの実行時間とする（ステップＳ２２０８）。なお、スケジューラ１７２１は、対象スレッドの実行時間を実行時間テーブル１７３１から取得することができる。
【０１２３】
つぎに、スケジューラ１７２１が、時刻判断部１８０５により、予定実行終了時刻が遅延可能時刻以降であるか否かを判断し（ステップＳ２２０９）、予定実行終了時刻が遅延可能時刻以降でないと判断した場合（ステップＳ２２０９：Ｎｏ）、ステップＳ２２１１へ移行する。一方、スケジューラ１７２１が、予定実行終了時刻が遅延可能時刻以降であると判断した場合（ステップＳ２２０９：Ｙｅｓ）、対象スレッドと該対象スレッドの親スレッドに依存関係のあるデータをロックする（ステップＳ２２１０）。なお、該データへのロックについては、親スレッドからのアクセスをロックするのであって、対象スレッドからのアクセスについてはロックされない。
【０１２４】
そして、ステップＳ２２０５：Ｙｅｓ、ステップＳ２２０９：Ｎｏ、またはステップＳ２２１０のつぎに、対象スレッドの実行を開始させ（ステップＳ２２１１）、ステップＳ２２０１へ戻る。
【０１２５】
以上説明したように、検証支援プログラム、検証支援装置、および検証支援方法によれば、シングルコア・マルチスレッド環境において対象スレッドを実行させた場合の生成元スレッドの第１の実行結果と、遅延させて対象スレッドを実行させた場合の生成元スレッドの第２の実行結果とが一致するか否かを判断する。そして、第１の実行結果と第２の実行結果が不一致であれば、対象スレッドと生成元スレッドで依存関係のあるデータに排他制御が必要であることを出力する。これにより、排他制御が必要なスレッドを自動で特定することで、設計者が特定されたスレッドに対してのみセマフォを用意すればよいため、検証対象ソフトウェアに適切にセマフォを用意でき、ソフトウェアの設計を容易化できる。
【０１２６】
また、第１の実行結果と第２の実行結果が一致する場合には、対象スレッドを遅延させる遅延時間を増加して、対象スレッドを、増加した遅延時間遅延させてから実行させる。そして、対象スレッドの実行開始時刻が、生成元スレッドの実行終了時刻以降となるまで遅延時間の増加を繰り返し、第１の実行結果と第２の実行結果が一致するかを判断する。遅延時間を増加させる。これにより、排他制御を用いずに正解値を保証することができる遅延可能時間を自動で特定することができる。製品の運用時に遅延可能時間を用いてスレッド間に依存関係があるデータをロックするか否かを動的に決定することができ、ＣＰＵの性能劣化を防止することができる。
【０１２７】
また、第１の実行結果と第２の実行結果が一致し、かつ対象スレッドの実行開始時刻が、生成元スレッドの実行終了時刻以降である場合には、対象スレッドと生成元スレッドで依存関係のあるデータに排他制御が不要である旨の情報を出力する。これにより、排他制御が不要なスレッドを自動で特定することができる。したがって、利用者が、排他制御が不要なスレッドに対してセマフォを用意してしまうことを防止でき、不要な排他制御におけるスピンループ処理によってＣＰＵの性能劣化を防止することができる。
【０１２８】
また、第１の実行結果と第２の実行結果とが一致しない場合に、対象スレッドを遅延させる遅延時間を減らす。そして、対象スレッドを、減らした遅延時間遅延させてから実行させる。これにより、排他制御を用いずに正解値を保証することができる遅延可能時間を見積もることができる。
【０１２９】
以上説明したように、制御プログラム、マルチコアプロセッサシステム、および制御方法によれば、スレッド間で依存関係のあるデータに排他制御を用いずに正解値を保証することができる遅延可能時間に基づいて該データにロックをかけるか否かを動的に判断する。これにより、マルチコアプロセッサの実行状態に応じて排他制御を行うか否かが決まり、不要な排他制御におけるスピンループ処理に起因するＣＰＵの性能劣化を防止することができる。
【０１３０】
なお、実施の形態１で説明した検証支援方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本検証支援プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本検証支援プログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０１３１】
２００  回路情報
２０１  第１のＣＰＵモデル
２０２  第２のＣＰＵモデル
３００  検証対象ソフトウェア
６００  検証支援装置
７０１  検出部
７０２  割り当て部
７０３  保持部
７０４  実行制御部
７０５  一致判断部
７０６  時刻判断部
７０７  設定部
７０８  調整部
７０９  出力部
１７００  マルチコアプロセッサシステム
１７２１  スケジューラ
１８０２  排他判断部
１８０３  遅延時刻算出部
１８０４  終了時刻算出部
１８０５  時刻判断部
１８０６  実行制御部
【図１】
0005423876.tif 000002
【図２】
0005423876.tif 000003
【図３】
0005423876.tif 000004
【図４】
0005423876.tif 000005
【図５】
0005423876.tif 000006
【図６】
0005423876.tif 000007
【図７】
0005423876.tif 000008
【図８】
0005423876.tif 000009
【図９】
0005423876.tif 000010
【図１０】
0005423876.tif 000011
【図１１】
0005423876.tif 000012
【図１２】
0005423876.tif 000013
【図１３】
0005423876.tif 000014
【図１４】
0005423876.tif 000015
【図１５】
0005423876.tif 000016
【図１６】
0005423876.tif 000017
【図１７】
0005423876.tif 000018
【図１８】
0005423876.tif 000019
【図１９】
0005423876.tif 000020
【図２０】
0005423876.tif 000021
【図２１】
0005423876.tif 000022
【図２２】
0005423876.tif 000023