(57)【要約】【課題】実行速度を落とすことなく、データレースの検出率の向上を図ること。【解決手段】データレースを検出する過程で必要となるデータを別のメモリに記録し、変数がアクセスされるたびにその変数の状態とその変数を守るロックを計算するステート計算機能および集合計算機能をハードウェアで実現することによりデータレース検出率を向上させる。さらに、適切な遅延を入れることにより、ＣＰＵをストールさせることなくデータレース検出を可能とした。【選択図】図１
2013214172.tif 000002
【特許請求の範囲】
【請求項１】
所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部と、当該主演算制御部用のデータメモリである第一メモリとを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態が空集合となった場合に、前記主演算制御部が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成のデバック検証装置であって、
前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリと同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリと、
前記第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて前記各変数の新しい状態を計算するステート計算部と、
前記第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて新たなロック集合を計算して当該第二メモリに格納すると共に、１サイクル内では新たなロック集合を計算できない場合には当該計算の終了まで前記主演算制御部をストールさせる機能を有する集合計算部とを備えたことを特徴とするデバック検証装置。
【請求項２】
請求項１に記載のデバック検証装置において、
前記主演算制御部に併設され、前記ステート計算部による新たなロック集合の計算に際しては、前記主演算制御部の稼働時に当該主演算制御部から前記第一メモリに向けて出力されるバイトイネーブル信号およびリード／ライト信号を適度に遅延させる信号遅延処理部を設け、
前記ステート計算部は、前記遅延処理部で適度に遅延された前記バイトイネーブル信号およびリード／ライト信号を入力すると共に、これと前記各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて前記変数の新たな状態（ステート）を算定する状態算定機能を備えていることを特徴としたデバック検証装置。
【請求項３】
請求項１に記載のデバック検証装置において、
前記第二メモリは、前記主演算制御部からのリード指令及びライト指令に同時に対応可能であり、且つ前記プログラムが備えている各変数に対して当該各変数の前記第一メモリと同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合の格納を可能とした容量のものであることを特徴としたデバック検証装置。
【請求項４】
請求項２に記載のデバック検証装置において、
前記第二メモリに、前記主演算制御部から出力されるアドレス信号，バイトイネーブル信号，及び集合計算部からストール信号に基づいて前記第二メモリを読み出す第二メモリ読出部を併設したことを特徴とするデバック検証装置。
【請求項５】
請求項４に記載のデバック検証装置において、
前記スレッドＩＤ保持部に保持されているスレッドＩＤと、前記集合計算の計算結果とに基づいて前記第二メモリへ書き込むデータを計算する書込みデータ収集部を設け、これを前記第二メモリに併設したことを特徴としたデバック検証装置。
【請求項６】
請求項５に記載のデバック検証装置において、
前記第二メモリに並列に、前記各変数のロック集合Ｃ（ｖ）をロックＩＤの昇順もしくは降順の何れか一方の手順によって格納するための第三メモリを設け、
この第三メモリに対す読出し及び書き込むを行う第三メモリ用の読出し部および書込み部をそれぞれ設けると共に、
前記位置計算部が、前記各変数のロック集合を前記第三メモリのどの位置に格納するかを決定する第三メモリ用格納位置決定機能を備え、
前記集合計算部は、
前記第三メモリから読み出したロック集合と前記ロック集合保持部が保有するロックＩＤとに基づいて新たなロック集合を計算する構成としたことを特徴とするデバッグ検証装置。
【請求項７】
請求項６に記載のデバック検証装置において、
前記位置計算部の計算結果と前記ステート計算部の計算結果とに基づいて、前記集合計算部が計算した新しいロック集合の要素数が前記第二のメモリが許容する一定値以下の場合に、当該変数の状態（ステート）と新しいロック集合とを前記第二のメモリに書き込む第二メモリ書込制御部を設けたことを特徴とするデバッグ検証装置。
【請求項８】
請求項６に記載のデバック検証装置において、
前記第二のメモリに併設され当該第二のメモリの読み出し結果を一時的に格納すると共に内部のＦＩＦＯ処理が一杯のときは前記主演算制御部をストールさせるように当該主演算制御部に要求するＦＩＦＯ処理部と、
前記集合計算部とは別に、前記ＦＩＦＯ処理部およびロック集合保持部からのストール要求に基づいて前記主演算制御部をストールさせるＯＲ部とを有し、
前記ロック集合保持部は、保持するロックＩＤに変更が生じた場合には前記ＦＩＦＯ処理部が空になるまで前記主演算制御部をストールさせるように要求するストール要求機能を備えていることを特徴とするデバック検証装置。
【請求項９】
所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部と、当該主演算制御部用のデータメモリである第一メモリとを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態（ステート）が空集合となった場合に、前記主演算制御部が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成のデバック検証装置にあって、
前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリと同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリが設けられた場合、
この第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、予め装備されたステート計算部が前記各変数の新しい状態を計算し（前記第二メモリに格納する／新ステート計算工程）、
前記第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、予め装備された集合計算部が新たなロック集合を計算して当該第二メモリに格納し（新ロック集合計算工程）、
この新たなロック集合の計算がタイミング信号の１サイクルの間ではできない場合に当該計算が終わるまで前記主演算制御部のストールを、前記集合計算部が当該主演算制御部に要求し実行させるようにしたこと（主演算制御部用ストール実行工程）を特徴とするデバック検証方法。
【請求項１０】
所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部と、当該主演算制御部用のデータメモリである第一メモリとを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態（ステート）が空集合となった場合に、前記主演算制御部が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成のデバック検証装置にあって、
前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリと同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリが設けられている場合、
前記第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、新たなロック集合を計算して当該第二メモリに格納する新ロック集合計算処理機能、
及びこの新たなロック集合の計算がタイミング信号の１サイクル中に成し得ない場合に当該計算が終わるまで前記主演算制御部のストールを、当該主演算制御部に要求し実行させる主演算制御部用ストール実行処理機能、
を設け、
これらの各処理機能を予め装備された集合計算部が備えているコンピュータに実現させるようにしたことを特徴とするデバック検証プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デバッグ検証装置、デバッグ検証方法、及びそのプログラムに関し、特に並列に動作するプログラムのデバッグ検証装置に関する。
【背景技術】
【０００２】
近年、複数のプロセッサを有するマルチコアプロセッサが広く利用されている。そして複数のプロセッサにより所望の動作を高速化する方法は、所望の動作をスレッド等で細分化し、それを複数のプロセッサで並列処理することで行われる。この並列処理により所望の動作を高速化できるものの、並列に動作するプログラムのバグ検出は困難である。その代表的な例がデータレースである。
【０００３】
データレースとは、複数のスレッドによりアクセスされる共有変数の排他制御が正しく行われないことであり、より詳細には２つ以上のスレッドがある共有変数にアクセスするとき、少なくとも一つのスレッドは変数の値を書き換え、かつ、他のスレッドがアクセスできないように排他制御をしていない場合を指す。
【０００４】
データレースを検出するアルゴリズムは多く提案されており、（１）静的にプログラムのソースコードを解析し、データレースが存在する箇所を指摘する静的解析手法、（２）プログラムを実行し、データレースが起きた場合にそれを検出する動的解析手法、（３）プログラムを実行し、実行中にデータレース検出に必要なデータを収集し、プログラム実行後に、収集したデータを解析してデータレースを検出する事後分析手法、などが提案されており、その多くはソフトウェアで実装されている。
【０００５】
それぞれ一長一短があるものの、静的解析手法は解析できるプログラムの大きさに限界があること、事後分析手法はプログラムの実行履歴を取るために必要なメモリやハードディスグなどの記憶装置が必要であることから、多くは動的解析手法が利用されている。
【０００６】
動的解析手法では、（１）happens-beforeを利用する手法、（２）ロックセット（Lock Set）を利用する手法、（３）その混合型など多くの提案がなされている。happens-beforeの手法は検出できないデータレースが存在するものの、ソフトウェアでも高速に動作すること、ロックを利用した排他制御でも動作するなどの利点があり、多くがこの手法を利用している。
【０００７】
一方、ロックセット（Lock Set）を利用する手法は、プログラムにあるすべての変数について、状態を計算したり、ロック集合を保持したりしなければならないため、計算量が多いもののデータレースを見逃することがない利点がある。この計算量の問題、つまり動作速度の低下をハードウェアにより解決したのが非特許文献１である。
【０００８】
この非特許文献１の手法は、従来より知られているロックセット（Lock Set）を利用したデータレース検出手法を基本としていることから、ここで、まず、このロックセット（Lock Set）を利用したデータレース検出手法について説明する。
【０００９】
初めに、ｖを変数とし、Ｓ（ｖ）を変数ｖの状態を表し、変数ｖを排他的に制御するために利用しているロックの集合をＣ（ｖ）、ｔをスレッドＩＤとし、変数ｖが最後にアクセスされたスレッドＩＤをＴ（ｖ）とし，スレッドｔが持つロック集合をＬ（ｔ）と設定する。
【００１０】
そして、このとき、ロックセット（Lock Set）を利用した上記データレース検出手法では、あらゆる変数ｖについて、ＣＰＵからアクセス（Read／Write 、ＣＰＵから見ればLoad／Store ）される毎に、上記Ｓ（ｖ），Ｃ（ｖ），およびＴ（ｖ）に関して次の計算を行う。ただし、初期値Ｓ（ｖ）＝”start ”状態、Ｃ（ｖ）＝任意、Ｔ（ｖ）＝任意である。
【００１１】
Ｓ（ｖ）＝”start ”で、
(1)．変数が Write（書き込み）されたとき：
Ｓ（ｖ）＝exclusive ，Ｔ（ｖ）＝ｔ、Ｃ（ｖ）＝Ｌ（ｔ）
(2)．その他：変化なし
【００１２】
Ｓ（ｖ）＝”exclusive ”で、
(1)．Ｔ（ｖ）≠ｔで且つ変数ｖが Write（書き込み）されたとき：
Ｓ（ｖ）＝”shared modified ”，Ｃ（ｖ）＝Ｃ（ｖ）∩Ｌ（ｔ）
Ｔ（ｖ）≠ｔで且つ変数ｖが read （読み出し）されたとき：
Ｓ（ｖ）＝”shared”，          Ｃ（ｖ）＝Ｃ（ｖ）∩Ｌ（ｔ）
(2)．その他：  Ｃ（ｖ）＝Ｃ（ｖ）∩Ｌ（ｔ）
【００１３】
Ｓ（ｖ）＝”shared”で、
(1)．変数ｖが Write（書き込み）されたとき：
Ｓ（ｖ）＝”shared modified ”，Ｃ（ｖ）＝Ｃ（ｖ）∩Ｌ（ｔ）
(2)．その他：  Ｃ（ｖ）＝Ｃ（ｖ）∩Ｌ（ｔ）
【００１４】
Ｓ（ｖ）＝”shared modified ”で、
Ｃ（ｖ）＝Ｃ（ｖ）∩Ｌ（ｔ）
そして、Ｓ（ｖ）＝”shared modified ”で「Ｃ（ｖ）＝空集合」になったとき、変数ｖはデータレースを起こした、となる。
【００１５】
ここで、Ｓ（ｖ）の状態遷移図を、図１７に示す。
この図１７において、 Writeは、ＣＰＵが当該変数を書き込むことをいい、結果的にメモリ内では当該変数の値が変更されることを意味する。又、 read は、ＣＰＵが当該変数を読み出すことをいい、結果的には当該変数の値をレジスタに取り込むことを示す。
【００１６】
又、各状態（ステート）は以下に示す内容を表す。
Start は、開始を意味する。全ての変数は最初この状態にある。
Exclusive は、当該変数が排他的な状態にあることを意味する。つまり、最初に当該変数をアクセスしたスレッドからしか Write／read されていない状態を示す。
sharedは、当該変数が最初のスレッドからのみ値を変更され、二つ以上のスレッドから読み出された状態（データレースではない）を示す。
shared modifiedは、二つ以上のスレッドが、当該変数を変更した状態を示す。この場合は、正常に排他制御しなければデータレースと成り得る状態である。
【００１７】
更に、図１７に図示された遷移条件を以下に示す。
Write  by new thread は、当該変数を最初にアクセスしたスレッドとは異なるスレッドから、変数の値を変更された（ Writeされた）場合を示す。
read by new thread は、当該変数を最初にアクセスしたスレッドとは異なるスレッドから、変数を読み出された（readされた）場合を示す。
【００１８】
尚、上記非特許文献１では、上記の手法を利用してデータレース検出を行うが、Ｌ（ｔ）若しくはＣ（ｖ）を、Bloom Filterを利用して固定長に変更して実装を行っている。これはＬ（ｔ）若しくはＣ（ｖ）が、最大で無限大の要素を持ち、ハードウェアでは実装しにくいからである。
【００１９】
又、これとは別に、上記データレースの検出技術に近い関連技術が、下記特許文献１，２として、従来より知られている。
この内、特許文献１のものは、並列的に実行されるプログラムの潜在的な不具合を検出することを、その内容としている。
【００２０】
又、特許文献２のものは、ＬＳＩのソフトウエアモデル上でプログラムの実行をシミュレーとする際に、プログラムにデバック用の細工をすることなく、データレース及びデットロック等を抽出可能なシミュレーション方法等が開示されている。
【先行技術文献】
【特許文献】
【００２１】
【特許文献１】特開２０１１−２０３８０３
【特許文献２】特開２００９−０３２１９７
【非特許文献】
【００２２】
【非特許文献１】P.Zhou, R.Teodorescu，and Y.Zhou,''HARD:Hardware-assisted lockset-based race detection,'' IEEE13th International Symposium on High Performance Computer Architecture, pp.121-132, February, 2007.
【発明の概要】
【発明が解決しようとする課題】
【００２３】
しかしながら、上記非特許文献１の問題点は、データレースの検出漏れがあることである。その理由は、非特許文献１はBloom Filterを利用しているため、変数ｖを排他的に制御するのに利用しているロック集合を表す式「Ｃ（ｖ）＝Ｃ（ｖ）∩Ｌ（ｔ）」の計算を時には誤ってしまい、検出できないデータレースが存在する、という場合がある。
【００２４】
この非特許文献１の更なる問題点は、オペレーティングシステム上で動作するプログラムのデータレース検出が出来ないことである。それはオペレーティングシステムが動作している間は、ユーザプログラムではなくオペレーティングシステムが実行されているが、それを区別することが出来ないからである。
【００２５】
一方、特許文献１に記載のものは、対象プログラムに含まれる同期処理に関する潜在的な不具合を検出できるということを内容とし、具体的にどのようなバグを取り除くのかということについての具体的な開示はない。
【００２６】
又特許文献２に記載のものは、データレース及びデットロック等を抽出可能なソフトウェアのシミュレーション方法に関するものであり、同一リソースに対する重複するアクセスを抽出する機能を設けるという構成をとり、これにより、プログラムの実行をシミュレーするものであり、データ分析の中からデータレース等の不具合を抽出しようとするものであるが、メモリと演算部という具体的なハード構成との関係では何ら具体的な開示はない。
【００２７】
（発明の目的）
本発明は、上記関連技術の有する不都合を改善し、特にスレッドが持つロック集合にかかる性質を利用してデータレースの検出率を向上させることを可能とするデバッグ検証装置、デバッグ検証方法、及びそのプログラムを提供することを、その目的とする。
【課題を解決するための手段】
【００２８】
上記目的を達成するため、本発明にかかるデバック検証装置は、所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部と、当該主演算制御部用のデータメモリである第一メモリとを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態が空集合となった場合に、前記主演算制御部が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成のデバック検証装置であって、
前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリと同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリと、
前記第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて前記各変数の新しい状態を計算するステート計算部と、
前記第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて新たなロック集合を計算して当該第二メモリに格納すると共に、１サイクル内では新たなロック集合を計算できない場合には当該計算の終了まで前記主演算制御部をストールさせる機能を有する集合計算部とを備えたことを特徴とする。
【００２９】
上記目的を達成するため、本発明にかかるデバック検証方法は、所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部と、当該主演算制御部用のデータメモリである第一メモリとを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態（ステート）が空集合となった場合に、前記主演算制御部が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成のデバック検証装置にあって、
前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリと同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリが設けられた場合、
この第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、予め装備されたステート計算部が前記各変数の新しい状態を計算し（前記第二メモリに格納する／新ステート計算工程）、
前記第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、予め装備された集合計算部が新たなロック集合を計算して当該第二メモリに格納し（新ロック集合計算工程）、
この新たなロック集合の計算がタイミング信号の１サイクルの間ではできない場合に当該計算が終わる迄前記主演算制御部のストールを、前記集合計算部が当該主演算制御部に要求し実行させるようにしたこと（主演算制御部用ストール実行工程）を特徴とする。
【００３０】
上記目的を達成するため、本発明にかかるデバック検証プログラムは、所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部と、当該主演算制御部用のデータメモリである第一メモリとを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態（ステート）が空集合となった場合に、前記主演算制御部が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成のデバック検証装置にあって、
前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリと同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリが設けられている場合、
前記第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、新たなロック集合を計算して当該第二メモリに格納する新ロック集合計算処理機能、
及びこの新たなロック集合の計算がタイミング信号の１サイクル中に成し得ない場合に当該計算が終わるまで前記主演算制御部のストールを、当該主演算制御部に要求し実行させる主演算制御部用ストール実行処理機能、
を設け、
これらの各処理機能を予め装備された集合計算部が備えているコンピュータに実現させるようにしたことを特徴とする。
【発明の効果】
【００３１】
本発明は上述したように構成したので、これによると、例えばロック集合Ｃ（ｖ）とスレッドが有するロック集合Ｌ（ｔ）との演算に際しては、ブルームフィルタ（Bloom Filter）利用するのではなく、正確にＣ（ｖ）∩Ｌ（ｔ）を計算することとなり、これによりデータレースの検出率を有効に向上させることができる。
同時に、ＣＰＵの一時的にストールことに対しては集合計算部から出力されるストール信号に応じて、遅延処理部が有効に機能してＣＰＵを長時間ストールさせることなく最小限の停止時間で、データレースを有効に検出することができる。
【図面の簡単な説明】
【００３２】
【図１】本発明の第１実施形態を示すブロック図である。
【図２】図１に開示した第１実施形態の各構成要素の動作を示すタイミングチャートである。
【図３】図１に開示した第１実施形態で稼働される被検証プログラムにおける動作開始時の手順の一例を示すフローチャートである。
【図４】図３にて動作開始された被検証プログラムのＣＰＵ上における動作手順の一例を示すフローチャートである。
【図５】図４にて動作中のＣＰＵをコンテキストスイッチにより一時的に停止する場合の動作手順を示すフローチャートである。
【図６】図５にて停止動作中のＣＰＵをコンテキストスイッチにより動作再開（実行可能な状態）とした時の動作手順を示すフローチャートである。
【図７】本発明の第２実施形態を示すブロック図である。
【図８】本発明の第３実施形態を示すブロック図である。
【図９】図８に開示した第３実施形態における動作の一部を示す説明図である。
【図１０】図８に開示した第３実施形態の全体的な動作を示すタイミングチャートである。
【図１１】図８に開示した第３実施形態における集合計算機能の計算後の状態の一例を示す説明図である。
【図１２】本発明の第４実施形態を示すブロック図である。
【図１３】本発明の第５実施形態を示すブロック図である。
【図１４】図１２に開示した第５実施形態の全体的な動作を示すタイミングチャートである。
【図１５】本発明の第６実施形態を示すブロック図である。
【図１６】図１４に開示した第６実施形態における動作の一部を示す説明図である。
【図１７】関連する技術における変数ｖの状態（ステート）であるＳ（ｖ）の遷移図である。
【発明を実施するための最良の形態】
【００３３】
以下、本発明にかかるデバッグ支援装置の第１実施形態を、図１乃至図６に基づいて説明する。最初に本第１実施形態の基本的な構成内容を説明し、その後に、具体的な内容を説明する。
【００３４】
図１において、本第１実施形態におけるデバック検証装置は、所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部（ＣＰＵ）１０１と、当該主演算制御部用のデータメモリである第一メモリ１０２とを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態が空集合となった場合に、前記主演算制御部１０１が前記一の変数ｖに関してデータレースの発生を認定するように構成されている。
符号１０１Ａは、主演算制御部（ＣＰＵ）１０１に対して外部から必要な動作指令を入力する動作指令入力部である。
【００３５】
このデバック検証装置は、更に、前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリ１０２と同じアドレスに各変数の状態（ステート），最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリ１０３と、前記第二メモリ１０３に格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて前記各変数の新しい状態を計算するステート計算部１０６と、前記第二メモリ１０３に格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて新たなロック集合を計算して当該第二メモリ１０３に格納すると共に、１サイクル内では新たなロック集合を計算できない場合には当該計算の終了まで前記主演算制御部１０１をストールさせる機能を有する集合計算部１０７とを備えている。
【００３６】
このため、例えば、Ｃ（ｖ）∩Ｌ（ｔ）を計算する場合に、従来公知のBloom Filterを利用することなく、正確にＣ（ｖ）∩Ｌ（ｔ）を計算するようにしたので、データレースの検出率の向上を図ることが可能となっている。
【００３７】
ここで、前記ステート計算部１０６による新たなロック集合の計算に際しては、前記主演算制御部１０１の稼働時に当該主演算制御部１０１から前記第一メモリ１０２に向けて出力されるバイトイネーブル信号およびリード／ライト信号を適度に遅延させる信号遅延処理部１１２が、前記主演算制御部１０１に併設されている。
【００３８】
このため、上記したデータレースの検出率の向上と共に前記主演算制御部（ＣＰＵ）１０１を一時的にストールする可能性が高くなるが、集合計算部１０７から出力されるストール信号に応じて、信号遅延処理部１１２を有効に機能させることにより、主演算制御部（ＣＰＵ）１０１をストールさせる時間を最小限にすることが可能となっている。
【００３９】
又、ステート計算部１０６は、この遅延処理部１１２で適度に遅延された前記バイトイネーブル信号およびリード／ライト信号を入力すると共に、これと前記各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて前記変数の新たな状態（ステート）を算定する状態算定機能を備えている。
【００４０】
更に、前述した第二メモリ１０３は、前記主演算制御部１０１からのリード（Read) 指令及びライト(Write) 指令に同時に対応可能であり、且つ前記プログラムが備えている各変数に対して当該各変数の前記第一メモリ１０２と同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合の格納を可能とした容量のものが使用されている。即ち、この第二メモリ１０３は、Readと Writeとが同時に行えて且つプログラムの共有変数が置かれる領域が入る深さを持つ容量のものが使用されている。
【００４１】
又、前述した第二メモリ１０３には、主演算制御部１０１からの前記第一メモリ１０２へのアドレスおよびバイトイネーブル信号から前記第二メモリ１０３へのアドレス信号およびバイトイネーブル信号を生成する第二メモリ用の書込制御部１０８が設けられている。この第二メモリ用の書込制御部１０８は、生成された前記アドレスおよびバイトイネーブル信号を前記第二メモリ１０３に入力する機能を備えている。
【００４２】
更に、この第二メモリ１０３には、主演算制御部１０１から出力されるアドレス信号，バイトイネーブル信号，及び集合計算部１０７からのストール信号に基づいて前記第二メモリ１０３を読み出す第二メモリ用読出制御部１１１が併設されている。
【００４３】
又、前述した主演算制御部１０１には、当該主演算制御部１０１が実行対象とするスレッドを保有するロック集合を格納するロック集合保持部１０４と、前記実行対象のスレッドにかかるスレッドＩＤを保持するスレッドＩＤ保持部１０５とが併設されている。
同時に、この主演算制御部１０１には、当該主演算制御部１０１でデータレースの検出を意図したプログラムが実行されている場合に機能し、前記各ロック集合保持部１０４，スレッドＩＤ保持部１０５，ステート計算部１０６，集合計算部１０７，第二メモリ用の書込制御部１０８，第二メモリ用の読出制御部，および信号遅延処理部１１２の全体のオン／オフ動作を設定する有効ビット設定部１０９が併設されている。
【００４４】
更に、本題１実施形態では、前述したスレッドＩＤ保持部１０５に保持されているスレッドＩＤと、前記集合計算部１０７の計算結果とに基づいて前記第二メモリ１０３へ書き込むデータを計算する書込みデータ収集部１１０が設けられている。
【００４５】
そして、上述した構成の本第１実施形態にあっては、各スレッドおよび各ロックには、それぞれ固有の数値が割り当てられていると仮定する。また、第一メモリ１０２はプログラムとデータの両方を含む形態を例として利用するが、プログラムを格納する領域とデータを格納する領域とを分けたハーバードアーキテクチャにも容易に拡張可能である。また、本発明の実施に直接影響を与えない、クロック信号および第一メモリ１０２のデータ出力信号などは図示していない。
【００４６】
また、本第１実施形態では、第二メモリ１０３の深さについては、プログラムの静的領域やヒープ領域が格納できれば良いとしているが、スタック領域にも共有変数がおかれる可能性があるため、スタック領域も合わせた深さを用意するように構成してもよい。また、プログラムのすべてのセクションを検査対象として動作させても問題ない。
【００４７】
次に、上述した各構成要素について、詳細に説明する。
主演算制御部（以下「ＣＰＵ」という）１０１は、外部からのストール信号により動作をストールできるＣＰＵからなる。又、第一メモリ１０２は通常のデータメモリであり、第二メモリ１０３はプログラムの静的領域，ヒープ領域が入り，リード（Read）とライト（Write ）が同時に出来るメモリである。
ただし、リードはアドレス信号が供給された次のサイクルでリードデータが出力されるものと仮定する。また、第二メモリ１０３には各変数ｖについてＳ（ｖ）とＣ（ｖ）、Ｔ（ｖ）が同じアドレスに格納される。
【００４８】
ロック集合保持部１０４は、前述した従来技術で説明したＬ（ｔ）を保持する機能である。ＣＰＵ１０１で動作しているプログラムがあるロックを取得したらそのＩＤをロック集合保持部１０４に追加し、あるロックを遺失したらそのＩＤをロック集合保持部１０４から削除するように動作する。
【００４９】
例えば、ロック集合保持部１０４はＣＰＵ１０１のバスに接続され、ＣＰＵ１０１からのＩＯ制御により、ロックＩＤを追加したり、削除したり出来るようにし、ロックを取得もしくは遺失する関数の中で同時にロック集合保持部１０４も制御するようにすれば良い。ただし、ＣＰＵ１０１をストールさせないためにも、ロック集合保持部１０４はＣＰＵ１０１と同等のクロックかそれ以上のクロックで動作するほうが好ましい。
【００５０】
スレッドＩＤ保持部１０５は、前述したとおりＣＰＵ１０１が現在実行しているスレッドＩＤを保持する機能である。スレッドは一般的にオペレーティングシステムが管理しているため、スレッドＩＤ保持部１０５はオペレーティングシステムにより制御されるのが適当であるが、本目的を達成するためであれば他の手段により制御を行っても良い。
又、ロック集合保持部１０４と同じく、ＣＰＵ１０１をストールさせないためにも、ロック集合保持部１０４はＣＰＵ１０１と同等のクロックかそれ以上のクロックで動作するほうが好ましい。
【００５１】
ステート計算部１０６は、現在のＳ（ｖ）やＴ（ｖ）、ＣＰＵ１０１からのアクセス種別（Read／Write ）を示す信号（図１ではＲＷ信号線で、１の場合Readを示し、０の場合はWrite を示す）から、従来技術（図１７）で説明したＳ（ｖ）の状態遷移図を計算する機能である。
【００５２】
ただし、有効ビット１０９がオフ（ＯＦＦ）の場合はその計算を行わない。ただし、ＣＰＵ１０１をストールさせないためにも、ロック集合保持部１０４はＣＰＵ１０１と同等のクロックかそれ以上のクロックで動作するほうが好ましく、１サイクルでこの計算を終える必要がある。
ステート（状態）は４つあるため、第二メモリの容量を削減するためにも、start を”００”（２進数表示）、exclusive を”０１”、sharedを”１０”、shared modified を”１１”とすれば、２ビットで表すことが可能である。
【００５３】
集合計算部１０７は、第二メモリから読み出されたＣ（ｖ）と、ロック集合保持部１０４で保持されているＬ（ｔ）から、Ｃ（ｖ）∩Ｌ（ｔ）を計算するものである。
この計算において、ＣＰＵ１０１の動作を止めないためには、ＣＰＵ１０１と同等のクロックかそれ以上のクロックで動作するほうが好ましく、１サイクルでこの計算を終える必要がある。
しかしながら、Ｃ（ｖ），Ｌ（ｔ）の要素数は上限がないため、計算に複数サイクル必要な場合もある。その場合、集合計算部１０７はＣＰＵ１０１のストール信号を制御して、その動作を一時的に止める必要がある。
【００５４】
書込制御部１０８は、ＣＰＵ１０１から出力されるアドレス信号を１サイクル遅延させて第二メモリ１０３に供給し、更にバイトイネーブル信号が有効のときは、書込データ収集部１１０の値が書込されるよう、第二メモリ１０３のライトイネーブル信号を制御するように動作する。ただし、集合計算部１０７がストール信号をアクティブにした場合は、ストール信号が立ち下がる迄、アドレス信号やバイトイネーブル信号を遅延させるようにする（図３のクロックサイクル３，４参照）。
【００５５】
有効ビット設定部１０９は、各構成要素の動作を許容するための有効ビットを設定する指令信号（フラグ）である。そして、データレースを検出したいプログラムがＣＰＵ１０１で実行されているときには、ロック集合保持部１０４，スレッドＩＤ保持部１０５，ステート計算部１０６，集合計算部１０７，書込制御部１０８，書込データ収集部１１０、読出制御部１１１、遅延処理部１１２が実行するのを許容する。
【００５６】
又、有効ビット１０９は、データレースを検出したいプログラムがＣＰＵ１０１で実行されていないときは、それら各構成要素を実行しないよう制御する。有効ビット設定部１０９のオン／オフ（ＯＮ／ＯＦＦ）動作は、プログラムの実行を制御するオペレーティングシステムが適当であるが、本目的を達成するためであれば他の手段により制御を行っても良い。例えば、オペレーティングシステムのコンテキストスイッチは主にタイマー（図示していない）の割り込みにより行われるため、これにより、有効ビット設定部１０９の動作を制御する方法もある。
【００５７】
書込データ収集部１１０は、スレッドＩＤ保持部１０５が保持しているＴ（ｖ）、ステート計算部１０６が計算したＳ（ｖ）、集合計算部１０７が計算したＣ（ｖ）を一つのデータにまとめるものである。ハードウェアで実現するため、通常は信号線を束ねるだけで特別な機能を必要としない。
【００５８】
読出制御部１１１は、ＣＰＵ１０１が出力するバイトイネーブル信号がアクティブの場合（つまり、あるアドレスのデータをｒｅａｄ若しくはｗｒｉｔｅする場合）、第二メモリ１０３に関して、ＣＰＵ１０１が出力しているアドレス信号と同じアドレスを読み出すように制御するものである。ただし、ストール信号がアクティブの場合は第二メモリへのアクセスを行わない（図３のクロックサイクル３，４参照）。
【００５９】
遅延処理部１１２は、ＣＰＵ１０１から出力されるＲＷ信号（リード／ライト信号）を１サイクル遅延させるものである。ただし、ストール信号がアクティブの場合は、ＣＰＵ１０１から出力されるＲＷ信号をラッチしないように動作する。
【００６０】
（動作の説明）
次に、上記第１実施形態の動作を、図２乃至図６に基づいて説明する。
最初に、図２のタイミングチャートを利用して、本第１実施形態の各要素の動作を説明し、その後に、ＣＰＵ１０１を中心とした全体的な動作をする。
【００６１】
まず、この図２の例では、クロックサイクル１でＣＰＵ１０１がアドレスＡにリード（Read) 、クロックサイクル２でアドレスＢにライト（Write ）、クロックサイクル３でアドレスＣにライト（Write ）しようとした。しかしながら、ストール信号が１のためクロックサイクル５まで延期され、クロックサイクル６にアドレスＤにWrite 、クロックサイクル７にアドレスＥにReadという順序で進んだときの例である。
つまり、この例では、アドレスＢのＣ（ｖ）の要素数が大きく、計算に３サイクルを費やす時のタイミングチャートを示している。
【００６２】
この図２のタイミングチャートが示すとおり、ＣＰＵ１０１はストールせず動作することが出来る。これは第二メモリ１０３の読出しにかかる時間を書込制御部１０８が吸収して（１サイクルずらして）いるからである。
一方、集合計算部１０７による計算が１サイクルよりも長くかかっても、書込制御部１０８や読出制御部１１１、遅延機能１１２の動作により、必要最低限のストール数（計算が３サイクルなので２サイクルのオーバヘッド）で動作を開始することが出来る。
【００６３】
ここで、上記第１実施形態における動作の要点を説明する。
前述したように、上記第１実施形態において、図１に示すデバック検証装置は、所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部１０１と、当該主演算制御部１０１用のデータメモリである第一メモリとを備えており、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態（ステート）が空集合となった場合に、前記主演算制御部１０１が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成となっている。
【００６４】
そして、前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリ１０２と同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリ１０３が設けられた場合、この第二メモリ１０３に格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、予め装備されたステート計算部１０６が前記各変数の新しい状態を計算し前記第二メモリに格納する（新ステート計算工程）。
【００６５】
次に、前記第二メモリ１０３に格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、予め装備された集合計算部１０７が新たなロック集合を計算して当該第二メモリ１０３に格納する（新ロック集合計算工程）。
そして、この新たなロック集合の計算がタイミング信号の１サイクルの間ではできない場合には、当該計算が終わるまで前記主演算制御部１０１のストールを、前記集合計算部１０７が当該主演算制御部１０１に要求し実行させるようにした（主演算制御部１０１用ストール実行工程）。
【００６６】
ここで、上記ステート計算部１０６による新たなロック集合の計算に際しては、当該ロック集合の計算に先立って、前記ＣＰＵ１０１の稼働時に当該ＣＰＵ１０１から前記第一メモリ１０２に向けて出力されるバイトイネーブル信号およびリード／ライト信号を、予め装備された信号遅延処理部１１２が適度に遅延させる作動する。
そして、この適度に遅延された前記バイトイネーブル信号およびリード／ライト信号を入力すると共に、これと前記各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、前記ステート計算部１０６が前記新しい状態（ステート）を計算する。
【００６７】
このため、前述したように、データレースの検出率の向上と共に生じるＣＰＵ１０１が一時的にストールされる可能性が高くなるが、集合計算部１０７から出力されるストール信号に応じて、信号遅延処理部１１２を有効に機能させることにより、主演算制御部（ＣＰＵ）１０１をストールさせる時間を最小限にすることが可能となっている。
【００６８】
次に、上記構成の全体的な動作の一例を、更に具体的に説明する。
この場合、複数のプログラムが上記ＣＰＵ１０１上で動作すると仮定して、まず、被検査対象のプログラムに実行について、(1)プログラムの開始（図３）、(2)ＣＰＵ１０１による実行動作（図４）、(3)動作を一時的に（コンテキストスイッチにより）停止するときの動作、(4)実行可能状態になった時（コンテキストスイッチにより）の動作に分けて、これを説明する。
【００６９】
始めに、プログラムの開始時に、ＯＳは図３に示すフローチャートのように動作し、有効ビット設定部１０９、スレッドＩＤ保持部１０５、ロック集合保持部１０４を初期化する。
即ち、まず最初に、ＯＳによる一般的なプログラム開始動作を行う（図３：ステップＳ０１，Ｓ０２）。
【００７０】
次に、例えば、ユニックス系のＯＳであれば、それはfork-exec されたときの動作と同じである。つまり、実行状態やスタック、ＰＩＤや優先度などの一連のフラグ、親プロセスＩＤ、スレッドＩＤ、オープンしているファイル、アドレス空間などのプログラムの状態を管理する構造体の初期化等を行うステップである。
【００７１】
今回、ＣＰＵ１０１で実行するスレッドのＩＤをセットする（図３：ステップＳ０３）。具体的には、プログラムの動作開始時では、単一のスレッド（メインスレッド）しか存在しないため、メインスレッドのＩＤがスレッドＩＤ保持部１０５にセットされる。
続いて、そのスレッドが保有するロック集合を格納する（図３：ステップＳ０４）。この場合、プログラムの動作開始時は、何もロックを取得していないため空集合とする。
【００７２】
次に、本第１実施形態における上記各構成要素が、それぞれデータレース検出の動作を行えるように、有効ビット設定部１０９がＣＰＵ１０１からの指令に基づいて有効ビットをセットする（図３：ステップＳ０５）。
これにより、装置全体が、まず、データレース検出の動作状態（被検証プログラムが動作開始状態）に設定される（図３：ステップＳ０６）。
【００７３】
次に、被検証プログラムがＣＰＵ１０１にて実行されているときの動作を説明する。
図２のタイミングチャートは、まず、ＣＰＵ１０１は、クロックサイクル１でアドレスＡにread、クロックサイクル２でアドレスＢにwrite 、クロックサイクル３でアドレスＣにwrite しようとした。しかしながら、ストール信号が１のためクロックサイクル５まで延期され、クロックサイクル６でアドレスＤにwrite 、クロックサイクル７でアドレスＥにreadという順序で進んだときの例である。
【００７４】
本第１実施形態では、ハードウェアでの動作を仮定しているため、各クロックサイクルにおいて各構成要素は、全ての構成要素が同時にその動作を行う。
ここでは、クロックサイクル２のとき、アドレスＢにある変数ｖがWrite されたときの動作を、図４のフローチャートに示す。この図４に示すように、クロックサイクル２で、ステップＳ１１，Ｓ１２，Ｓ１３の三つの動作が順次実行される。
【００７５】
ただし、本第１実施形態では、パイプライン動作（本来は一サイクルで実行する動作を高速化のために複数のサイクルに分けて動作させること）を行っているため、ステート計算部１０６、集合計算部１０７、書込データ収集部１１０、書込制御機能１０８は１サイクル前の動作、つまりクロックサイクル１のアドレスＡをリードしたときの動作を行っている。逆に、クロックサイクル３では、読出制御部１１１はクロックサイクル３で行うアドレスＣをReadされたときの動作を行っている。
【００７６】
この場合、クロックサイクル３では、ステップＳ１４，Ｓ１５，Ｓ１６，Ｓ１７の四つの動作が順次実行される。これにより、集合計算部１０７における空集合の有無でデータレースの発生有無が明らかとなる。
具体的には、集合計算機能１０７では、ある変数に対するロック集合を計算するが、その値が空集合になったときデータレースと判断される。
【００７７】
次に、コンテキストスイッチにより一時的に動作を停止するときの動作を図５に示す。  この場合、まず、有効ビットをクリアして、ステート計算機能などの各種機能の動作を停止する（図５：ステップＳ２１）。
【００７８】
続いて、一般的なＯＳで行うコンテキストスイッチの動作のほかに、ロック集合保持部１０４が保持するロック集合も、レジスタと同様に当該スレッドの動作を再開できるように第一メモリ１０２などへ退避する（図５：ステップＳ２２）。
【００７９】
次に、コンテキストスイッチにより一時停止した動作の再開制御を、図６に示す。
この場合、まず、一般的なＯＳで行うコンテキストスイッチの動作を行う（図６：ステップＳ３１，Ｓ３２）。
続いて、開始するスレッドＩＤについては、これを、スレッドＩＤ保持部１０５に保存する（図６：ステップＳ３３）。
【００８０】
次に、コンテキストスイッチにより一時停止したときのロック集合保持部１０４の状態を復元するために、第一メモリ１０２などに保存しておいたロック集合の値をロック集合保持部１０４に復元する（図６：ステップＳ３４）。
続いて、有効ビットが有効ビット設定部１０９にセットされ、これにより、被検証プログラムの動作が再開される（図６：ステップＳ３５，Ｓ３６）。
【００８１】
尚、上記動作の流れは、被検査対象のプログラムが、(1)プログラムの開始時、(2)ＣＰＵ１０１により実行されているときの動作、(3)コンテキストスイッチにより一時的に動作を停止するときの動作、(4)コンテキストスイッチにより実行可能状態になったときの動作、の４つに分けて説明を行ったが、これは一つの例であり、実際には、各ステップは記載した流れに限定されず、ＣＰＵ１０１のアーキテクチャやＯＳに大きく依存する。
このため、各ステップにおいて一時的にレジスタを利用する場合であれば、コンテキストスイッチで必要なレジスタファイルの復元は、スレッドの動作再開直前に行われるようにしてもよい。
【００８２】
以上により、本第１実施形態によると、上述した構成によりデータレースの検出率を向上させることができ（見逃しがない）、更に、ＣＰＵ１０１と同じ速度で動作させることができ、これにより、前述した本発明の目的を達成することが可能となっている。
【００８３】
即ち、上記第１実施形態によると、データレースを検出する過程で必要となるデータを別のメモリに記録し、変数がアクセスされるたびにその変数の状態（ステート）とその変数を守ロックを計算するステート計算部１０６および集合計算部１０７を設定しロックセット（Lock Set）方式によるデータレースの検出を実行するようにしたので、これにより、データレースの検出率向上を図ることができ、同時に、適切なデータ遅延を入れることにより、ＣＰＵ１０１をストールさせることなくデータレースの検出を可能といたので、実行速度を低下させることなくデータレースの検出率の向上を図ることが可能となった。
【００８４】
さらに、第二メモリ１０３の深さをプログラムの静的領域、ヒープ領域が入る深さとすると、必要なメモリの容量を減らすことが出来る。ただし、スタック領域に共有変数を確保する場合は、スタック領域分のメモリも新たに追加する必要がある。このようにすることで第二メモリ１０３に必要な容量を削減することが出来る。
また、本第１実施形態では正論理で信号を記述したが、負論理でも信号の極性を適切に変えることで対応可能である。また、例としてあげた信号ビット幅はそれを限定するものではない。
【００８５】
ここで、上述した第１の実施形態における動作内容にあっては、その各工程の実行内容をプログラム化し、これを前述したＣＰＵに実行させるように構成してもよい。この場合、本プログラムは、非一時的な記録媒体、例えば、ＤＶＤ、ＣＤ、フラッシュメモリ、等に記録されてもよい。この場合、本プログラムは、記録媒体からＣＰＵによって読み出され、実行される。後述する各実施形態についても同様である。
【００８６】
以上のように、本第１実施形態によると、例えばロック集合Ｃ（ｖ）とスレッドが有するロック集合Ｌ（ｔ）との演算に際しては、ブルームフィルタ（Bloom Filter）利用するのではなく、正確にＣ（ｖ）∩Ｌ（ｔ）を計算することとなり、これによりデータレースの検出率を有効に向上させることができる。同時に、ＣＰＵの一時的にストールことに対しては集合計算部（集合計算処理機能）から出力されるストール信号に応じて、遅延処理部（遅延処理機能）が有効に機能してＣＰＵを長時間ストールさせることなく最小限の停止時間で、データレースを有効に検出することができる。
【００８７】
又、オペレーティングシステム上で動作しているユーザプログラムのデータレースも検出可能にしたことである。有効ビット設定部を設けたので、データレースを検出する場合としない場合を区別できるようにしたためである。
【００８８】
更に、従来手法よりもメモリ容量を削減できることである。
その理由は少なくとも共有変数が置かれる静的領域およびヒープ領域のみデータレースを検出するために必要な記憶手段を用意したからである。
更に又、ＣＰＵ１０１と同等の速度で動作する機能を付加することで、実行速度を落とさずにデータレースを検出することができ、オペレーティングシステムが動作している場合でもデータレースを検出できることが可能となるという利点がある。
【００８９】
〔第２の実施形態〕
次に、第２実施形態を、図７に基づいて説明する。
ここで、前述した第１実施形態と同一の構成部材については同一の符号を用いるものとする。
【００９０】
この図７において、本第２実施形態におけるデバッグ検証装置では、前述した第１実施形態における書込みデータ収集部１１０に代えて、書込データ計算部４０１を設けた点に特徴を有する。
【００９１】
この場合、この新たな構成要素である書込データ計算部４０１は、前述した第二メモリ１０３へ書き込むデータとして、各変数の状態及び最終アクセスのスレッドＩＤとするか、又は前記各変数の状態及びロック集合とするかを、前記ステート計算部１０６が計算した新しい状態（ステート）に基づいて選択する機能を備えている。
【００９２】
この書込データ計算部４０１は、遷移先のステートが”ｅｘｃｌｕｓｉｖｅ”のときはＳ（ｖ）とスレッドＩＤを第二メモリ１０３に書き込み、遷移先のステートが”ｓｈａｒｅｄ”もしくは”ｓｈａｒｅｄ  ｍｏｄｉｆｉｅｄ”に遷移するときは、Ｓ（ｖ）とＣ（ｖ）を第二メモリ１０３に書き込むように動作する。その他の機能および動作は、前述した第１実施形態と同じである。
【００９３】
この場合、本第２実施形態では、前述したように第二メモリ１０３に書き込むデータを限定することで第二メモリ１０３に必要な容量を劇的に削減することが出来る。
なぜなら、前述した第１実施形態では共有しない変数に関してもＳ（ｖ），Ｔ（ｖ），Ｃ（ｖ）を第二メモリ１０３に格納する必要があるが、本第２実施形態では、異なるスレッド間で共有する変数Ｃ（ｖ）のみを限定して格納するようにした。
【００９４】
ここで、異なるスレッド間で共有される変数の数は、一般的にはプログラム全体の変数のごく一部である。このため、第二メモリ１０３に必要な容量を劇的に削減することが出来る。
その他の構成及びその作用効果は、前述した第１実施形態と同一となっている。
【００９５】
〔第３の実施形態〕
次に、本発明の第３実施形態を、図８乃至図１１に基づいて説明する。
ここで、前述した第２実施形態と同一の構成部材については同一の符号を用いるものとする。
【００９６】
この第３実施形態におけるデバック検証装置は、前述した第２実施形態におけるデバック検証装置に、第三メモリ５０１，位置計算部５０２，第三メモリ読出制御部５０３，およびバイパス機能部５０４を追加し、集合計算部１０７の動作を一部修正された構成となっている。
【００９７】
この場合、この第３実施形態におけるデバック検証装置では、前述した第２実施形態において、第二メモリ１０３に並列に、前記各変数のロック集合Ｃ（ｖ）をロックＩＤの昇順もしくは降順の何れか一方の手順によって格納するための第三メモリ５０１を設けられている。
【００９８】
更に、この第三メモリ５０１に対す読出し及び書き込を行う第三メモリ用の読出制御部５０３および書込制御部５０１Ａをそれぞれ設けると共に、前記各変数のロック集合を前記第三メモリ５０１のどの位置に格納するかを決定する位置計算部５０２が、前記第三メモリ５０１に併設されている。又、前記集合計算部１０７が、前記第三メモリ５０１から読み出したロック集合と前記ロック集合保持部１０４が保有するロックＩＤとから新たなロック集合を計算する機能を備えた構成とした。
【００９９】
これにより、前述した第２実施形態では、Ｃ（ｖ）に入れられるロックの数が第二メモリ１０３のデータ幅を超えてしまうと正常に動作できないため、予めＣ（ｖ）の要素数を限定する必要があったが、本第３実施形態はその限定を解除することができる。この限定に関しては、Ｌ（ｔ）に関しても同様である。尚、この図８では、各構成要素相互間の配線は一部省略してある。
【０１００】
以下、これを更に詳述する。
まず、この第３実施形態におけるデバック検証装置にあって、第二メモリ１０３は、Ｓ（ｖ）が exclusive  のときは”Ｓ（ｖ）”および”Ｔ（ｖ）”を格納し、その他の場合は”Ｓ（ｖ）”と「第三メモリ５０１へのアドレス」を格納する。
格納する位置（アドレス）は、前述した第１実施形態の場合と同じく第一メモリ１０２における変数ｖと同じである。
これにより、第二メモリ１０３のアドレス信号として、ＣＰＵ１０１から出力されるアドレス信号を利用することができ、余計な構成要素を省くことが出来る。
【０１０１】
また、第二メモリ１０３の幅は、第三メモリ５０１のデータの深さをＸとすると、
２＋ｍａｘ｛〔ｌｏｇ＿２（Ｘ）〕，スレッドＩＤのビット幅｝で十分である。ただし、〔  Ａ  〕はＡ以上の整数で最も小さい数を示し、ｍａｘ｛  Ａ，  Ｂ  ｝は、Ａ，Ｂの内の大きい数を示す。
【０１０２】
又、第三メモリ５０１は、前述したＣ（ｖ）を格納するメモリである。第１実施形態の場合とは異なり、アドレス０番地から順にＣ（ｖ）を格納する（もちろん逆から格納してもよい／昇順又は降順の各格納が可能）。又、全てのＣ（ｖ）を一つのアドレスに配置するのではなく、図９のように、複数のアドレスに配置して並べるとよい。
ここで、この図９にあっては、縦軸はメモリの深さを表す。このようにすることで、第三メモリ５０１のメモリ容量の幅も事前に定めることが出来る。
【０１０３】
又、図９の第二メモリ１０３の状態（ステート）の値は、前述した第１実施形態の場合と同じく、start を”００”（２進数表示）、exclusive を”０１”、sharedを”１０”、shared  modifiedを”１１”としているが、これに限定されるものではない。
【０１０４】
ロック集合保持部１０４も、第三メモリ５０１と同じようにロックの数（ｓｉｚｅ）とロックＩＤを保持する。従って、図９に開示した例の場合は、アドレス０に３、アドレス１にＬＡ  、アドレス２にＬＢ  、アドレス３にＬＣ  を格納している例である。
そして、前述したＣ（ｖ）∩Ｌ（ｔ）の計算を高速に行うためには、ロックＩＤは昇順（もしくは降順）に並べる必要がある。従って、ロックＩＤを追加および削除するときには、ＮをロックＩＤの数とすればオーダーＮの時間が必要である。
【０１０５】
又、位置計算部５０２は、ステート（状態）が  ”exclusive ”から  ”shared  modified”若しくは  ”exclusive ”から  ”shared  ”へ遷移するとき、第三メモリ５０１のアドレス位置を決定する機能である。
【０１０６】
一方、ＣＰＵ１０１がリセットする時はアドレス０から確保するため、位置計算部５０２も０とし、前述した遷移が起きたときに「Ｌ（ｔ）の要素数＋１個分（ｓｉｚｅの分）」を確保する。
この場合、例えば、図９のように、新たに変数ｒのステートが  ”exclusive ”から”shared  modified”になる場合を考える。
【０１０７】
このとき、第三メモリ５０１は４＋２の６個分利用中である。このため、位置計算部５０２は６（アドレスは０から開始するため７ではなく６）を保持しており、ロック集合保持部１０４が保持しているロックは、Ｌ（ｔ）＝｛ＬＢ  、ＬＤ  ｝とする。
この場合、位置計算部５０２は既に利用している６を第二メモリに出力し、位置計算部５０２内部で管理しているカウンタは３増加（＝｜Ｌ（ｔ）｜＋１）して９（＝６＋３）とする。
【０１０８】
このように動作することで、隙間無くメモリを利用できる。
第三メモリ５０１に新しいＣ（ｖ）を追加するときも、Ｃ（ｖ）∩Ｌ（ｔ）の計算を高速に行うために、ロックＩＤは昇順（もしくは降順）に並べる必要がある。
【０１０９】
第三メモリ読出制御部５０３は、第二メモリ１０３から読み出された第三メモリ５０１のアドレスから順次データを読み出す機能である。
例えば、図９の変数ｑの場合は、第二メモリ１０３を読み出すことによって得られたアドレス４から読み出しを開始し、アドレス４に記録されているｓｉｚｅ分（この場合は１）データを読み出す。
ただし、ｓｉｚｅを読み出した後の動作は集合計算部１０７によって制御される。具体的な方法については後述する。
【０１１０】
又、集合計算部１０７は、第三メモリ５０１とロック集合保持部１０４とから、それぞれのデータを読み出し、Ｃ（ｖ）∩Ｌ（ｔ）を計算する機能である。
図１０にＣＰＵ１０１が変数ｒをリードしたとき（クロックサイクル１）の集合計算部１０７および全体の動作例を示す。
この図１０において、クロックサイクル２では、第２メモリ５０１から読み出したｓｔａｔｅ＝”１１”（shared  modified）、第三メモリのアドレス＝６を利用して、Ｃ（ｖ）（第三メモリ５０１）がどのくらいのロックを保持しているかを示すＳｉｚｅを読み出すように制御する。
【０１１１】
このとき、合わせてＬ（ｔ）（ロック集合保持部１０４）に関しても動作する。更に、第三メモリ５０１の書込ポートのアドレスは「読込アドレス＋１」と設定する。次のクロックサイクル３からは各々のｓｉｚｅ分のデータを読出し続けるが、第三メモリ５０１から読み出されたロックＩＤがロック保持集合から読み出されたロックＩＤよりも大きい場合は、同じアドレスを読み続ける。これは逆の場合も同じである。
つまり、クロックサイクル４では第三メモリ５０１は引き続き同じアドレスを読み出すが、ロック保持集合は次のデータを読むようにアドレスを＋１する。
【０１１２】
そして、どちらか一方の要素すべてが読み終わるまで、動作を繰り返す。ただし、両者のロックＩＤが同じ場合、書込制御部１０８はライトイネーブルを１にして、一致したロックＩＤを第三メモリ５０１に書き込む（例：クロックサイクル５）。
そして、最後に一致したロックＩＤの数を、第二メモリから読み出したアドレスへ書き込む（例：クロックサイクル７）。
【０１１３】
以上で、集合計算部１０７のＣ（ｖ）∩Ｌ（ｔ）の計算は終了する。そして、このときの第三メモリ５０１の値を図１１に示す。アドレス８にＬＤ  が残っているが、ｓｉｚｅが１なので、これは今後利用されない。
【０１１４】
また、図１０に示す通り、ストール信号はどちらかの読出しを完了した時点（例：クロックサイクル６）で０とする。
このように制御することで、サイズを読み出す時間を隠蔽することが出来る。
【０１１５】
ただし、図１０では異なっているが、クロックサイクル７で第三メモリ５０１への書込アドレスと、読込アドレスが同じ場合は、リードは行わず、リードデータに書き込むべき値をバイパス機能５０５によりバイパスすることで、リードとライトの衝突を避けることが出来る。このとき第三メモリ５０１への書き込みは通常通り行う。
その他の構成およびその作用効果は前述した第２実施形態に場合と同様である。
【０１１６】
このように、第三メモリ５０１、位置計算部５０２、第三メモリ読出制御部５０３、バイパス機能５０４を追加することにより、要素数が大きいＣ（ｖ）もしくはＬ（ｔ）に対しても、データレースを検出することが出来る。
【０１１７】
〔第４の実施形態〕
次に、本発明の第４実施形態を、図１２に基づいて説明する。
ここで、前述した第３実施形態と同一の構成部材については同一の符号を用いるものとする。
【０１１８】
この第４実施形態におけるデバック検証装置は、前述した第３実施形態におけるデバッ検証装置に、第二メモリ書込制御部１０３Ａが追加されている。
【０１１９】
即ち、この第４実施形態におけるデバック検証装置では、前述した第３実施形態において、前記位置計算部５０２の計算結果と前記ステート計算部１０６の計算結果とに基づいて、前記集合計算部１０７によって計算された新しいロック集合の要素数が、前記第二のメモリ１０３が許容する一定値以下の場合に、当該変数の状態（ステート）と新しいロック集合とを前記第二のメモリ１０３に書き込む第二メモリ書込制御部１０３Ａを設けた点に構成上の特徴を有する。
【０１２０】
このため、前述した第３実施形態ではＣ（ｖ）は常に第三メモリ５０１に格納したが、本第４実施形態では、Ｃ（ｖ）の要素数が少ないとき（第三メモリ５０１のアドレスに必要なビット幅よりもＣ（ｖ）を格納するのに必要なビット幅が小さいとき）は、第二メモリ１０３に書き込む第三メモリ５０１へのアドレスの代わりに、Ｃ（ｖ）を格納するように変更した点に内容的な特徴を有する。
【０１２１】
一方、新規に追加した第二メモリ書込制御部８０１は、通常は第３実施形態の場合と同様に動作するが、ある変数に対するＣ（ｖ）∩Ｖ（ｔ）の要素数が小さいときは、第二メモリ１０３に書き込むように制御する機能を備えている。
例えば、第３実施形態の変数ｒのように、積集合の要素数が１になる場合には、ステート（“１１”）とＬＢ  とを、第二メモリ１０３に書き込む（図１０のクロックサイクル７）。
【０１２２】
勿論、このままでは書き込まれたＬＢ  が第三メモリ５０１へのアドレス信号なのか或いはロックＩＤなのか区別が付かない。そのため、それを区別する信号も合わせて第二メモリ１０３の同じアドレス位置へ書き込む必要がある。
これにより、次に読み込まれた場合には、第三メモリ５０１、第三メモリ読出制御部５０４、バイパス機能５０５は動作せず、前述した第１実施形態に場合と同じように動作する。
【０１２３】
このように構成され動作することで、第三メモリ５０１へ読み出しを減らすことが可能になり、ＣＰＵ１０１のストール数を削減することが可能となる。
その他の構成およびその作用効果は、前述した第３実施形態の場合と同様である。
【０１２４】
〔第５の実施形態〕
次に、本発明における第５実施形態を、図１３乃至図１４に基づいて説明する。
ここで、前述した第３実施形態と同一の構成部材については同一の符号を用いるものとする。
【０１２５】
この第５実施形態におけるデバック検証装置は、図１３に示すように、前述した第３実施形態におけるデバック検証装置にＯＲ機能部９０１およびＦＩＦＯ機能部９０２を追加し、更に、ロック集合保持部１０４およびＦＩＦＯ機能部９０２から前述したＣＰＵ１０１をストールできるようにした点に特徴を有する。
【０１２６】
即ち、この第５実施形態におけるデバック検証装置は、前述した第３実施形態において、前記第二のメモリ１０３に併設され当該第二のメモリ１０３の読み出し結果を一時的に格納すると共に内部のＦＩＦＯ処理が一杯のときは前記主演算制御部１０１をストールさせるように当該主演算制御部１０１に要求するＦＩＦＯ処理部９０２と、前記集合計算部１０７とは別に、前記ＦＩＦＯ処理部９０２およびロック集合保持部１０４からのストール要求に基づいて前記主演算制御部１０１をストールさせるＯＲ処理部９０１とを設ける構成とした。
【０１２７】
更に、前述したロック集合保持部１０４が、保持するロックＩＤに変更が生じた場合には前記ＦＩＦＯ処理部９０２が空になるまで前記主演算制御部１０１をストールさせるように要求するストール要求機能を備えた構成とした。
【０１２８】
ここで、ＯＲ機能部９０１は、ロック集合保持部１０４，集合計算部１０７，及びＦＩＦＯ機能部９０２から来たＣＰＵストール要求が一つでもあれば、ＣＰＵ１０１にストールを要求する（ストール信号をアクティブにする）機能である。
【０１２９】
ＦＩＦＯ機能部９０２は、読出制御部１１１が第二メモリ１０３から読み出したデータを一時的に格納するものである。一方、第三メモリ読出制御部５０４は、ＦＩＦＯ機能部９０２にデータが蓄えられ、集合計算部１０７が動作していないときは、ＦＩＦＯ機能部９０２から新たにデータを読み出すように動作する。
更に、ＦＩＦＯ機能部９０２は、内部にあるＦＩＦＯが一杯になった場合にはストール信号を出してＣＰＵ１０１の動作を止めるよう要求する。
【０１３０】
又、前述したロック集合保持部１０４は、ロック集合に変化が起きたとき、ＦＩＦＯ機能部９０２に溜まっているデータが空になるまでＣＰＵ１０１をストールするように要求する。
これは、現在ＦＩＦＯ機能９０２に溜まっているデータが適切なロック集合でデータ計算出来るようにするためである。
【０１３１】
次に、本第５実施形態の動作のタイミングチャートを図１４に示す。
図１４では、前述した図１０（第３実施形態のタイミングチャート）と同様に、変数ｒの次に変数ｐがアクセスされたときの動作を表した図である。
ここで、集合計算部７０２は、クロックサイクル２〜６までが変数ｒのＣ（ｖ）∩Ｌ（ｔ）で、クロックサイクル７以降が変数ｐのＣ（ｖ）∩Ｌ（ｔ）の計算である。ただし、一部動作はオーバラップしている（クロックサイクル６参照）。
【０１３２】
又この図１４に示す通り、ＦＩＦＯ機能部９０２に第二メモリ１０３のデータを蓄えることにより、ＣＰＵ１０１をストールさせることなく、動作させることが出来る。
一方、ＦＩＦＯ機能部７０２の一時的なバッファが満杯（ＦＵＬＬ）になったときやＬ（ｔ）が変更されたときは、ＣＰＵ１０１は一旦ストールされるようになっている。
【０１３３】
ここで、多くの場合、ＣＰＵ１０１はｌｏａｄ／ｓｔｏｒｅ命令以外の命令を実行していることが多いことと、ロック集合Ｌ（ｔ）は頻繁に変更されないので、本第５実施形態により、ＣＰＵのストール数は劇的に低減できる。
その他の構成およびその作用効果は、前述した第３実施形態の場合と同様である。
【０１３４】
〔第６の実施形態〕
次に、本発明のおける第６実施形態を、図１５乃至図１６に基づいて説明する。
ここで、前述した第５実施形態と同一の構成部材については同一の符号を用いるものとする。
【０１３５】
この第６実施形態におけるデバック検証装置は、図１５に示すように、前述した第５実施形態におけるデバック検証装置に、クロックカウンタ１０１Ｂを追加した点に特徴を有する。このクロックカウンタ１０１Ｂは、ＣＰＵ１０１が動作している（ストール時は除く）とき、常にカウントアップし続けるカウンタである。ただし、リセット時の値は適当な値でよい。
【０１３６】
又、本第６実施形態は、具体的には、前述した第５実施形態において、前記ＰＣＴ（主演算制御部）１０１のクロックによって１ずつ値を増加させるクロックカウンタ１０１Ａを設けると共に、前記ＦＩＦＯ処理部９０２は、前記第三メモリ１０３へのアドレスの他にそのアクセスが起きた前記クロックカウンタ１０１Ｂの値を格納するように動作を変更するカウンタ値格納機能を備えている。
【０１３７】
更に、前述したロック集合保持部１０４については、各ロックを獲得したときのクロックカウンタ１０１Ｂの値と、ロックを遺失したときのクロックカウンタ１０１Ｂの値とがあれば、それを保持するように動作を変更するカウンタ値保持機能を備えた構成とした。又、前述した集合計算部１０７については、前記ＦＩＦＯ処理部９０２から読み出したクロックカウンタ１０１Ｂの値が各ロックの獲得時の値と遺失時の間にある場合のみ比較を行うと共に新しいロックの計算を行う新ロック計算処理機能を備えた構成とした。
【０１３８】
即ち、上述したロック集合保持部１０４は、ロックＩＤの他に、ロックＩＤが取得された時刻と、削除された時刻を保持する機能が付されている。つまり、本第６実施形態の場合、前述した第５実施形態の場合とは異なり、ロックが削除されてもすぐに削除されず、削除された時刻を追加するように動作する点に、構成上の特徴を有する。
尚、ロックが削除されるのは、今現在、集合計算部１０７が処理しているアクセスの時刻が、ロックが削除された時刻より古い場合である。
【０１３９】
ただし、ロックの削除はＦＩＦＯ機能部９０２が空のときのみ動作する。
このようにすることで、ロックの削除にかかる時間を削減することが出来る。
ただし、一旦削除されたロックがロック集合保持部１０４にまだある段階で、再び追加された場合は、データを正常に処理するために、ロック集合保持部１０４はＣＰＵ１０１を一旦ストールさせて、ＦＩＦＯ機能部９０２にあるデータをすべて処理した後、新たにロックを追加してからストールを解除するように動作する。
【０１４０】
一方、ＦＩＦＯ機能部９０２には、第三メモリ５０１へのアドレスの他に、アクセスが起きたクロックカウントの値が格納される。
【０１４１】
集合機能計算１０７は、各ロックＩＤの比較を行うとき、アクセスされた時刻が、ロックＩＤが取得された時刻と削除された時刻の間にある場合のみ、一致計算を行う。
つまり、変数ｒがアクセスされた時刻が２００で、ロック集合保持部１０４にある時刻が図１６に示す状態である場合には、ロック集合保持部１０４にあるＬＡ  、ＬＥ  の計算は行われない。
【０１４２】
このように構成することで、更に、ＣＰＵ１０１のストールを削減することが出来る。何故ならば、ロックは「ロック→共有変数へのアクセス→アンロック」の手順で使用されるため、前述した第５実施形態ではロック，アンロックの度にＣＰＵをストールさせる必要が生じるが、本第６実施形態ではＣＰＵ１０１をストールさせることなくＣ（ｖ）∩Ｌ（ｔ）を計算させることが出来るからである。
【０１４３】
以上、上記各実施形態では、すべての変数のサイズは同じであったが、第二メモリ１０３のアドレスをバイト単位とすることで、一般的なＣＰＵで利用できる大きさの異なる変数にも容易に対応することが出来る。この場合、複数バイトを利用するデータ（たとえばｉｎｔ型であれば４ｂｙｔｅ）は、Ｃ言語の機能であるｕｎｉｏｎを利用しなければ、各変数に対して異なるバイトイネーブルでアクセスすることはないため、先頭のバイトだけステートやＣ（ｖ）∩Ｌ（ｔ）を計算すればよい。
【０１４４】
逆に、第一メモリ１０２上で複数アドレスを利用して変数を形成するもの（ｌｏｎｇ
ｄｏｕｂｌｅなど）であれば、同じ変数であることを区別する手段がないため、同じ計算を２回繰り返す必要がある。
その他の構成及びその作用効果は前述した第５実施形態の場合と同一となっている。
【０１４５】
以上のように、本発明については第１乃至第６の各実施形態によってその内容の全貌を開示したが、これらの各実施形態の内容をまとめると、以下の付記のように成る。尚、この付記については、本発明の内容をこれに限定するものではない。
【０１４６】
〔付記１〕
所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部１０１と、当該主演算制御部用のデータメモリである第一メモリ１０２とを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態が空集合となった場合に、前記主演算制御部１０１が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成のデバック検証装置であって、
前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリ１０２と同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリ１０３と、
前記第二メモリ１０３に格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて前記各変数の新しい状態を計算するステート計算部１０６と、
前記第二メモリ１０３に格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて新たなロック集合を計算して当該第二メモリ１０３に格納すると共に、１サイクル内では新たなロック集合を計算できない場合には当該計算の終了まで前記主演算制御部１０１をストールさせる機能を有する集合計算部１０７とを備えたことを特徴とするデバック検証装置。
【０１４７】
〔付記２〕
付記１に記載のデバック検証装置において、
前記主演算制御部１０１に併設され、前記ステート計算部１０６による新たなロック集合の計算に際しては、前記主演算制御部１０１の稼働時に当該主演算制御部１０１から前記第一メモリ１０２に向けて出力されるバイトイネーブル信号およびリード／ライト信号を適度に遅延させる信号遅延処理部１１２を設け、
前記ステート計算部１０６は、前記遅延処理部１１２で適度に遅延された前記バイトイネーブル信号およびリード／ライト信号を入力すると共に、これと前記各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて前記変数の新たな状態（ステート）を算定する状態算定機能を備えていることを特徴としたデバック検証装置。
【０１４８】
〔付記３〕
付記１に記載のデバック検証装置において、
前記第二メモリ１０３は、前記主演算制御部１０１からのリード指令及びライト指令に同時に対応可能であり、且つ前記プログラムが備えている各変数に対して当該各変数の前記第一メモリ１０２と同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合の格納を可能とした容量のものであることを特徴としたデバック検証装置。（即ち、Readと Writeとが同時に行えて且つプログラムの共有変数が置かれる領域が入る深さを持つ）
【０１４９】
〔付記４〕
付記２に記載のデバック検証装置において、
前記主演算制御部１０１からの前記第一メモリ１０２へのアドレスおよびバイトイネーブル信号から前記第二メモリ１０３へのアドレス信号およびバイトイネーブル信号を生成する第二メモリ用の書込制御部１０８を設けると共に、この第二メモリ用の書込制御部１０８が、生成された前記アドレスおよびバイトイネーブル信号を前記第二メモリ１０３に入力する構成としたことを特徴とするデバック検証装置。
【０１５０】
〔付記５〕
付記４に記載のデバック検証装置において、
前記第二メモリ１０３に、前記主演算制御部１０１から出力されるアドレス信号，バイトイネーブル信号，及び集合計算部１０７からのストール信号に基づいて前記第二メモリ１０３を読み出す第二メモリ用読出制御部１１１を併設したことを特徴とするデバック検証装置。
【０１５１】
〔付記６〕
付記５に記載のデバック検証装置において、
前記主演算制御部１０１が実行対象とするスレッドを保有するロック集合を格納するロック集合保持部１０４と、前記実行対象のスレッドにかかるスレッドＩＤを保持するスレッドＩＤ保持部１０５とを備えていることを特徴としたデバック検証装置。
【０１５２】
〔付記７〕
付記１乃至６の何れか一つに記載のデバック検証装置において、
前記主演算制御部１０１でデータレースの検出を意図したプログラムが実行されている場合に機能し、前記各ロック集合保持部１０４、スレッドＩＤ保持部１０５、ステート計算部１０６、集合計算部１０７、第二メモリ用の書込制御部１０８、第二メモリ用の読出制御部、および信号遅延処理部１１２の全体のオン／オフ動作を設定する有効ビット設定部１０９を、前記主演算制御部１０１に併設したことを特徴としたデバック検証装置。
【０１５３】
〔付記８〕
付記６に記載のデバック検証装置において、
前記スレッドＩＤ保持部１０５に保持されているスレッドＩＤと、前記集合計算部１０７の計算結果とに基づいて前記第二メモリ１０３へ書き込むデータを計算する書込みデータ収集部１１０を設け、これを前記第二メモリ１０３に併設したことを特徴としたデバック検証装置。
【０１５４】
〔付記９〕（第２実施形態）
付記８に記載のデバック検証装置において、
前記書込みデータ収集部１１０に代えて書込データ計算部４０１を設けると共に、
この書込データ計算部４０１が、前記第二メモリ１０３へ書き込むデータとして、各変数の状態及び最終アクセスのスレッドＩＤとするか、又は前記各変数の状態及びロック集合とするかを、前記ステート計算部１０６が計算した新しい状態（ステート）に基づいて選択する機能を備えていることを特徴とするデバッグ検証装置。
【０１５５】
〔付記１０〕（第３実施形態）
付記９に記載のデバック検証装置において、
前記第二メモリ１０３に並列に、前記各変数のロック集合Ｃ（ｖ）をロックＩＤの昇順もしくは降順の何れか一方の手順によって格納するための第三メモリ５０１を設け、
この第三メモリ５０１に対す読出し及び書き込むを行う第三メモリ用の読出制御部５０３および書込制御部５０１Ａをそれぞれ設けると共に、
前記各変数のロック集合を前記第三メモリ５０１のどの位置に格納するかを決定する位置計算部５０２を、前記第三メモリ５０１に併設し、
前記集合計算部１０７が、
前記第三メモリ５０１から読み出したロック集合と前記ロック集合保持部１０４が保有するロックＩＤとから新たなロック集合を計算する機能を備えていることを特徴とするデバッグ検証装置。
【０１５６】
〔付記１１〕（第４実施形態）
付記１０に記載のデバック検証装置において、
前記位置計算部５０２の計算結果と前記ステート計算部１０６の計算結果とに基づいて、前記集合計算部１０７が計算した新しいロック集合の要素数が前記第二のメモリ１０３が許容する一定値以下の場合に、当該変数の状態（ステート）と新しいロック集合とを前記第二のメモリ１０３に書き込む第二メモリ書込制御部１０３Ａを設けたことを特徴とするデバッグ検証装置。
【０１５７】
〔付記１２〕（第５実施形態）
付記１０に記載のデバック検証装置において、
前記第二のメモリ１０３に併設され当該第二のメモリ１０３の読み出し結果を一時的に格納すると共に内部のＦＩＦＯ処理が一杯のときは前記主演算制御部１０１をストールさせるように当該主演算制御部１０１に要求するＦＩＦＯ処理部９０２と、
前記集合計算部１０７とは別に、前記ＦＩＦＯ処理部９０２およびロック集合保持部１０４からのストール要求に基づいて前記主演算制御部１０１をストールさせるＯＲ処理部９０１とを有し、
前記ロック集合保持部１０４は、保持するロックＩＤに変更が生じた場合には前記ＦＩＦＯ処理部９０２が空になるまで前記主演算制御部１０１をストールさせるように要求するストール要求機能を備えていることを特徴とするデバック検証装置。
【０１５８】
〔付記１３〕（第６実施形態）
付記１２に記載のデバッグ検証装置において、
前記主演算制御部１０１のクロックによって１ずつ値を増加させるクロックカウンタ１０１Ａを設けると共に、
前記ＦＩＦＯ処理部９０２は、前記第三メモリ１０３へのアドレスの他にそのアクセスが起きた前記クロックカウンタ１０１Ｂの値を格納するように動作を変更するカウンタ値格納機能を備え、
前記ロック集合保持部１０４は、各ロックを獲得したときのクロックカウンタ１０１Ｂの値と、ロックを遺失したときのクロックカウンタ１０１Ｂの値があればそれを保持するように動作を変更するカウンタ値保持機能を備え、
前記集合計算部１０７は、前記ＦＩＦＯ処理部９０２から読み出したクロックカウンタ１０１Ｂの値が各ロックの獲得時の値と遺失時の間にある場合のみ比較を行うと共に新しいロックの計算を行う新ロック計算処理機能を備えていることを特徴とするデバッグ検証装置。
【０１５９】
〔付記１４〕（方法の発明／付記１に対応）
所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部１０１と、当該主演算制御部１０１用のデータメモリである第一メモリとを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態（ステート）が空集合となった場合に、前記主演算制御部１０１が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成のデバック検証装置にあって、
前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリと同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリが設けられた場合、
この第二メモリに格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、予め装備されたステート計算部１０６が前記各変数の新しい状態を計算し（前記第二メモリに格納する／新ステート計算工程）、
前記第二メモリ１０３に格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、予め装備された集合計算部１０７が新たなロック集合を計算して当該第二メモリ１０３に格納し（新ロック集合計算工程）、
この新たなロック集合の計算がタイミング信号の１サイクルの間ではできない場合に当該計算が終わるまで前記主演算制御部１０１のストールを、前記集合計算部１０７が当該主演算制御部１０１に要求し実行させるようにしたこと（主演算制御部１０１用ストール実行工程）を特徴とするデバック検証方法。
【０１６０】
〔付記１５〕（付記２対応）
付記１４に記載のデバック検証方法において、
前記ステート計算部１０６による新たなロック集合の計算に際しては、
当該ロック集合の計算に先立って、前記主演算制御部１０１の稼働時に当該主演算制御部１０１から前記第一メモリに向けて出力されるバイトイネーブル信号およびリード／ライト信号を、予め装備された信号遅延処理部１１２が適度に遅延させる作動し、
この適度に遅延された前記バイトイネーブル信号およびリード／ライト信号を入力すると共に、これと前記各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、前記ステート計算部１０６が前記新しい状態（ステート）を計算することを特徴とするデバック検証方法。
【０１６１】
〔付記１６〕（プログラム発明／付記１対応）
所定のプログラムを実行すると共に外部からのストール信号があった場合にその動作を停止する機能を備えた主演算制御部１０１と、当該主演算制御部１０１用のデータメモリである第一メモリ１０２とを備え、前記プログラム中の複数の変数の内の一の変数ｖを排他制御するために利用しているロックの集合Ｃ（ｖ）の状態（ステート）が空集合となった場合に、前記主演算制御部１０１が前記一の変数ｖの排他制御が不能となるデータレースの発生を認定する構成のデバック検証装置にあって、
前記プログラムが備えている各変数に対し、当該各変数の前記第一メモリ１０２と同じアドレスに各変数の状態，最終アクセスのスレッドＩＤ，およびロック集合が格納された第二メモリ１０３が設けられている場合、
前記第二メモリ１０３に格納された各変数の状態，最終アクセスのスレッドＩＤ，及びロック集合とに基づいて、新たなロック集合を計算して当該第二メモリ１０３に格納する新ロック集合計算処理機能、
及びこの新たなロック集合の計算がタイミング信号の１サイクル中に成し得ない場合に当該計算が終わるまで前記主演算制御部１０１のストールを、当該主演算制御部１０１に要求し実行させる主演算制御部１０１用ストール実行処理機能、
を設け、
これらの各処理機能を予め装備された集合計算部１０７が備えているコンピュータに実現させるようにしたことを特徴とするデバック検証プログラム。
【０１６２】
〔付記１７〕（付記２対応）
付記１６に記載のデバック検証プログラムにおいて、
前記新ロック集合計算処理機能にて新たなロック集合の計算に際して使用される前記各変数の状態（ステート）については、
前記主演算制御部１０１の稼働時に当該主演算制御部１０１から前記第一メモリに向けて出力され且つ予め別に装備された信号遅延処理部１１２によって適度に遅延された前記バイトイネーブル信号およびリード／ライト信号に基づいて計算された新しい状態（ステート）のものを対象としたものであることを特徴とするデバック検証プログラム。
【産業上の利用可能性】
【０１６３】
本発明は、データレースを検出するに際し、Ｌｏｃｋ  Ｓｅｔを利用する構成としたので、当該データレースを高精度に検出することが可能となり、しかもその動作速度の低下を有効に抑えると共にＣＰＵの停止時間を少なくするようにしたので、システム全体の有効利用を更に一層高めることができる。
【符号の説明】
【０１６４】
１０１  ＣＰＵ（主演算制御部）
１０１Ａ  動作指令入力部タ
１０１Ｂ  クロックカウンタ
１０２  第一メモリ
１０３  第二メモリ
１０３Ａ  第二メモリ書込制御部
１０４  ロック集合保持部
１０５  スレッドＩＤ保持部
１０６  ステート計算部
１０７  集合計算部
１０８，５０１Ａ  書込制御部
１０９  有効ビット設定部
１１０  書込データ収集部
１１１  読出制御部
１１２  遅延機能部
４０１  書込データ計算部
５０１  第三メモリ
５０２  位置計算部
５０３  第三メモリ読出制御部
５０４  バイパス機能
９０１  ＯＲ機能部
９０２  ＦＩＦＯ機能部
【図１】
2013214172.tif 000003
【図２】
2013214172.tif 000004
【図３】
2013214172.tif 000005
【図４】
2013214172.tif 000006
【図５】
2013214172.tif 000007
【図６】
2013214172.tif 000008
【図７】
2013214172.tif 000009
【図８】
2013214172.tif 000010
【図９】
2013214172.tif 000011
【図１０】
2013214172.tif 000012
【図１１】
2013214172.tif 000013
【図１２】
2013214172.tif 000014
【図１３】
2013214172.tif 000015
【図１４】
2013214172.tif 000016
【図１５】
2013214172.tif 000017
【図１６】
2013214172.tif 000018
【図１７】
2013214172.tif 000019