効率的な決定論的マルチプロセッシング(deterministicmultiprocessing)
专利摘要:
マルチプロセッシングシステムにおいて、マルチスレッドアプリケーションのスレッドによって実行される操作の順序を制御するためのハードウェアおよび/またはソフトウェアファシリティが提供される。ファシリティは、マルチスレッドアプリケーションに同じ入力が与えられると、マルチプロセッシングシステムが操作を決定論的にインターリーブし、それによってマルチスレッドアプリケーションが実行されるたびに同じ出力を生成するように、マルチスレッドアプリケーションの実行をシリアル化または選択的にシリアル化することができる。ファシリティは、マルチスレッドアプリケーションコードの実行を、決定論的操作数を指定する2つ以上の量子に分割し、スレッドが2つ以上の量子を実行する決定論的順序を指定する。決定論的操作数は、マルチスレッドアプリケーションのクリティカルパスに従うように構成され得る。指定されたメモリ操作は、証明可能にローカルなデータにアクセスするものなど、決定論的順序にかかわらず、実行され得る。ファシリティは、識別されたバグ情報の動的なバグ回避および共有を提供することができる。 公开号:JP2011515000A 申请号:JP2010550845 申请日:2009-03-11 公开日:2011-05-12 发明作者:オスキン,マーク・エイチ;セゼ,ルイス;デヴィエッティ,ジョセフ・ルーク;ルシア,ブランドン・マイケル 申请人:ユニバーシティ・オブ・ワシントン; IPC主号:G06F9-46
专利说明:
[0001] 本願の実施例は、例えば、効率的な決定論的マルチプロセッシングに関する。] 背景技術 [0002] 本出願は、参照により本明細書に組み込まれる2008年3月11日出願の「A METHODFOR EFFICIENTDETERMINISTIC MULTITHREADING(効率的な決定論的マルチスレッディングのための方法)」という名称の米国特許仮出願第61/035,490号の利益を主張する。本出願は、参照により本明細書に組み込まれる2007年12月12日出願の「DETERMINISTIC MULTIPROCESSING(決定論的マルチプロセッシング)」という名称の米国特許仮出願第61/013,019号の利益を主張する2008年12月12日出願の「DETERMINISTIC MULTIPROCESSING(決定論的マルチプロセッシング)」という名称の米国特許出願第12/334,336号に関連する。] [0003] マルチプロセッシングは、2つ以上の処理装置がそれぞれ1つまたは複数のプロセス(プログラムまたは命令のセット)を同時に実行する動作モードである。マルチプロセッシングシステムの目的は、処理速度を向上させることである。通常、これは、各処理装置が同じプロセスの異なる命令のセットまたは異なるスレッドを処理することによって達成される。プロセスは、1つまたは複数のスレッドを実行することができる。各スレッドは、それ自体のプログラムコンテキストを含むそれ自体のプロセッサコンテキストを有する。従来、アプリケーションがマルチプロセッシングの利益を利用するためには、ソフトウェア開発者は、アプリケーションをマルチスレッド型で書く必要がある。本明細書で使用する場合、マルチスレッドアプリケーションとは、2つ以上のスレッドを同時に実行することができるプログラムを指す。] [0004] マルチプロセッサまたはマルチコアシステム(まとめて「マルチプロセッシングシステム」と呼ぶ)において、マルチスレッドアプリケーションの2つ以上のスレッドは同時に実行することができ、各プロセッサまたはコアが特定のスレッドを実行する。マルチスレッドアプリケーションのスレッドが、同時実行中に、例えばメモリなどリソースを共有することは、一般的である。本明細書で使用される場合、同時実行とは、マルチスレッドアプリケーションの2つ以上のスレッドの同時の実行を指す。同時実行の結果、マルチスレッドアプリケーションの2つ以上のスレッドが同じ共有リソースを読み取り、および/または更新することができる。例えば、あるスレッドは、共有メモリロケーションの値を変更することができ、一方、別のスレッドは、共有メモリロケーションに格納された値に応じて、一連の操作を実行する。] [0005] 従来のソフトウェア開発モデル下で、ソフトウェア開発者は、そのマルチスレッドアプリケーション内の並列スレッドを識別し、正しく同期しようと試みることにかなりの時間量を費やす。例えば、開発者は、ロック、セマフォ、バリア、または他の同期機構を明示的に使用して、共有リソースへのアクセスを制御することができる。スレッドが共有リソースにアクセスするとき、同期機構は、リソースが使用可能になるまで、これらのスレッドを一時停止することによって、他のスレッドがリソースにアクセスするのを防ぐ。同期機構を明示的に実装するソフトウェア開発者は、通常、同期コードをデバッグするのにもかなりの時間量を費やす。しかし、通常、同期エラーに起因するソフトウェアの欠陥(バグとも呼ばれる)が一時的に表面化する(すなわち、インターリーブされたスレッド操作の特定のシーケンスにのみバグが現れる可能性がある)。その結果、欠陥のあるソフトウェアは、小さな同期バグが現れる前に、何百回も正しく実行する可能性がある。] [0006] こうしたシステムにおけるスレッドの様々なインターリービングによって非決定論的挙動が作り出されるため、マルチプロセッシングシステムのためのソフトウェアを開発することは難しい。インターリービングとは、スレッド間の対話を含み得るスレッド操作の順序を指す。スレッド間の可能なインターリービングの数は、スレッドの数が増すにつれて、著しく増す。その結果、マルチスレッドアプリケーションは、誤り検出およびモデリングプログラムの挙動に関して、追加の問題を提示する。例えば、マルチスレッドアプリケーションに同じ入力が与えられると、マルチプロセッシングシステムは、スレッド操作を非決定論的にインターリーブし、それによって、マルチスレッドアプリケーションが実行されるたびに異なる出力を生成する。図1は、マルチプロセッシングシステムにおいて実行されるマルチスレッドアプリケーションにおける2つの可能なスレッドインターリービングの例を示す高レベル図である。図示されるように、アプリケーションは、少なくとも2つのスレッド、スレッド1およびスレッド2を含む。アプリケーションが呼び出されると、ある時点で、スレッド1は、変数Aの値を1に設定する(A=1)操作、次いで変数Bの値を変数Aの値に設定する(B=A)操作を実行し、スレッド2は、変数Bの値をゼロに設定する(B=0)操作、次いで変数Aの値を変数Bの値に設定する(A=B)操作を実行する。図示されるように、スレッド1およびスレッド2の操作は、非決定論的にインターリーブされ、それによって、アプリケーションが呼び出されるたびに、異なる出力を生成する。すなわち、最初に示された呼び出し中、操作のインターリービングによって変数AおよびBがそれぞれゼロに設定され、2番目に示された呼び出し中、操作のインターリービングによって変数AおよびBがそれぞれ1に設定された。] 図1 [0007] マルチスレッド実行における非決定性は、例えば、他のプロセスが同時に実行する、オペレーティングシステムリソースの割り当てにおける差、キャッシュの状態、トランスレーションルックアサイドバッファ(「TLB」)、バス、割り込み、および他のマクロアーキテクチャ構造など、実行環境におけるわずかな変化に起因し得る。] 発明が解決しようとする課題 [0008] その結果、マルチスレッドアプリケーションを開発することは、シングルスレッドアプリケーションを開発するよりかなり難しい。] 課題を解決するための手段 [0009] 従来、この問題に対処するにあたっての取り組みは、以前生成されたログファイルに基づいてマルチスレッド実行を決定論的に再生することに焦点を当てていた。しかし、決定論的再生システムは、再生ログファイルの維持に伴うオーバーヘッドの結果、かなりの性能の低下を受ける。さらに、決定論的再生では、ソフトウェア開発者は、スレッドのインターリービングがどのように実行されるかを制御しない。その結果、ソフトウェアが顧客に配布される前に、操作の特定のインターリービングに起因する同期バグは、識別(およびより重要には修正)されない場合がある。非決定性は、テストカバレージを評価するのを難しくする点で、ソフトウェア開発プロセスをさらに複雑にする。良好なカバレージは、広範なプログラム入力と、広範な可能なスレッドインターリービングとを必要とする。] [0010] ファシリティの1つまたは複数の実施形態が、添付の図面の図に例として、かつ限定されないものとして示されている。図中、参照番号は、類似の要素を示す。] 図面の簡単な説明 [0011] マルチスレッドプログラムにおける、2つの可能なスレッドインターリービングの一例を示す高レベル図である。 1つまたは複数の実施形態における、ファシリティによって実行される決定論的シリアル化プロセスのフロー図である。 1つまたは複数の実施形態における、ファシリティによって実行される決定論的選択的シリアル化プロセスのフロー図である。 1つまたは複数の実施形態における、ファシリティが実行するコンピューティングシステムのアーキテクチャ例を示す高レベルブロック図である。 1つまたは複数の実施形態における、決定論的マルチプロセッシングシステムの様々な機能的要素を示す高レベルブロック図である。 1つまたは複数の実施形態における、マルチプロセッサコードを決定論的にするためにファシリティによって使用されるデータ構造を示す高レベルブロック図である。 1つまたは複数の実施形態における、スレッドを作成し、決定論的に実行する一例を示す高レベル図である。 1つまたは複数の実施形態における、マルチプロセッサコードを決定論的にするためにトランザクショナルメモリシステムを使用する一例を示す高レベルブロック図である。 1つまたは複数の実施形態における、アプリケーションを増補(augment)するためにファシリティによって実行されるプロセスを示すフロー図である。 1つまたは複数の実施形態における、ブロックを構文解析するためにファシリティによって実行されるプロセスを示すフロー図である。 1つまたは複数の実施形態における、マルチスレッドアプリケーションの増補された機能の制御フローグラフの一例である。 1つまたは複数の実施形態における、決定論的マルチプロセッシング初期化関数を示すフロー図である。 1つまたは複数の実施形態における、決定論的マルチプロセッシングコミット関数を示すフロー図である。 1つまたは複数の実施形態における、共有テーブルを示す高レベルブロック図である。 1つまたは複数の実施形態における、マルチスレッドアプリケーションのアドレス空間におけるメモリロケーションごとのマスクを示す高レベルブロック図である。 1つまたは複数の実施形態における、ファシリティによって実行される適応量子プロセス(adaptive quanta process)を示すフロー図である。 1つまたは複数の実施形態における、共有メモリデータ構造へのアクセスに伴うオーバーヘッドを低減するためにファシリティによって実行されるプロセスのフロー図である。 1つまたは複数の実施形態における、仮想マシン内のマルチスレッドアプリケーションのスレッドの実行を決定論的に制御するために決定論的マルチプロセッシングシステムと共に実行するVMMを示す高レベルブロック図である。 1つまたは複数の実施形態における、ファシリティによって実行される監視プロセスのフロー図である。 1つまたは複数の実施形態における、バグアグリゲータサービス(bug aggregator service)を示す高レベルデータフロー図である。 1つまたは複数の実施形態における、トランザクショナルメモリフォワーディング(transactional memory forwarding)の一例を示す高レベル図である。 1つまたは複数の実施形態における、ファシリティによって実行されるトランザクショナルメモリフォワーディングプロセスを示すフロー図である。 1つまたは複数の実施形態における、バグファインダウェブサービス(bug finder web service)を示す高レベルデータフロー図である。 1つまたは複数の実施形態における、ファシリティによって実行されるバグファインダプロセスのフロー図である。 図25Aは、1つまたは複数の実施形態における、決定論的マルチプロセッシングシステムの様々な機能的要素を示す高レベルブロック図である。] 図25A [0012] 図25Bは、1つまたは複数の実施形態における、決定論的マルチプロセッシングシステムの様々な機能的要素を示す高レベルブロック図である。] 図25B [0013] 図25Cは、1つまたは複数の実施形態における、決定論的マルチプロセッシングシステムの様々な機能的要素を示す高レベルブロック図である。] 図25C 実施例 [0014] 決定論的再生システムなどの従来のシステムは、マルチスレッドアプリケーションの開発における非決定論的挙動に伴う問題を適切に解決しない。さらに、既存のシステムは、マルチスレッドアプリケーションの配置における非決定論的挙動に伴う問題を低減することも、解決しようと試みることもない。したがって、マルチスレッドアプリケーションの決定論的マルチプロセッシングのためのハードウェアおよび/またはソフトウェアファシリティ(「ファシリティ」)が開発された。本明細書で使用される場合、決定論的マルチプロセッシングという用語は、マルチスレッドアプリケーションに同じ入力が与えられると、マルチスレッドアプリケーションによって同じ出力が生成される技術を指す。例えば、共有リソースへのスレッドアクセスを同期するための負担から開発者を解放することによって、ファシリティは、マルチスレッドアプリケーションを開発する処理を簡略化する。さらにファシリティは、こうしたマルチスレッドアプリケーションが配置されるとき、例えば、開発者がバグを再生し、様々なスレッドインターリービングを厳格にテストできるようにすることによって、マルチスレッドアプリケーションの信頼性を向上させる。] [0015] いくつかの実施形態において、ファシリティは、マルチスレッドアプリケーションの実行を決定論的な有限数の操作の組(各組は、本明細書では「量子」と呼ばれる)に分割する。量子を識別するとき、ファシリティは、例えば、通信無しのスレッド操作など、並行して実行され得る操作と、スレッド間通信、システムコールなど、決定論的な順序で実行されるべき操作とを区別することができる。次いで、ファシリティによって識別される各量子は、決定論的順序で実行される。マルチスレッドアプリケーションのスレッドによって量子が実行される順序を制御することによって、ファシリティは、マルチスレッドアプリケーションが決定論的に挙動できるようにする。すなわち、同じ入力が与えられると、マルチスレッドアプリケーションのスレッドは、その操作を決定論的にインターリーブし、それによって同じ出力を提供する。いくつかの実施形態では、量子サイズ(すなわち、予め定義された数の操作)はスレッド間で異なり、一方、他の実施形態では、量子サイズは均一である。] [0016] いくつかの実施形態において、ファシリティは、マルチスレッドアプリケーションの実行をシリアル化する。すなわち、ファシリティは、すべてのスレッド操作のグローバルなインターリービングを制御することができる。例えば、これは、量子境界に到達したとき、スレッド間に決定論的順序で渡されるメモリアクセストークンを確立することによって達成され得る。スレッドは、トークンの値がそのスレッドの識別子に一致するとき、トークンを「保持する」と呼ばれ得る。トークンの値がスレッドの識別子に一致しないとき、トークンの値がスレッドの識別子に一致するまで、その実行は一時停止される。トークンの値がスレッドの識別子に一致するとき、スレッドは、トークンが次のスレッドに渡される前に、決定論的な有限数の操作(すなわち量子)を実行する。例えば、決定論的順序で次のスレッドの識別子に対応するように、トークンの値を進めることによって、トークンは、次のスレッドに渡され得る。] [0017] 図2は、1つまたは複数の実施形態における、ファシリティによって実行される決定論的シリアル化プロセス200のフロー図である。例えば、決定論的シリアル化プロセス200は、マルチスレッドアプリケーションがマルチプロセッシングシステム上で実行している間に実行され得る。マルチスレッドアプリケーションが実行している間、ファシリティは、スレッドごとにステップ205〜215をループする。ステップ205で、トークンの値がスレッドの識別子に一致することをファシリティが決定した場合、ファシリティはステップ210に進み、そうでない場合、ファシリティは折り返してステップ205に戻る。すなわち、ファシリティは、トークンの値がそのスレッドの識別子に一致するまで、スレッドの実行を一時停止する。ステップ210で、ファシリティは、識別子がトークンに一致するスレッドが決定論的な有限数の操作(すなわち量子)を実行できるようにし、次いでファシリティは、ステップ215に進む。ステップ215で、ファシリティは、トークンの値を、決定論的な順序で次のスレッドの識別子に等しくなるように設定し、次いでファシリティは、ステップ205に進む。ファシリティは、アプリケーションが終了するまで、シリアル化プロセス200をループし続けることができることに留意されたい。] 図2 [0018] 図2および以下のフロー図のそれぞれに示されるステップは様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、いくつかのステップの順序が並べ替えられてもよく、いくつかのサブステップが並行して実行されてもよく、いくつかの示されたステップが省略されてもよく、または他のステップが含まれていてもよい。] 図2 [0019] いくつかの実施形態において、ファシリティは、マルチスレッドアプリケーションの実行を選択的にシリアル化する。すなわち、ファシリティは、他のスレッド操作が並行して実行される間に、いくつかのスレッド操作のインターリービングを制御する(本明細書では「制御された操作」と呼ばれる)ことができる。例えば、ファシリティは、2つ以上のスレッド間の通信を伴う操作のインターリービングを制御することができる。スレッド間通信は、スレッドが別のスレッドによってプライベートに保持されるデータを読み取るとき、またはスレッドが共有データに書き込み、それをプライベート化するときに起こる。いくつかの実施形態において、スレッドが別のスレッドによってプライベートに保持されるとみなされるデータを読み取ろうと試みるとき、スレッドは、トークンの値がその識別子に一致し、すべての他のスレッドがその実行における決定論的ポイントに到達する(例えば、量子の実行を終了する、ブロックされるなど)まで、その実行を一時停止する。同様に、いくつかの実施形態において、スレッドは、共有される、または別のスレッドによってプライベートに保持されるとみなされるデータに書き込もうと試みるとき、トークンの値がその識別子に一致し、すべての他のスレッドがその実行における決定論的ポイントに到達するまで、その実行を一時停止する。その結果、ファシリティは、すべてのスレッドが、その実行での決定論的ポイントにおけるデータの状態の変化(共有からスレッドによってプライベートに保持されるまで)を観察することを確実にする。] [0020] いくつかの実施形態において、スレッド間通信を検出するために、ファシリティは、マルチスレッドアプリケーションのアドレス空間におけるメモリロケーションごとに、共有情報を含む共有メモリデータ構造を維持する。例えば、こうした情報は、メモリロケーションが共有である、プライベートであるなどを示すことができる。共有は、操作レベル、命令レベル、ページレベルなど、様々なレベルで起こり得ることに留意されたい。いくつかの実施形態において、スレッドは、それ自体のプライベートに保持されたデータにアクセスすることも、トークンを保持することなく共有データを読み取ることもできる。しかし、共有データに書き込むために、または別のスレッドによってプライベートとして保持されるデータを読み取るために、スレッドは、トークンを保持し、すべての他のスレッドがその実行における決定論的ポイントに到達するまで待つ。スレッドが、別のスレッドによってプライベートとみなされるメモリロケーションを読み取るとき、共有メモリデータ構造は、読み取られたメモリロケーションを共有されたものとみなすべきであることを示すために更新される。スレッドがメモリロケーションに書き込むとき、メモリロケーションをそのスレッドによってプライベートに保持されているものとみなすべきであることを示すために、共有メモリデータ構造が更新される。同様に、スレッドが別のスレッドによってこれまではアクセスされていないメモリロケーションを読み取るとき、共有メモリデータ構造は、メモリロケーションをそのスレッドによってプライベートに保持されているものとみなすべきであることを示すために更新される。] [0021] いくつかの実施形態において、ファシリティは、共有メモリデータ構造を共有テーブルとして実装する。図14は、いくつかの実施形態における、共有テーブル1400を示す高レベルブロック図である。共有テーブル1400は、マルチスレッドアプリケーションのアドレス空間におけるメモリロケーション1405ごとの共有情報を維持する。共有は、操作レベル、命令レベル、ページレベルなど、様々なレベルで起こり得ることに留意されたい。共有テーブル1400は、メモリロケーション1405ごとに、そのロケーションに格納されるデータにアクセスした2つ以上のスレッドを識別する共有データフィールド1410を含む。例えば、示された実施形態において、共有データフィールド1410は、メモリロケーションBに格納されたデータは、スレッド1、スレッド2、およびスレッド6によってアクセスされたことを示す。共有テーブル1400は、メモリロケーション1405ごとに、そのロケーションに格納されたデータがプライベートとみなされるスレッドを識別するプライベートデータフィールド1415を含む。例えば、示された実施形態において、プライベートデータフィールド1415は、メモリロケーションAおよびCがスレッド2に対してプライベートとみなされるデータを格納することを示す。] 図14 [0022] ファシリティが共有メモリデータ構造を様々な形で実装することができることを、当業者であれば理解されたい。例えば、いくつかの実施形態において、共有メモリデータ構造は、メモリロケーションごとに、そのメモリロケーションにアクセスしたすべてのスレッドを識別するビットマスクとして実装される。図15は、1つまたは複数の実施形態における、マルチスレッドアプリケーションのアドレス空間におけるメモリロケーション1505ごとのスレッドマスク1500を示す高レベルブロック図である。メモリロケーション1505は、その対応するスレッドマスク1500が単一のスレッド1510を識別するとき、プライベートとみなされる。例えば、メモリロケーションAおよびメモリロケーションCは、それらの対応するマスク1500aおよび1500cがスレッド2のみを識別するため、スレッド2に対してプライベートとみなされる。メモリロケーション1505は、その対応するスレッドマスク1500が2つ以上のスレッド1510を識別するとき、共有とみなされる。例えば、メモリロケーションBは共有とみなされる。というのは、その対応するスレッドマスク1500bがスレッド1、スレッド2、およびスレッドを識別するからである。スレッド1510の数は、アプリケーション間および/またはアプリケーションの状態間で変わり得ることに留意されたい。したがって、示した実施形態に示されるように、8つのスレッドの例は制限とみなされるべきではない。] 図15 [0023] 図3は、1つまたは複数の実施形態における、ファシリティによって実行される決定論的選択的シリアル化プロセス300のフロー図である。例えば、スレッドまたはプロセッサが、メモリ操作、システムコールなど、制御された操作を実行しようと試行すると、選択的シリアル化プロセス300が実行され得る。ステップ305で、操作がシステムコールである(例えばI/O操作など)ことをファシリティが決定した場合、ファシリティはステップ325に進み、そうでない場合、ファシリティはステップ310に進む。ステップ310で、操作がスレッドによってプライベートに保持されていないメモリにアクセスするとファシリティが決定した場合、ファシリティはステップ315に進み、そうでない場合、ファシリティはステップ355に進む。ステップ315で、操作が共有メモリにアクセスしたことをファシリティが決定した場合、ファシリティはステップ320に進み、そうでない場合、ファシリティはステップ325に進む。ステップ320で、操作が格納操作であることをファシリティが決定した場合、ファシリティはステップ325に進み、そうでない場合、ファシリティはステップ355に進む。ステップ325で、トークンの値がスレッドの識別子に一致することをファシリティが決定した場合、ファシリティはステップ330に進み、そうでない場合、ファシリティは折り返してステップ325に戻る。すなわち、ファシリティは、トークンの値が選択されたスレッドの識別子に一致するまで、選択されたスレッドの実行を一時停止する。ステップ330で、マルチスレッドアプリケーションのすべてのスレッドが一時停止(またはブロック)されたことをファシリティが決定した場合、ファシリティはステップ335に進み、そうでない場合、ファシリティは折り返してステップ330に戻る。トークンを保持するスレッドが実行し得る前に、すべてのスレッドが一時停止されるのを待つことによって、ファシリティは、実行における決定論的ポイントで、すべてのスレッドが操作の実行に起因する任意の状態の変化を観察することを確実にする。ステップ335で、操作がシステムコールであることをファシリティが決定した場合、ファシリティはステップ355に進み、そうでない場合、ファシリティはステップ340に進む。ステップ340で、操作が格納操作であることをファシリティが決定した場合、ファシリティはステップ345に進み、そうでない場合、ファシリティはステップ350に進む。ステップ345で、ファシリティは、操作によって影響を受けるメモリロケーションを、スレッドによってプライベートに保持されているものとみなすべきであることを示すために、共有メモリデータ構造を更新し、次いで、ファシリティはステップ355に進む。ステップ350で、ファシリティは、操作によってアクセスされたメモリロケーションを共有されたものとみなすべきであることを示すために、共有メモリデータ構造を更新し、次いでファシリティはステップ355に進む。ステップ355で、ファシリティによって、スレッドは操作を始めることができ、次いでファシリティは戻る。] 図3 [0024] いくつかの実施形態において、ファシリティは、トランザクショナルメモリシステムと共に動作して、マルチスレッドアプリケーションの実行をシリアル化または選択的にシリアル化する。例えば、ファシリティは、トランザクショナルメモリシステムを使用して、メモリ操作の決定論的順序を侵害することになるスレッド間通信を検出することができる。すなわち、共有メモリデータ構造の代わりに、またはそれに加えて、トランザクショナルメモリシステムが使用され得る。トランザクショナルメモリシステムは、ハードウェアトランザクショナルメモリ(HTM)システム、ソフトウェアトランザクショナルメモリ(STM)システム、またはハイブリッドハードウェア−ソフトウェアトランザクショナルメモリシステム(HS−TM)とすることができることに留意されたい。トランザクショナルメモリシステムと共に動作するとき、ファシリティは、スレッドによって実行される各量子をトランザクション内に封入する。各量子をトランザクション内に封入することによって、スレッドは、アトミック的に、かつ隔離されて実行するようにみえる。その結果、トランザクションは、並行して実行され、次いで、決定論的順序に従ってコミットされ得る。すなわち、TMシステムは、スレッドがトークンを保持するとき、トランザクションをコミットし、トランザクションがコミットされた後、トークンは、決定論的順序で次のスレッドに渡される。いくつかの実施形態において、ファシリティが複数のトークンをサポートし、それによって、各プロセス内のスレッド間に渡されるトークンをそれぞれ指定する複数の決定論的プロセスが同時に実行できるようになることに留意されたい。通常、トランザクションは、決定論的順序を侵害することになる(本明細書では「競合」と呼ばれる)スレッド間通信を含む場合、コミットされない。競合が存在するとき、トランザクションは、中止され、再開され得る。] [0025] いくつかの実施形態において、ファシリティは、量子ビルダコンポーネント(quantum builder component)、および決定論的マルチプロセッシング(「DMP」)コンポーネントを含む。例えば、図25A〜25Cは、いくつかの実施形態において決定論的マルチプロセッシングシステム2500の様々な機能的要素を示す高レベルブロック図である。図25Aは、量子ビルダコンポーネント2505およびDMPコンポーネント2510を含むDMPシステム2500aを示す。量子ビルダコンポーネント2505は、マルチスレッドアプリケーションの実行を量子(すなわち、決定論的な有限数の操作の組)に分割するために使用される。いくつかの実施形態において、量子ビルダ2505コンポーネントは、例えば通信無しのスレッド操作など、並行して実行され得る操作と、スレッド間通信、システムコールなど、決定論的な順序で実行されるべき操作(例えば、制御された操作)とを区別する。DMPコンポーネント2510は、決定論的順序に従って各量子が実行されることを確実にする。例えば、マルチスレッドアプリケーションの実行をシリアル化するために、DMPコンポーネント2510は、量子境界に到達したとき、決定論的順序でスレッド間に渡されるトークンを実装することができる。別の例として、マルチスレッドアプリケーションの実行を選択的にシリアル化するために、DMPコンポーネント2510は、トークンを保持することなく、スレッドが操作を実行することができるかどうかを決定するために使用される共有メモリデータ構造を実装することができる。図25Bは、共有メモリデータ構造2520を含むDMPシステム2500bを示す。さらに別の例として、共有メモリデータ構造2520の代わりに、またはそれに加えて、トランザクショナルメモリシステムが使用され得る。図25Cは、量子ビルダコンポーネント2505およびDMPコンポーネント2510と共に動作して、マルチスレッドアプリケーションの実行をシリアル化または選択的にシリアル化し得るトランザクショナルメモリシステム2525を含むDMPシステム2500cを示す。トランザクショナルメモリシステム2525は、ハードウェアトランザクショナルメモリ(HTM)システム、ソフトウェアトランザクショナルメモリ(STM)システム、またはハイブリッドハードウェア−ソフトウェアトランザクショナルメモリシステム(HS−TM)とすることができる。] 図25A 図25B 図25C [0026] いくつかの実施形態において、トークンがブロックされた(例えば、別のスレッドによって保持されたロックを待つ)スレッドに進められると、ファシリティは、トークンを次のスレッドに渡し、それによって、開発者がマルチスレッドコード内に含まれる同期プリミティブのブロックに起因するライブロックを回避する。例えば、トークンがスレッド2に渡されるときにスレッド2が進むために必要とするロックをスレッド1が保持する場合、トークンは、次のスレッド(例えば、スレッド3)に渡される。トークンが決定論的順序で渡されるため、また各スレッドが量子を実行する(またはトークンを渡す)ため、量子は、決定論的にインターリーブされ、それによってライブロックを防ぎ、コードが同じ入力で実行されるたびに同じ出力を生成する。] [0027] 量子ビルダコンポーネント2505およびDMPコンポーネント2510は、ハードウェア、ソフトウェア、またはハードウェアおよびソフトウェアの組み合わせにおいて実装され得る。例えば、量子ビルダコンポーネント2505は、命令が後退するにつれてそれらをカウントし、所定の量子サイズに到達したとき、量子境界を配置することによって実装され得る。実行をシリアル化するために、DMPコンポーネント2510は、決定論的順序で量子境界においてプロセッサ間に渡されるトークンとして実装され得る。別の例として、実行を選択的にシリアル化するために、量子ビルダコンポーネント2505は、アクセスがスレッド間通信を伴うかどうか(例えば、共有データへのアクセスなど)を決定するために、メモリアクセスを監視することができる。一実施形態において、DMPコンポーネント2510は、共有メモリデータ構造2520を実装するために、MESI(「変更、排他、共有、無効」)キャッシュコヒーレンスプロトコルによって維持されるキャッシュライン状態を使用する。排他または変更状態のキャッシュラインは、プロセッサによってプライベートに保持されるものとみなされ、トークンを保持しないそれ自体のスレッドによって自由に読み取られ、または書き込まれ得る。同様に、共有状態のキャッシュラインは、トークンを保持しないそれ自体のスレッドによって自由に読み取られ得る。すべてのスレッドがその実行における決定論的ポイントにあるとき(例えば、すべてのプロセッサがブロックされ、または量子境界に到達したとき)、およびプロセッサが決定論的トークンを取得したとき、プロセッサは、共有状態のキャッシュラインに書き込むことができる。こうした実施形態において、各プロセッサは、それがブロックされ、および/またはブロック解除されると、ブロードキャストする。任意のプロセッサによってキャッシュに入れられないラインに対応する共有メモリデータ構造2520におけるエントリの状態は、メモリに保持され、メモリコントローラによって管理することができ、こうしたエントリの状態は、キャッシュミスが処理されるときに転送され得ることに留意されたい。] [0028] いくつかの実施形態において、ファシリティは、コンパイラまたはバイナリ書き換えインフラストラクチャを使用して実装され得る。例えば、量子ビルダコンポーネント2505は、マルチスレッドアプリケーションコード内に同期コードを挿入し、コンパイラによって生成される制御フローグラフ(「CFG」)において操作を追跡することによって、コンパイラを使用して量子を構築することができる。量子は、サイズが決定論的である限り、均一サイズのものである必要はないことに留意されたい。こうした同期コードは、例えば、関数呼び出しの最初および最後、およびCFG後退エッジの最後に挿入することができる。挿入されたコードは、量子サイズを追跡し、ターゲットサイズに到達したとき、DMPコンポーネント2510にコールバックする。いくつかの実施形態において、ファシリティは、ソースコード、ソースコードの中間表現、または実行ファイルを増補する。いくつかの実施形態において、挿入されたコードは、1つまたは複数の決定論的マルチプロセッシング(「DMP」)関数および/またはデータ構造を含む。挿入されたDMP関数は、1つまたは複数のデータ構造(例えば、共有メモリデータ構造2520)を維持する、DMPコンポーネント2510によって提供され得るランタイムシステムにコールバックすることができる。増補されたコードがマルチプロセッシングシステムによって実行されると、挿入されたDMP関数およびデータ構造は、次いで、メモリおよびI/O操作、システムコールなど、操作が実行される順序を制御するために使用される。スレッドがこうした動作を実行する順序を制御することによって、ファシリティは、マルチスレッドアプリケーションが決定論的に挙動できるようにする。すなわち、同じ入力が与えられると、マルチスレッドアプリケーションのスレッドは、操作の一部またはすべてを決定論的にインターリーブし、それによって同じ出力を提供することができる。ファシリティは他のスレッド操作を制御するように拡張され得ることを、当業者であれば理解されたい。] [0029] いくつかの実施形態において、コードが増補された後、コンパイラは、例えば、DMPライブラリに対するすべての呼び出しをインライン化するなど、コードを再度最適化する。コンパイラは、本明細書では具体的に記載しないが、増補されたコードに対して他の最適化を実行することができることを、当業者であれば理解されたい。] [0030] いくつかの実施形態において、命令をカウントし、所定の数の操作に到達したとき、量子境界を確立することによって、マルチスレッドアプリケーションは、量子に分割される。いくつかの実施形態において、スレッドは通常同じレートで進まないという事実を考慮に入れ、それによってマルチスレッドアプリケーションの実行のクリティカルパスにおけるスレッドの進行を向上させるために、適応量子構築技術が使用される。すなわち、各スレッドは、異なる、しかし決定論的な量子境界を有し得る。図16は、1つまたは複数の実施形態における、ファシリティによって実行される適応量子プロセス1600を示すフロー図である。いくつかの実施形態において、トークンを保持するスレッドが予め定義された有限数のメモリ操作を有する量子を実行する間、プロセス1600がファシリティによって実行される。ステップ1605〜1635で、ファシリティは、量子の各メモリ操作をループして、量子境界を適応させるかどうかを決定し、それによってマルチスレッドアプリケーションの実行のクリティカルパスの性能を向上させる。ステップ1605で、ファシリティは、量子のメモリ操作を選択する。] 図16 [0031] ステップ1610で、ファシリティは、マルチスレッドアプリケーションのクリティカルパスに関連するアプリケーションレベルの同期情報を評価する。いくつかの実施形態において、ファシリティは、別のスレッドがクリティカルパススレッドでありそうかどうかを決定するために、アプリケーションレベルの同期情報を評価する。例えば、こうした情報は、選択されたメモリ操作によって、トークンを保持するスレッドがアプリケーションレベルのロックの解除をもたらすかどうかの指示を含み得る。基本原理は、トークンを保持するスレッドがアプリケーションレベルのロックを解除するとき、他のスレッドは、そのロックを待ちながらスピンしている場合があるということである。別の例として、こうした情報は、別のスレッドがアプリケーションレベルのロック時にスピンを開始したかどうかの指示を含み得る。ファシリティは、待機中のスレッドが前進できるように、できるだけ早くトークンを前方に進めるべきであるかどうかを決定するために、アプリケーションレベル同期情報を評価する。いくつかの実施形態において、スレッドがアプリケーションレベルのロックを解除したとき、またはアプリケーションレベルのロック時にスピンを開始したときに、ファシリティに通知するためのDMPコンポーネントへのコールバックを挿入するために、コンパイラまたはバイナリ書き換えツールが使用される。いくつかの実施形態において、ハードウェアは、アプリケーションレベル同期情報の変化を監視するために使用される。例えば、通常、ロックを実施するために、特殊命令(例えば、ロックプレフィックス命令、ロードリンク/格納条件、test/test&set命令など)が使用される。別の例として、ハードウェアは、ロックが解放されている/取得されているときを示すためにソフトウェアが使用する特殊命令を提供することができる。] [0032] ステップ1615で、ファシリティは、共有メモリ情報を評価する。いくつかの実施形態において、ファシリティは、トークンを次のスレッドに進めることができるように、トークンを保持するスレッドが共有データにおける作業を潜在的に終了したかどうかを決定するために、共有メモリ情報を評価する。例えば、こうした情報は、トークンを保持するスレッドが共有メモリにメモリ操作を発行していない予め定められた閾値が経過した(例えば、期間、命令数など)かどうかの指示を含み得る。基本原理は、トークンを保持するスレッドが共有データ上で作業しているとき、他のスレッドがそのデータにすぐにアクセスすることが予測されることである。量子を早く終了させ、トークンを渡すことによって、量子を終了させた場合より早く別のスレッドがデータを消費する可能性がある。いくつかの実施形態において、予め定められた閾値は、例えば30のメモリ操作など、有限数の動作として測定される。いくつかの実施形態において、ファシリティは、共有メモリデータ構造を使用して、トークンを保持するスレッドによって共有メモリになされるアクセス数を追跡し、次いでその数を1つまたは複数の予め定義された閾値と比較する。いくつかの実施形態において、ファシリティは、予め定義された閾値が経過すると、ファシリティに通知する共有メモリモニタを実装する。] [0033] ステップ1620で、ステップ1610〜1615で評価された情報に基づいて別のスレッドがクリティカルパススレッドでありそうだとファシリティが決定した場合、ファシリティはステップ1625に進み、そうでない場合、ファシリティはステップ1635に進む。ステップ1635で、量子内の追加のメモリ操作が残っている場合、ファシリティは折り返してステップ1605に戻り、そうでない場合、プロセス1600は終了する。] [0034] ステップ1625で、ファシリティは、元の量子境界に到達することなく量子を終了させる。いくつかの状況下で、量子境界を終了させるためのファシリティの決定は、量子の最後の操作(すなわち、元の量子境界)と実質的に同時に起こり得ることに留意されたい。すなわち、ステップ1620で、別のスレッドがクリティカルスレッドでありそうで、量子内にメモリ操作が残っていないことをファシリティが決定した場合、ファシリティは、実際に、ステップ1625で、元の量子境界で量子を終了させることができる。] [0035] ステップ1630で、ファシリティは、決定論的順序に従ってトークンを次のスレッドに進め、次いでプロセス1600が終了する。いくつかの実施形態において、量子を終了させる前に、ファシリティは、トークンを保持するスレッドに、スレッド間通信が行われる新しい量子境界の端部でメモリフェンスを実行させるバリア命令を発行する。メモリフェンスは、バリア命令の前後に発行されるメモリ操作における順序制約をプロセッサに実施させる命令である。バリア命令を発行することによって、ファシリティは、トークンが次のスレッドに進められる前にトークンを保持するスレッドによって実行されるすべてのメモリ操作が終了することを保証する。その結果、メモリに対してトークンを保持するスレッドによってもたらされるメモリに対する変更は、マルチスレッドアプリケーションのスレッドのすべてに対して可視になる。特定のスレッドがアプリケーションレベルのロック時にスピンを開始するという情報の結果、ファシリティが量子を終了させる場合でさえ、ファシリティは、決定論的順序で次のスレッドに対応しない限り、トークンをそのスレッドに進めないことに留意されたい。] [0036] 量子を終了させるかどうかを決定するためにファシリティによって評価された情報は、トークンを保持するスレッド、選択されたメモリ操作、DMPおよび/またはアプリケーションレベル同期情報、共有メモリ情報などに関連する他のタイプの情報を含み得ることを、当業者であれば理解されたい。例えば、いくつかの実施形態において、選択されたメモリ操作が共有メモリを介したスレッド間通信を含まないシステムコールであるとき、ファシリティは、量子を終了させ、システムコール前にトークンを次のスレッドに進める。基本原理は、システムコールは、通常、終了に長い時間がかかり、トークンを必要としない場合があることである。その結果、量子を終了させ、システムコールが呼び出される前にトークンを次のスレッドに進めることによって、ファシリティは、量子を終了させた場合より早く進める機会を別のスレッドに提供する。] [0037] いくつかの実施形態において、ファシリティは、単一スレッドに対して証明可能にローカルなロケーション、および/または単一の量子内でエイリアスでなければならないメモリロケーションにアクセスするメモリ操作を識別することによって、並行性を回復し、共有メモリデータ構造へのアクセスに伴うオーバーヘッドを低減する。図17は、1つまたは複数の実施形態において共有メモリデータ構造へのアクセスに伴うオーバーヘッドを低減するためにファシリティによって実行されるプロセス1700のフロー図である。ステップ1705で、ファシリティは、マルチスレッドアプリケーションのコードを取得し、次いでステップ1710に進む。例えば、これは、マルチスレッドアプリケーションコードのバイナリ形式をソースファイルから読み取ることを含み得る。別の例として、これは、マルチスレッドアプリケーションのバイナリ形式を、制御フローグラフなど、中間形式に変換するコンパイラまたはバイナリ書き換えツールを含み得る。制御フローグラフは、グラフのノードとして動作を指定するプログラム実行の表現である。] 図17 [0038] ステップ1710で、ファシリティは、マルチスレッドアプリケーションの単一スレッドに対してローカル(すなわち、コード生成中「証明可能にローカル」)となることが保証されるマルチスレッドアプリケーションのメモリ操作を識別し、次いでファシリティは、ステップ1715に進む。いくつかの実施形態において、ファシリティは、エスケープ分析を使用して、証明可能なローカルデータにアクセスするメモリ操作を識別する。データがある関数で割り当てられ、その関数がポインタをそのデータに戻すと、データは、実行の他のスレッドまたは呼び出し側関数に「逃れる」と言われる。また、データがグローバル変数、または他のデータ構造に格納されており、これらが現在の関数またはスレッドの実行を逃れるものである場合、データも逃れる可能性がある。] [0039] ステップ1715〜1740で、ファシリティは、マルチスレッドアプリケーションコードの各量子をループする。ステップ1715で、ファシリティは、量子を選択し、次いでステップ1720に進む。ステップ1720で、ファシリティは、選択された量子点内の2つ以上のメモリ操作が同じメモリロケーションを指す(すなわちメモリ操作同士が「エイリアスでなければならない」)と決定した場合、ステップ1725に進み、そうでない場合、ステップ1740に進む。例えば、基礎のアドレスおよびオフセットが同じである場合、メモリ操作は、エイリアスでなければならない。ステップ1725〜1735で、ファシリティは、選択された量子内でエイリアスでなければならないメモリ操作の各グループをループする。ステップ1725で、ファシリティは、選択された量子内でエイリアスでなければならないメモリ操作のグループを選択し、次いでステップ1730に進む。ステップ1730で、ファシリティは、第1のメモリ操作とエイリアスでなければならない選択された量子内の第1のメモリ以降の各メモリ操作を識別し、次いでファシリティは、ステップ1735に進む。ステップ1735で、追加のグループが残っている場合、ファシリティは折り返してステップ1725に戻り、そうでない場合、ファシリティはステップ1740に進む。ステップ1740で、追加の量子が残っている場合、ファシリティは折り返してステップ1715に戻り、そうでない場合、ファシリティはステップ1745に進む。ステップ1745で、ファシリティは、ステップ1710(すなわち、証明可能にローカルなデータにアクセスするメモリ操作)および/または1730(すなわち、同じ量子内のより前のメモリ操作に対してエイリアスでなければならない量子内のメモリ操作)で識別されたメモリ操作以外のメモリ操作を追跡するためにコードを挿入し、次いでプロセス1700が終了する。量子当たりのデータ項目当たり共有メモリデータ構造に一度アクセスすることによって、およびその証明可能にローカルなデータにアクセスするために、スレッドがトークンを保持することを必要としないことによって、ファシリティは、並行性を回復し、共有メモリデータ構造のチェックに伴うオーバーヘッドを低減する。] [0040] いくつかの実施形態において、ファシリティは、単一のスレッドに対してローカルであるメモリ操作を識別するために実行するとき、マルチスレッドアプリケーションをプロファイルするためのバイナリ書き換えツールを含む。例えば、バイナリ書き換えツールは、共有メモリデータ構造の状態を監視するために実行可能なアプリケーションを取り付けることによってマルチスレッドアプリケーションをプロファイルすることができる。マルチスレッドアプリケーションの実行中に単一のスレッドによってアクセスされるメモリロケーションは、ローカルとして識別され得る。複数の実行にわたってプロファイリング情報が安定しているとき、スレッドがトークンを保持する必要なく、識別されたメモリ操作が実行され得る。しかし、プロファイリングパスがマルチスレッドアプリケーションの特定の実行を反映するため、この技術は完全な決定論を提供しない場合があることに留意されたい。] [0041] いくつかの実施形態において、ファシリティは、本明細書では「スレッドデータ構造」と呼ばれるDMPデータ構造を含み、その詳細は、図6を参照して以下で説明する。しかし、任意の数のDMPデータ構造が含まれていてよいことに留意されたい。スレッドデータ構造が複数のDMPデータ構造を表し得ることにさらに留意されたい。いくつかの実施形態において、スレッドデータ構造は、実行中にマルチスレッドアプリケーションによって作成される各スレッドに対応するスレッド識別子(「ID」)を格納する。例えば、スレッドデータ構造は、配列、リンクリスト、キュー、またはスレッドIDの他のデータ構造(本明細書では「スレッドコンテナ」と呼ばれる)を含み得る。] 図6 [0042] いくつかの実施形態において、スレッドデータ構造は、量子の実行の順序を制御するために使用され得るトークンを含む。例えば、いくつかの実施形態において、量子を実行する前に、スレッドは、トークンの現在の値がスレッドのIDに一致するかどうかを決定する。スレッドのIDがトークンの現在の値に一致するとき、スレッドは、量子を実行することができる。そうでない場合、スレッドは、トークンの現在の値がその識別子に一致するまで、量子を実行するのを待つ。] [0043] いくつかの実施形態において、スレッドが作成される順序は、スレッドが決定論的に実行される順序に対応する。例えば、各スレッドが作成されるとき、スレッドの対応するスレッドIDは、スレッドコンテナ内に順次格納され得る(例えば、最初に作成されたスレッドのスレッドIDは1、2番目に作成されたスレッドのスレッドIDは2など)。操作が実行されるとき、スレッドは、(第1のスレッドIDから開始して)スレッドIDが格納される順序に基づいてスレッドコンテナに格納されるスレッドIDを順次ループすることによって、トークンの値を進めるよう動作するいくつかのDMP関数を呼び出すことができる。スレッドが存在するとき、通常、スレッドの対応するIDがスレッドコンテナから削除されることに留意されたい。] [0044] いくつかの実施形態において、スレッドデータ構造は、トークンが進められる前にスレッドIDがトークンの現在の値に一致するスレッドによって実行され得る決定論的な有限数の(すなわち量子)制御された操作またはブロックに対応する値を格納する。制御された操作またはブロックのこの数は、本明細書では「コミットブロックサイズ」と呼ばれる。コミットブロックサイズは、1つからN個までの制御された操作またはブロックに及び得る。大きいコミットブロックサイズおよび小さいコミットブロックサイズには性能のトレードオフが関連することを、当業者であれば理解されたい。例えば、コミットブロックサイズが小さすぎるとき、スレッド間でのコンテキストの切り替えに伴うオーバーヘッドの結果として、マルチスレッドアプリケーションの性能が悪化する。別の例として、コミットブロックサイズが大きすぎるとき、多くのまたはすべてのスレッドは、スレッドIDがトークンに一致するスレッド(およびスレッドIDがそのスレッドIDに先行するすべてのスレッド)がコミットブロックサイズによって指定された数の制御された操作を終了する、または実際に実行するのを待つのを余儀なくされ得るため、マルチスレッドアプリケーションの性能が悪化する。少なくとも1つの実施形態において、コミットブロックサイズは、1,000に等しい。] [0045] いくつかの実施形態において、コミットブロックサイズは、構成可能である。例えば、コミットブロックサイズは、マルチスレッドアプリケーションの様々なスレッドインターリービングをプログラム的に操作し、テストするように、ソフトウェア開発者によって構成され得る。別の例として、コミットブロックサイズは、マルチスレッドアプリケーションによって作成され得る最大数のスレッド、および/またはマルチスレッドアプリケーションが実行するマルチプロセッシングシステムのプロセッサまたはコアの数に基づいて、自動的に構成され得る。スレッドによって実行される制御された操作の数をカウントするために様々な技術が使用され得ることを、当業者であれば理解されたい。例えば、いくつかの実施形態において、スレッドデータ構造は、スレッドIDが現在のトークンIDに一致するスレッドによって実行された制御された操作の数に対応する値を含む。スレッドが制御された操作を実行するたびに、制御された操作の数は、増分され、コミットブロックサイズと比較される。制御された操作の数がコミットブロックサイズに等しい場合、トークンは、次のスレッドIDに進められ、制御された操作の数は、ゼロにリセットされる。] [0046] マルチスレッドアプリケーションを増補して、いくつかのスレッドの操作(例えば、制御されたスレッド操作)の順序を制御することによって、開発プロセスは、かなり簡略化される。例えば、ファシリティは、マルチスレッドアプリケーションのスレッドインターリービングを直接操作し、それによってマルチスレッドアプリケーションの実質的により良いテストカバレージを可能にできるようにするために、ソフトウェア開発者によって使用され得る。開発者は、例えばコミットブロックサイズを変更することによって、制御されたスレッド操作のインターリービングを操作することができる。別の例として、開発者は、スレッドが実行する決定論的順序を変更することによって、制御されたスレッド操作のインターリービングを操作することができる。いくつかの実施形態において、ファシリティによって、ソフトウェア開発者は、挿入されたコードが量子構築物に影響を与えないように、増補のために挿入されたとコードをマーク付けすることができる。] [0047] いくつかの実施形態において、ファシリティは、ソフトウェア開発者がテストのためにそのアプリケーションをサブミットすることができるバグファインダウェブサービスを提供する。図23は、いくつかの実施形態における、バグファインダウェブサービス2300を示す高レベルデータフロー図である。示された実施形態において、バグファインダウェブサービス2300は、インターネットまたはローカルエリアネットワークなどのネットワーク2310を介してコンピュータ2305を使用してソフトウェア開発者からの要求を受信する。いくつかの実施形態において、要求は、テストされるマルチスレッドアプリケーション2315のコピーを含む。例えば、要求は、マルチスレッドアプリケーションバイナリを含み得る。別の例として、要求は、マルチスレッドアプリケーションのソースコードを含み得る。いくつかの実施形態において、要求は、マルチスレッドアプリケーション2315のコピーが取り出され得るロケーションの指示を含む。いくつかの実施形態において、要求は、アプリケーションがテストされるテストスイート2320を含む。] 図23 [0048] いくつかの実施形態において、マルチスレッドアプリケーション2315をテストする旨の要求の受信に応答して、バグファインダウェブサービス2300は、マルチプロセッシングシステム2325に要求をディスパッチする。マルチプロセッシングシステム2325は、テスト中のマルチスレッドアプリケーション(MUT)2335の実行を決定論的に制御するため、およびMUT2335の様々なスレッドインターリービングをプログラム的にテストするために使用されるDMPシステム500など、決定論的マルチプロセッシング(DMP)システム2320を含む。いくつかの実施形態において、マルチプロセッシングシステム2325は、MUT2335をテストするために使用されるテストスイート2340を含む。例えば、テストスイート2340は、1つまたは複数の入力および予想される対応する出力を含み得る。別の例として、テストスイート2340は、MUT2325とのユーザ対話をシミュレートする1つまたは複数の自動スクリプトを含み得る。いくつかの実施形態において、MUT2335は、マルチプロセッシングシステム2325において直接実行される。いくつかの実施形態において、MUT2335は、マルチプロセッシングシステムにおいて実行する仮想マシン内で実行される。] [0049] いくつかの実施形態において、マルチプロセッシングシステム2325は、バグロギングコンポーネント2345を含む。バグロギングコンポーネント2345は、いつMUT2335が指定された入力について誤った出力を生成するか、および/またはMUT2335がクラッシュするかを観察することができる。MUT2335が誤った出力を生成する、またはクラッシュするとき、バグロギングコンポーネント2345は、誤った出力またはクラッシュを生成したバグのソースを決定する(例えば、特定の決定論的スレッド順序の1つまたは複数の共有メモリアクセス)。次いでバグロギングコンポーネント2345は、バグログにおけるバグの決定されたソースを格納する。いくつかの実施形態において、バグログは、データストア2350に格納される。データストア2350は、MUT2335のコピーまたはMUT2335のコピーが配置され得るロケーションの指示を含み得る(例えば、MUT2335がテストされたマルチプロセッシングシステム2325)。データストア2350は、テストスイート2340またはテストスイート2340が配置され得るロケーションの指示を含み得る。データストア2350は、MUT2335のソフトウェア開発者またはベンダーに関連付けられたアカウント情報など、他の情報を含み得る。] [0050] いくつかの実施形態において、バグファインダウェブサービス2300は、無料サービスとして提供される。すなわち、バグファインダウェブサービス2300は、ソフトウェア開発者に負担をかけることなく、マルチスレッドアプリケーション2315をテストする。いくつかの実施形態において、バグファインダウェブサービス2300は、時給ベースの加入に基づいて、またはテストサイクル当たりの請求と引き換えに、マルチスレッドアプリケーション2315をテストする。] [0051] いくつかの実施形態において、バグファインダウェブサービス2300は、以下のビジネスモデルに従って動作する。それは、テスト結果を示すソフトウェア開発者にメッセージを送信する。MUT2335においてバグが識別されないとき、バグファインダウェブサービス2300は、バグがMUT2335で識別されなかったことを示すメッセージをソフトウェア開発者に送信する。バグが識別されると、バグファインダウェブサービス2300は、バグが識別されたことを示すメッセージをソフトウェア開発者に送信する。いくつかの実施形態において、メッセージは、有料でソフトウェア開発者にバグの識別を販売するという申し出を含む。例えば、料金は、識別されたバグの数に基づく、均一料金とする、などでもよい。ソフトウェア開発者が申し出を受け入れた場合、バグファインダウェブサービスは、ソフトウェア開発者に識別されたバグのそれぞれを明らかにする。例えば、識別されたバグ結果は、ウェブページにおいてソフトウェア開発者に表示され得る。別の例として、識別されたバグ結果は、メッセージでソフトウェア開発者に送信され得る。いくつかの実施形態において、識別されたバグごとに、結果は、入力の指示、誤った出力またはMUT2335がクラッシュしたことの指示、識別されたバグを生成した1つまたは複数の共有メモリアクセス、識別されたバグを生成したスレッド順序、量子サイズなどを含む。いくつかの実施形態において、メッセージは、ソフトウェア開発者のコンピュータ2305において識別されたバグを再生するための機構を含む。例えば、メッセージは、スレッドが実行する順序、およびバグを識別するために使用されるパラメータ(例えば、量子サイズおよび/またはスレッド順序)を制御するために取り付けられるバイナリアプリケーションを含み得る。いくつかの実施形態において、メッセージは、マルチスレッドアプリケーション2315を配置した顧客によって報告されたバグが回避され得るように、識別されたバグの1つまたは複数を中央バグライブラリに報告するためのオプションを含む。バグの回避については、本明細書において、図18〜20との関連でさらに説明される。] 図18 図19 図20 [0052] 様々な実施形態は、上述した環境に関して説明されるが、バグファインダウェブサービス2300は、単一のモノリシックコンピュータシステム、および様々な方法で接続されたコンピュータシステムまたは類似の装置の他の様々な組み合わせを含めて、様々な他の環境に実装され得ることを当業者であれば理解されたい。] [0053] 図24は、いくつかの実施形態における、ファシリティによって実行されるバグファインダプロセス2400のフロー図である。示されたバグファインダプロセス2400は、バグが識別されない限り、ソフトウェア開発者にとって無料であり、ソフトウェア開発者は、識別されたバグを明らかにさせるために料金を支払うことを選択する。ステップ2405において、ファシリティは、マルチスレッドアプリケーションなど、アプリケーションをテストする旨のバグファインダ要求を受信する。例えば、要求は、インターネットなど、ネットワークを介してソフトウェア開発者から受信され得る。要求は、マルチスレッドアプリケーションバイナリおよび/またはマルチスレッドアプリケーションがテストされるテストスイートを含み得る。ステップ2410で、ファシリティは、マルチスレッドアプリケーションの様々なスレッドインターリービングをプログラム的にテストする。例えば、ファシリティは、テストスイートに含まれる入力および/またはスクリプトを使用してマルチスレッドアプリケーションをテストすることができる。マルチスレッドアプリケーションの実行パスごとに、ファシリティは、量子サイズおよび/またはスレッド実行順序を変更して、マルチスレッドアプリケーションの複数のスレッドインターリービングをプログラム的にテストすることができる。ステップ2415で、任意のバグが識別された場合、ファシリティはステップ2425に進み、そうでない場合、ファシリティはステップ2420に進む。ステップ2420で、ファシリティは、バグが識別されなかったことを示すメッセージを送信し、次いでプロセス2400は終了する。ステップ2425で、ファシリティは、無料でソフトウェア開発者に識別されたバグを明らかにすることを申し出るメッセージを送信する。ステップ2430で、申し出が受け入れられた場合、ファシリティはステップ2435に進み、そうでない場合、ファシリティは折り返してステップ2430に戻る。いくつかの実施形態において、ファシリティは、ソフトウェア開発者によって後で取り出すために、識別されたバグを格納する。例えば、ソフトウェア開発者がアカウントを有する場合、ファシリティは、指定された期間の間結果を格納することができる。ステップ2435で、ファシリティは、ソフトウェア開発者に識別されたバグのそれぞれを明らかにする。次いでプロセス2400が終了する。様々な実施形態において、ファシリティは、ステップ2410に関連して示され、説明されたテストに加えて、またはその代わりに、他の様々な種類のテストを実行する。] 図24 [0054] いくつかの実施形態において、マルチスレッドアプリケーションは、その増補された形で配置される。マルチスレッドアプリケーションを増補された形で配置することによって、アプリケーションの信頼性は、実質的に向上する。というのは、例えば、「現場での」(すなわち顧客による)マルチスレッドアプリケーションの実行は、社内でのアプリケーションのテストに、より似たものになるからである。さらに、マルチスレッドアプリケーションがクラッシュする、または同期バグを経験するとしたら、ソフトウェア開発者は、顧客から意味のあるクラッシュ情報を集めることによって欠陥を迅速に解決することができる。すなわち、増補された形で配置されると、クラッシュに先行する顧客によって実行されるアクションは、ソフトウェア開発者がクラッシュを容易に再生することができるようになるため、意味がある。その結果、ソフトウェア開発者は、クラッシュまたは同期バグがスレッドの未知のインターリービングに関連付けられた場合より実質的に早く欠陥を解決することができる。したがって、ファシリティは、マルチスレッドアプリケーションの開発および配置の両方を向上させる。] [0055] いくつかの実施形態において、ファシリティは、仮想マシンモニタ(VMM)を含むマルチプロセッシングシステムに実装される。VMMは、マルチプロセッシングシステムなど、物理的なコンピューティングシステムのリソースを仮想化して、オペレーティングシステムおよび/または任意の数のアプリケーションが実行される仮想マシンを提供するソフトウェアレイヤである。本明細書で使用されるとき、仮想マシン(VM)は、VMMを介して実装されるマルチプロセッシングシステムの論理的な例である。図18は、1つまたは複数の実施形態における、仮想マシン内のマルチスレッドアプリケーションのスレッドの実行を決定論的に制御するために決定論的マルチプロセッシング(DMP)システムと共に実行するVMMを示す高レベルブロック図である。説明を曖昧にするのを回避するために、いくつかのよく知られている構造および機能は、詳細に示されても述べられてもいない。いくつかの実施形態において、仮想マシンモニタ(VMM)1800は、図4との関連で説明されるコンピューティングシステム400など、マルチプロセッシングシステムに実装される。VMM1800は、仮想マシン(VM)1805に、それぞれVMM1800が実行する物理リソースの仮想インスタンスを表す仮想プロセッサ1810a〜1810n、仮想メモリ1815、仮想ドライバ1820などを含む仮想化された1組のリソースへのアクセスを提供する。VM1805は、マルチスレッドアプリケーション1825など、1つまたは複数のアプリケーションも含み得る。VMM1800は任意の数の仮想マシンを含み得ることに留意されたい。いくつかの実施形態において、VMM1800は、「ホスト型」VMMであり、これは、マルチプロセッシングシステムにおける他のアプリケーションと同様に扱われ、他のアプリケーションとシステムリソースの使用を共有することを意味する。一方、他の実施形態では、VMM1800は、「非ホスト型」VMMであり、これは、VMMは、オペレーティングシステムのサポートなく、システムリソースに直接アクセスすることを意味する。] 図18 図4 [0056] いくつかの実施形態おいて、VMM1800は、マルチスレッドアプリケーション1825を決定論的順序で実行される量子に分割する決定論的マルチプロセッシング(DMP)システム1830を含む。マルチスレッドアプリケーション1825のスレッドによって量子が実行される順序を制御することによって、DMPシステム1830は、マルチスレッドアプリケーションが決定論的に挙動できるようにする。いくつかの実施形態において、DMPシステム1830は、オペレーティングシステム(図示せず)が決定論的に挙動できるようにする。しかし、DMPシステム1830はVMM1800によって実装される必要がないことに留意されたい。例えば、いくつかの実施形態において、DMPシステム1830は、VMM1800の外部に、またはマルチスレッドアプリケーション1825が入力として提供される個別のコンピューティングシステムによって実装される。] [0057] いくつかの実施形態において、VMM1800は、アプリケーションのクラッシュを観察し、バギーシーケンス(buggy sequence)(例えば、最終的にアプリケーションにクラッシュさせるメモリアクセスに先行する特定の決定論的スレッド順序のための1つまたは複数の共有メモリアクセス)を決定し、決定されたバギーシーケンスをバグライブラリ1840に格納するバグ報告コンポーネント1845を含む。] [0058] いくつかの実施形態において、VMM1800は、スレッド間通信を監視して、既知のバギーシーケンスを検出し、回避するスレッド通信モニタ1835を含む。スレッド通信モニタ1835は、スレッドが共有メモリにアクセスする順序を観察し、その順序を、バギーであることがわかっている(すなわち、最終的にアプリケーションにクラッシュさせる)シーケンスと一致させることによって、バギーシーケンスを検出することができる。「バギーシーケンス」は、最終的にアプリケーションにクラッシュさせるインターリービングに先行する1つまたは複数のインターリービングパターン(例えば、特定の決定論的順序のための共有メモリアクセス)を含み得る。スレッド通信モニタ1835は、バギーシーケンスが検出されるとき、有効なインターリービングを選択することによってアプリケーションにクラッシュさせる既知のバギーシーケンスを回避することができる。これは、例えば、量子サイズまたはスレッドが実行される決定論的順序への変更をトリガすることによって達成され得る。] [0059] 図19は、1つまたは複数の実施形態における、ファシリティによって実行される監視プロセス1900のフロー図である。例えば、監視プロセス1900は、マルチスレッドアプリケーションがマルチプロセッシングシステム上において、仮想マシン内で実行する間に実行され得る。いくつかの実施形態において、監視プロセス1900は、スレッド通信モニタ1835によって実行される。マルチスレッドアプリケーションが実行する間に、ファシリティは、ステップ1905〜1915をループする。ステップ1905で、ファシリティは、共有メモリへのスレッドのアクセスを観察する。例えば、ファシリティは、1つまたは複数の指定されたメモリロケーションへのアクセスを観察し、アクセスパターンがバギーであることがわかっているインターリービングシーケンスのパターンに対応するかどうかを決定することができる。別の例として、ファシリティは、N個のアクセスを観察することができ、ここでは、Nは、量子当たりの平均メモリアクセス数×量子数に等しい。N個の観察されたアクセス数はアプリケーション間で変わり得ることに留意されたい。したがって、特定の数への言及は、制限とみなされるべきではない。非常に多くの、または非常に少ない観察されたアクセス数を確立することには性能のトレードオフが関連することを、当業者であれば理解されたい。例えば、観察されたアクセス数が少なすぎるとき、ファシリティは、シーケンス内のインターリービングを、それがそうでなくてもバギーとして検出する場合がある。別の例として、観察されたアクセス数が多すぎるとき、ファシリティは、アプリケーションがクラッシュする前に、バギーシーケンスを検出できない場合がある。] 図19 [0060] ステップ1910で、観察されたアクセスがバギーシーケンスに一致することをファシリティが決定した場合、ファシリティはステップ1915に進み、そうでない場合、ファシリティは折り返してステップ1905に戻る。ステップ1915で、次の量子境界で、ファシリティは、スレッドインターリービングを変更し、次いで、折り返してステップ1905に戻る。例えば、ファシリティは、スレッドが実行される決定論的順序を変更することができる。別の例として、ファシリティは、量子サイズを変更することができる。いくつかの実施形態において、ファシリティは、観察されたアクセスがバギーシーケンスに一致したことを決定したとき、スレッドインターリービングを変更する。すなわち、いくつかの実施形態において、ファシリティは、次の量子境界に到達するのを待たない。マルチスレッドアプリケーションが、1800など、並行処理のバグの動的な回避を提供するVMベースのマルチプロセッシングシステム内に配置されると、マルチスレッドアプリケーションの信頼性は、実質的に向上する。というのは、ユーザは、アプリケーションのベンダーが並行処理のバグを修正するのにかかる時間の間、保護されるからである。] [0061] いくつかの実施形態において、バグ報告コンポーネント1845は、アプリケーションがクラッシュすると、バグライブラリ1840を更新する。いくつかの実施形態において、バグ報告コンポーネント1845は、バグアグリゲータサービスからバグ更新を受信し、または取り出すことによって、バグライブラリ1840を更新する。] [0062] 図20は、1つまたは複数の実施形態における、バグアグリゲータサービス2000を示す高レベルデータフロー図である。いくつかの実施形態において、バグアグリゲータサービス2000は、1つまたは複数のアプリケーションに関連付けられたバグを集める。バグアグリゲータサービス2000は、マルチスレッドアプリケーションおよび/または単一スレッドアプリケーションに関連付けられたバグを集めることができることに留意されたい。したがって、マルチスレッドアプリケーションへの言及は、制限とみなされるべきではない。] 図20 [0063] 図20において、バグアグリゲータサービス2000は、インターネットまたはローカルエリアネットワークなどのネットワーク2015を介して、いくつかのマルチプロセッシングシステム2010a・・・2010zに、マルチスレッドアプリケーション2005に関連付けられたバギーシーケンスを送信し、そこからバギーシーケンスを受信する。示された実施形態において、各マルチプロセッシングシステム2010は、マルチスレッドアプリケーション2005が決定論的に挙動し、スレッド通信モニタ2025がバギーシーケンスを検出し、回避することができるようにするためのDMPシステム2020を含む。スレッド通信モニタ2025によってアクセスされるバギーシーケンスは、マルチプロセッシングシステム2010にあるバグライブラリ2030内にローカルに格納され、および/またはバグアグリゲータサービス2000によって維持される中央バグライブラリ2035内にリモートに格納され得る。示された実施形態において、各マルチプロセッシングシステム2010は、マルチスレッドアプリケーション2005がいつクラッシュするかを観察し、クラッシュを生成するバギーシーケンス(例えば、最終的にマルチスレッドアプリケーション2005にクラッシュさせた共有メモリアクセスに先行する特定の決定論的スレッド順序のための1つまたは複数の共有メモリアクセス)を決定し、決定されたバギーシーケンスを格納するためのバグ報告コンポーネント2040をさらに含む。バグ報告コンポーネント2040は、それが動作するマルチプロセッシングシステム2010のバグライブラリ2030、別のマルチプロセッシング装置のバグライブラリ2030、および/または中央バグライブラリ2035への更新を格納することができる。中央バグライブラリ2035への更新は、バグアグリゲータサービス2000に送信され、および/またはネットワーク2015を介して中央バグライブラリ2035に直接送信され得る。マルチプロセッシングシステム2010の中央バグライブラリ2035またはバグライブラリ2030への更新は、単発で、定期的に、低アクティビティの期間中などに行われ得る。いくつかの実施形態において、マルチプロセッシングデバイス2010のバグライブラリ2030への更新は、マルチプロセッシングシステム2010によって実行されるマルチスレッドアプリケーション2005に関連付けられたバグに限定される。一方、他の実施形態では、更新が送信され、および/または受信されるマルチスレッドアプリケーション2005を選択するためにユーザインターフェイスが設けられる。] 図20 [0064] 様々な実施形態は、上述した環境に関して記載されるが、バグ情報の集まりおよび/または分配は、単一のモノリシックコンピュータシステム、および様々な方法で接続されたコンピュータシステムまたは類似の装置の他の様々な組み合わせを含めて、様々な他の環境に実装され得ることを当業者であれば理解されたい。例えば、様々な実施形態において、マルチプロセッシングシステム2010は、バグ情報を集め、および/または共有するために、DMPシステム、スレッド通信モニタ、およびバグ報告コンポーネントと共に仮想マシンモニタ(図示せず)を実装する。] [0065] いくつかの実施形態において、マルチスレッドアプリケーションが開発される、および/またはマルチスレッドアプリケーションが配置されるコンピューティングシステムは、共有メモリへのアクセスを制御するためのトランザクショナルメモリ(「TM」)システムを含む。トランザクショナルメモリシステムは、ハードウェアトランザクショナルメモリ(「HTM」)、ソフトウェアトランザクショナルメモリ(「STM」)システム、またはハイブリッドハードウェア−ソフトウェア(HS−TM)システムとすることができる。両方のTMシステムは、当分野で知られている。STMシステムは、プログラミングアブストラクション(programming abstraction)を提供し、それを介して、スレッドは、共有リソースをロックすることなく、または共有リソースが解放されるのを待つことなく、その一部に1つまたは複数の共有リソース(例えばメモリ)が関与し得る操作のシーケンスをアトミック的に実行する。] [0066] 従来のTMシステムは、他のスレッドが何をしているかに関係なく、スレッドが共有メモリへの変更を終了するという点で「楽観的」である。これは、例えば、マルチスレッドアプリケーションのスレッドごとにログを維持することによって達成され、トランザクションごとに、各スレッドは、その対応するログにその操作を順次記録する。例えば、ログは、メモリロケーションの数およびタイプ、並びにトランザクション中にスレッドが読み取り、および/または書き込む値を含み得る。トランザクションの最後に、他のスレッドが同じ共有メモリロケーションに並行してアクセスしなかった場合、スレッドは、実際に、操作のシーケンスを実行する(これは一般に「コミット」と呼ばれる)。しかし、別のスレッドが同じメモリロケーションのうちの1つまたは複数に並行してアクセスした場合、トランザクションは、中止され、再開される。すなわち、従来のTMシステムにおいて、同じトランザクション中に共有リソースが複数のスレッドによってアクセスされない限り、トランザクションは、並行して実行する。] [0067] 従来のTMシステムに関連付けられた欠点がいくつかある。例えば、従来のTMシステムは、開発者がいくつかの操作、またはいくつかの操作のシーケンスをアトミックとして宣言できるようにすることによって、開発をある程度簡略化するが、従来のTMシステムは、マルチスレッドアプリケーションの決定論的マルチプロセッシングを提供しない。さらに、従来のTMシステムでは、ソフトウェア開発者は、マルチスレッドアプリケーションにおけるスレッドのインターリービングを指定し、または操作することができない。その結果、従来のTMシステムは、潜在的な同期バグにも苦しむ。また、HTMシステムと比較すると、STMシステムは、ログの維持に伴うオーバーヘッド、およびトランザクションのコミットに費やされた時間の結果、パフォーマンスヒットを被る。] [0068] いくつかの実施形態において、ファシリティは、HTM、STM、HS−TMシステムなど、共有リソースへのアクセスを制御するためにトランザクショナルメモリシステムを使用するマルチスレッドアプリケーションのいくつかのスレッド操作の実行の順序を制御する。すなわち、ファシリティは、スレッドが開始する、および/またはトランザクショナルメモリシステムにおけるトランザクションをコミットする順序を制御することができる。いくつかの実施形態において、ファシリティは、STMシステムによって提供されるアプリケーションプログラミングインターフェイス(「API」)を増補する。一例として、ファシリティは、以下の表1に示されたSTM APIの関数を増補することができる。ファシリティのいくつかの実施形態は、表1に提供されるSTM APIを参照して記載されるが、ファシリティは様々なトランザクショナルメモリシステムにおいて動作し得ることを、当業者であれば理解されたい。] [0069] ] [0070] いくつかの実施形態において、ソフトウェア開発者は、マルチスレッドアプリケーション内のアトミックブロックを手動で指定する。例えば、ソフトウェア開発者は、以下のアトミックブロックを含み得る。] [0071] ] [0072] コンパイル後、上記のアトミックブロック例は、以下の擬似コードによって置き換えられることになる。] [0073] ] [0074] いくつかの実施形態において、トランザクションのうちの1つまたは複数(すなわち、アトミックブロック)は、ソフトウェア開発者に可視ではない。例えば、これらは、コンパイラ、ランタイム、TMシステム、またはその何らかの組み合わせによって挿入され得る。いくつかの実施形態において、ブロックがソフトウェア開発者によって指定されたか、それともコンパイラ、ランタイム、またはTMシステムによって挿入されたかにかかわらず、アトミックブロックは、増補される。いくつかの実施形態において、スレッドがSTMAPIの増補された関数を呼び出すと、関数は、トークンの現在の値に対応するスレッドIDをチェックするDMP関数に制御を転送し、これは、トランザクションを開始し、および/または決定論的にコミットするために使用される。多くの異なる技術はトランザクションをインターセプトするために使用され得ることを、当業者であれば理解されたい。例えば、いくつかのSTM APIは、API関数の実行前および/または後に、制御をDMP関数に転送するために、フックが登録され得るコールバック機構を提供する。] [0075] 増補されたトランザクショナルメモリシステムのトランザクションは、サイズが決定論的である。すなわち、各スレッドは、ブロックにおいて特定数の操作(本明細書では「コミットブロックサイズ」と呼ばれる)を実行し、次いでスレッドは、IDがトークンの現在の値に一致するスレッドで開始して、決定論的にコミットしようと試みる。トランザクションが有効であり、スレッドIDがトークンに一致する場合、スレッドは、STM_Commit_Transaction()を呼び出す。トランザクションがコミットされた後、トークンは、次のスレッドIDに進められる。しかし、トランザクションが無効である場合(例えば、スレッドがそのトランザクション中に別のスレッドによって書き込まれたロケーションから読み取ったため)、スレッドはSTM_Abort_Transaction()を呼び出す。通常、スレッドIDがトークンに一致するスレッドがその対応するトランザクションを正常にコミットするまで、トークンは進められないことに留意されたい。] [0076] いくつかの実施形態において、トークンの現在の値がトランザクションを実行するスレッドのスレッドIDに一致しない場合、いくつかのタイプの操作は、トランザクションに即座に中止させる。例えば、トランザクションがI/O操作など元に戻すことができない操作を含むとき、トランザクションを実行するスレッドは、そのスレッドIDがトークンに一致するかどうかを決定する。そのスレッドIDがトークンに一致する場合、トランザクションは、続行し得る。そうでない場合、トランザクションは、自動的に中止され得る。] [0077] いくつかの実施形態では、中止されたスレッド以降のスレッドIDを有するすべてのスレッドが中止され、一方、別の実施形態では、並行のトランザクションが同じ共有リソースにアクセスしたスレッドのみが中止され、再開される。通常、スレッドIDがトークンに一致するスレッドがその対応するトランザクションを正常にコミットするまで、トークンは進められない。その結果、それらのトランザクションを中止しなかった中止されたスレッド以降のスレッドIDを有する任意のスレッドは、STM_Commit_Transaction()を呼び出す前に、トークンがそのスレッドIDに一致するのを待つ。] [0078] 増補された形のHTMを有するコンピューティングシステムにおいてマルチスレッドアプリケーションが実行されると、マルチスレッドアプリケーションは、実質的に性能のペナルティなく、決定論的に実行され得ることに留意されたい。その結果、ソフトウェア開発者および/または製造業者は、スレッドインターリービングの可能性について徹底的にテストしたことを知っているマルチスレッドアプリケーションを配布することができる。したがって、同期バグがマルチスレッドコードに残っている場合でさえ、顧客には見えない。] [0079] より詳しくファシリティについて説明する前に、ファシリティを実施することができる環境について検討することが有用である。図4は、1つまたは複数の実施形態における、ファシリティが実行するコンピューティングシステム400のアーキテクチャ例を示す高レベルブロック図である。説明を曖昧にするのを回避するために、いくつかのよく知られている構造および機能は、詳細に示されても述べられてもいない。コンピューティングシステム400は、相互接続システム415に結合された1つまたは複数のプロセッサ405およびメモリ410を含む。プロセッサ405は、コンピューティングシステム400の中央処理装置(「CPU」)であり、したがってその操作全体を制御する。いくつかの実施形態において、プロセッサ405は、メモリ410に格納されたソフトウェアを実行することによってこれを達成する。いくつかの実施形態において、コンピューティングシステム400は、単一の集積回路(「ダイ」と呼ばれる)から成るパッケージ、ひとまとめにされた1つまたは複数のダイ、複数のパッケージなどに2つ以上の独立したコアを有するプロセッサ405を含む。いくつかの実施形態において、コンピューティングシステム400は、単一のコアのみを有するにもかかわらず、マルチコアプロセッサとして実行することができるハイパースレッドプロセッサ405を含む。プロセッサ405は、1つまたは複数のプログラム可能な汎用または専用マイクロプロセッサ、デジタル信号プロセッサ(「DPS」)プログラム可能コントローラ、特定用途向け集積回路(「ASIC」)、プログラム可能論理装置(「PLD」)など、またはこうした装置の組み合わせとすることができ、またはそれらを含み得る。] 図4 [0080] 図4に示される相互接続システム415は、適切なブリッジ、アダプタ、および/またはコントローラによって接続される任意の1つまたは複数の個別の物理バスおよび/またはポイントツーポイント接続を表す抽象概念である。相互接続システム415は、例えば、システムバス、ある形の周辺機器コンポーネント相互接続(PCI)バス、ハイパートランスポートまたは業界標準アーキテクチャ(ISA)バス、小型コンピュータシステムインターフェイス(SCSI)バス、ユニバーサルシリアルバス(USB)、電気電子技術者協会(IEEE)標準1394バス(時として「FireWire」と呼ばれる)などを含み得る。] 図4 [0081] システムメモリ410は、プログラムおよびデータが使用されている間にそれらを格納するためのメモリ420、プログラムおよびデータを永続的に格納するためのハードドライブなどの固定記憶装置425、およびコンピュータ可読媒体に格納されるプログラムおよびデータを読み取るためのCD−ROMまたはDVD−ROMドライブなどのコンピュータ可読媒体ドライブ430を含む。本明細書で使用される場合、システムメモリ410は、任意の形の揮発性、不揮発性、取外式、および固定式媒体、またはコンピュータ可読命令、データ構造、プログラムモジュール、およびコンピューティングシステム400の他のデータなどの情報を格納することができるこうした媒体装置の任意の組み合わせを含む。] [0082] また、プロセッサ405には、相互接続システム415を介して、ネットワークアダプタ435、1つまたは複数の入力装置および出力装置(「I/O装置」)440も結合される。ネットワークアダプタ435は、コンピューティングシステム400に、ネットワークを介して他のコンピューティングシステムと通信することができる機能を提供し、例えば、Ethernet(登録商標)アダプタとすることができる。I/O装置440は、コンピューティングシステム400のユーザに、システムメモリ410に格納されるプログラムおよびデータにアクセスすることができる機能を提供する。例えば、I/O装置440は、キーボード、ポインティング装置、マイクロフォンなどの入力装置、および表示装置、スピーカ、プリンタなどの出力装置を含み得る。上述したように構成されたコンピューティングシステムは、通常、ファシリティの操作をサポートするために使用されるが、様々なタイプおよび構成の装置を使用して、様々なコンポーネントを有するファシリティが実装され得ることを、当業者であれば理解されたい。] [0083] 図5は、1つまたは複数の実施形態における、決定論的マルチプロセッシングシステム500の様々な機能的要素を示す高レベルブロック図である。決定論的マルチプロセッシングシステム500はコンピューティングシステム400によって実装される必要がないことに留意されたい。例えば、いくつかの実施形態において、決定論的マルチプロセッシングシステム500は、マルチスレッド型ソフトウェアコードが入力として提供される個別のコンピューティングシステムに実装される。DMPシステム500はハードウェア、ソフトウェア、またはハードウェアおよびソフトウェアの組み合わせに実装され得ることにさらに留意されたい。したがって、特定の実装への言及は、制限とみなされるべきではない。] 図5 [0084] いくつかの実施形態において、決定論的マルチプロセッシングシステム500は、量子ビルダコンポーネント505および決定論的マルチプロセッシング(「DMP」)コンポーネント510を含む。量子ビルダコンポーネント505は、例えば、DMPコンポーネント510によって提供される関数515〜540のうちの1つまたは複数を使用して、マルチスレッドアプリケーション545のコードを増補するコンパイラモジュールとして実装され得る。DMPコンポーネント510によって提供される関数は様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、いくつかの関数がマージまたは分割されてもよく、いくつかの関数が省略されてもよく、いくつかの関数が追加されてもよい。いくつかの実施形態において、量子ビルダコンポーネント505は、例えば低レベル仮想マシン(「LLVM」)コンパイラインフラストラクチャ内など、コンパイラインフラストラクチャ内にコンパイラパスとして実装される。一方、他の実施形態では、量子ビルダコンポーネント505は、マルチスレッドアプリケーションコード545が入力として提供される個別のシステムによって実装される。] [0085] 示された実施形態において、決定論的マルチプロセッシングシステム500は、マルチスレッドアプリケーションコード545を受信し、および/またはそれにアクセスする。マルチスレッドアプリケーションコード545は1つまたは複数のコードファイルを表し得ることに留意されたい。コード545は、マルチスレッドアプリケーションのソースコード、マルチスレッドアプリケーションのソースコードの中間表現(「IR」)、マルチスレッドアプリケーションの実行ファイルなどとすることができる。いくつかの実施形態において、量子ビルダコンポーネント505は、マルチスレッドアプリケーションコード545内に同期コードを挿入して、コンパイラによって生成される制御フローグラフ(「CFG」)において操作を追跡することによって、コンパイラを使用して量子を構築することができる。挿入されたコードは、量子サイズを追跡し、量子サイズに到達したとき、DMPコンポーネント510によって提供される1つまたは複数の関数を呼び出して、アプリケーション内のスレッドの前進を制御する。DMPコンポーネント510は、ランタイムシステムを提供することができ、および/またはDMP関数515〜540のうちの1つまたは複数をコード545に挿入することができる。いくつかの実施形態において、決定論的プロセッシングシステム500は、トランザクショナルメモリシステムと共に動作し、および/または共有テーブルを実装する。] [0086] 示された実施形態において、DMPライブラリは、DMP開始関数(「DMP_Function_Start()関数515」)、DMP初期化関数(「DMP_Init()関数520」)、DMP格納関数(「DMP_Store()関数525」)、DMPロード関数(「DMP_Load()関数530」)、DMPコミット関数(「DMP_Commit()関数535」)、およびDMP終了関数(「DMP_Function_End()関数540」)を含む。DMP開始関数515および終了関数540は、アプリケーション関数が開始し、終了するときを画定するために使用され得る。DMPロード関数530は、ロード操作が実行される、または実行された決定論的マルチプロセッシングシステム500に運ぶために使用され得る。同様に、DMP格納関数525は、格納操作が実行される、または実行された決定論的マルチプロセッシングシステム500に運ぶために使用され得る。DMP格納関数525およびロード関数530は、メモリ操作の順序を制御し、それによってこうした操作の決定論的実行を実施するために使用される。DMP初期化関数520およびDMPコミット関数535は、メモリ操作の順序を制御する、またはトランザクションを開始し、または終了するために使用されるコードのブロックを画定するために使用され得る。DMPコンポーネント510によって提供される関数は様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、いくつかの関数がマージまたは分割されてもよく、いくつかの関数が省略されてもよく、いくつかの関数が追加されてもよい。] [0087] いくつかの実施形態において、量子ビルダコンポーネント505は、以下の表2に列挙されるDMPコンポーネント510の関数515〜540を挿入する。] [0088] ] [0089] いくつかの実施形態において、量子ビルダコンポーネント505は、増補されたコードの中間表現を作成し、これは、例えば、制御フローグラフ(「CFG」)として表され得る。図11は、表2に従って増補されるマルチスレッドアプリケーションコード545の関数の制御フローグラフの一例を示す。いくつかの実施形態において、マルチスレッドアプリケーションコード545が増補された後、コンパイラは、例えばDMP関数515〜540への呼び出しをインライン化することによって、増補されたコードを再度最適化する。コンパイラは本明細書では具体的に記載されない増補されたコードへの他の最適化を実行することができることを、当業者であれば理解されたい。] 図11 [0090] いくつかの実施形態において、マルチスレッドアプリケーションコード545は、STM、HTM、またはHS−TMなど、トランザクショナルメモリシステムを使用して、スレッドによる共有リソースへのアクセスを制御する。こうした実施形態において、決定論的マルチプロセッシングシステム500は、トランザクションがマルチスレッドアプリケーションのスレッドによってコミットされる順序を制御するために使用され得る。例えば、量子ビルダ505は、DMP初期化関数520およびDMPコミット関数535への呼び出しを挿入することによってトランザクションにおける各量子を包むことができる。別の例として、マルチスレッドアプリケーションコード545が1つまたは複数のアプリケーションレベルトランザクショナルメモリブロックを含むとき、量子ビルダコンポーネント505は、ソフトウェア開発者によって宣言される各アトミックブロックの前にDMP初期化関数520への呼び出しを挿入することによって、また命令をコミットするためのTMシステムへの任意の呼び出しの前にDMPコミット関数535への呼び出しを挿入することによって、マルチスレッドアプリケーションコード545を増補することができる。さらに別の例として、決定論的マルチプロセッシングシステム500は、TMインターフェイスの関数への呼び出しをDMPコンポーネント510の1つまたは複数の関数515〜540への呼び出しで包むことによって、TMシステムによって提供されるインターフェイスを増補することができる。その結果、決定論的マルチプロセッシングシステム500がTMシステムと共に動作するとき、トランザクションは、決定論的に開始され、および/またはコミットされ得る。トランザクショナルメモリシステムがHTMシステムであるとき、HTMがこうした追跡を実行する限り、DMPロード関数530およびDMP格納関数525が含まれる必要はないことに留意されたい。] [0091] いくつかの実施形態において、マルチスレッドアプリケーションコード545は、実行可能な増補されたアプリケーション550にコンパイルされる。一方、他の実施形態では、増補されたアプリケーション550は、マシンに依存しない中間言語コードであり、これは、実行時に実行可能命令に変換される。増補後、増補されたアプリケーション550は、マルチプロセッシングシステム上で決定論的に実行され得る。すなわち、増補されたアプリケーション550に同じ入力が与えられると、マルチプロセッシングシステムは、スレッド量子を決定論的にインターリーブし、それによって、増補されたアプリケーション550が実行されるたびに同じ入力を生成する。図5に示されるコンポーネントは様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、コンパイラなど、いくつかのコンポーネントがマージまたは分割されてもよく、いくつかのコンポーネントが省略されてもよく、いくつかのコンポーネントが追加されてもよい。] 図5 [0092] いくつかの実施形態において、DMPコンポーネント510によって提供される関数515〜540は、マルチスレッドアプリケーションのスレッド間に決定論的にトークンを渡し、または進め、それによって各スレッドの前進を決定論的に制御する責任を負う。いくつかの実施形態において、これは、スレッドデータ構造600を使用することによって達成される。図6は、1つまたは複数の実施形態において、マルチプロセッサコードを決定論的にするためにファシリティによって使用されるスレッドデータ構造600を示す高レベルブロック図である。いくつかの実施形態において、スレッドデータ構造600は、スレッドコンテナ605を含む。スレッドコンテナは、実行中にマルチスレッドアプリケーションによって作成されるスレッドごとにスレッドIDを格納する。スレッドコンテナ605は、配列、リンクリスト、キュー、またはスレッドIDの他のデータ構造として実装され得る。] 図6 [0093] いくつかの実施形態において、スレッドデータ構造600は、実行中にマルチスレッドアプリケーションのスレッドによるトランザクションまたは制御された操作の実行の順序を制御するために使用されるトークン610を含む。例えば、いくつかの実施形態において、制御された操作を実行する、またはトランザクションをコミットする前に、スレッドは、そのスレッドIDがトークン610の現在の値に一致するかどうかを決定する。トークン610の現在の値がスレッドIDに一致するとき、対応するスレッドは、制御された操作を実行する、またはトランザクションをコミットしようと試行することができる。そうでない場合、対応するスレッドは、トークン610の現在の値がそのスレッドIDに一致するまで待つ。] [0094] いくつかの実施形態において、スレッドが作成される順序は、スレッドが決定論的に実行される順序に対応する。例えば、各スレッドが作成されるとき、スレッドの対応するスレッドIDは、スレッドコンテナ605に順次格納され得る。トランザクションまたは制御された操作が実行されるとき、実行中のスレッドが、例えばDMP_Commit()535などいくつかのDMP関数を呼び出し、こうした関数は、(第1のスレッドIDで開始して)スレッドIDが格納されたシーケンスに基づいてスレッドコンテナ605に格納されたスレッドIDを順次ループすることによって、トークン610の値を進めるように動作する。スレッドが終了すると、スレッドの対応するIDはスレッドコンテナ605から削除されることに留意されたい。] [0095] いくつかの実施形態において、スレッドデータ構造は、コミットブロックサイズ615を格納する。コミットブロックサイズ615は、トークンが進められる前に、スレッドIDがトークン610の現在の値に一致するスレッドによって実行され得る予め定められた数のトランザクションまたは制御された操作を表す。コミットブロックサイズ615は、1つのトランザクションまたは制御された操作からN個のトランザクションまたは制御された操作まで及び得る。少なくとも1つの実施形態において、コミットブロックサイズ615は、1,000に等しい。いくつかの実施形態において、コミットブロックサイズ615は、構成可能である。例えば、コミットブロックサイズ615は、マルチスレッドアプリケーションの様々なスレッドインターリービングをプログラム的に操作し、テストするように、ソフトウェア開発者によって構成され得る。別の例として、コミットブロックサイズ615は、マルチスレッドアプリケーションによって作成され得る最大数のスレッド、および/またはマルチスレッドアプリケーションが実行するマルチプロセッシングシステムのプロセッサまたはコアの数に基づいて、自動的に構成され得る。] [0096] スレッドによって実行される制御された操作の数をカウントするために様々な技術が使用され得ることを、当業者であれば理解されたい。いくつかの実施形態において、スレッドデータ構造600は、スレッドコミットブロック620を含む。スレッドコミットブロック620は、スレッドIDが現在のトークンID610に一致するスレッドによって実行された制御された操作の数を表し得る。スレッドが制御された操作を実行するたびに、スレッドコミットブロック620の値は、増分され、コミットブロックサイズ615と比較される。スレッドコミットブロック620の値がコミットブロックサイズ615に等しい場合、トークン605は、次のスレッドIDに進められ、スレッドコミットブロック620の値は、ゼロにリセットされる。代替例として、スレッドコミットブロック620は、スレッドがその対応するトランザクションをコミットしようと試行する前に残っているブロックの数を表し得る。こうした実施形態において、スレッドコミットブロック620は、スレッドコンテナ605に格納されたスレッドIDを有するスレッドごとに残りのブロックの数を含み得る。次いで、スレッドは、ブロックを実行するたびに、その対応するスレッドコミットブロックを減分し、残りのブロックの数がゼロに等しいとき、そのトランザクションをコミットしようと試みる。] [0097] いくつかの実施形態において、スレッドデータ構造は、使用中スレッドブロック625を含み、これは、マルチスレッドアプリケーションで実行中のスレッドの数を表す。いくつかの実施形態において、使用中スレッドブロック625は、スレッドが作成されるたびに増分される。同様に、使用中スレッドブロック625は、スレッドが終了するたびに減分される。一方、他の実施形態では、使用中スレッドブロック625は、スレッドコンテナ605のサイズに基づいて決定される。図6に示されるスレッドデータ構造600は様々な方法で変更され得ることを、当業者であれば理解されたい。例えば、いくつかの部分がマージまたは分割されてもよく、いくつかの部分が省略されてもよく、いくつかの部分が追加されてもよい。] 図6 [0098] 図7は、1つまたは複数の実施形態における、スレッドを作成し、決定論的に実行する一例を示す高レベル図である。説明を容易にするために、ある期間にわたるスレッドデータ構造600の一部分の内容が示される。トークン値610によって示されるように、スレッドが作成される順序は、スレッドが決定論的に実行される順序に対応する。] 図7 [0099] 示された例において、最初に作成されたスレッド(「スレッド1」)は、マルチスレッドアプリケーションのメインのアプリケーションスレッドを表す。説明を容易にするために、各スレッドのスレッドIDは、スレッドが作成された順序に等しい。すなわち、最初に作成されたスレッドのスレッドIDは1、2番目に作成されたスレッドのスレッドIDは2、3番目に作成されたスレッドのスレッドIDは3、などとなる。時刻T0とT1との間で、スレッド1が実行し、スレッド2が作成される。示された例において、スレッドの実行は、指定された数の制御された操作(例えば、コミットブロックサイズ615によって指定された量子)によって表される。したがって、図7に示される時間の増分は、必ずしも等しくない。各スレッドによって実行された未制御の操作の数は、異なっていてもよく、またその各実行期間中にスレッドごとに異なっていてもよいことにも留意されたい。] 図7 [0100] 図7に戻って、スレッド1がその量子の実行を終了する前のある時点でスレッド2が作成されたため、時刻T0とT1との間の使用中スレッド625の数は2である。その結果、スレッド1が終了すると、トークン610は、スレッドコンテナ605に格納された次のスレッドIDに進められた(すなわち、スレッド2)。] 図7 [0101] 時刻T1とT2との間で、スレッド2が実行し、次いでトークン610がスレッド1に戻される。時刻T2とT3との間で、スレッド1が実行し、次いでトークン610がスレッド2に進められる。時刻T3とT4との間で、スレッド2が実行し、次いでトークン610がスレッド1に戻される。] [0102] 時刻T4とT5との間で、スレッド1が実行し、スレッド2が作成される。時刻T4とT5との間でスレッド3が作成されるが、スレッド2は、時刻T5とT6との間で実行する。これは、スレッドが作成された順序が、スレッドが実行される順序に対応するからである。その結果、時刻T5とT6との間でスレッド2が実行し、次いで、トークン610がスレッド3に進められる。次いで時刻T6とT7との間でスレッド3が実行し、次いでトークン610がスレッド1に戻される。] [0103] 図8は、1つまたは複数の実施形態における、マルチプロセッサコードを決定論的にするためにトランザクショナルメモリシステムを使用する一例を示す高レベルブロック図である。説明を容易にするために、ある期間にわたるスレッドデータ構造600の一部分の内容が示される。また、説明を容易にするために、スレッドIDがスレッド1、スレッド2、スレッド3などのようにスレッドコンテナ605に配列されると仮定する。ある期間にわたってトークン値610によって示されるように、スレッドがトランザクションをコミットする順序は、決定論的である。説明を容易にするために、トークン610の最初の値は、スレッド1のスレッドIDに対応する。示された例において、各スレッドによって実行されるトランザクションは、サイズが決定論的である。すなわち、各スレッドは、特定の数のブロックを実行する。説明を容易にするために、コミットブロックサイズ615は2である。] 図8 [0104] 示されるように、時刻T0において、スレッド1〜3がトランザクションを開始する。スレッドがその対応するトランザクションを終了した後、スレッドは、そのトランザクションを決定論的にコミットしようと試行する。いくつかの実施形態において、各スレッドは、そのトランザクションが、スレッドにそのトランザクションをコミットさせないようにする競合をもたらしたかどうかを決定する。一方、他の実施形態では、この決定は、そのスレッドIDがトークン610の現在の値に一致するとき、スレッドによって行われる。例えば、これは、STMValidTransaction()を呼び出すことによって達成され得る。] [0105] 時刻T1で、トークン610の現在の値は、スレッド1のIDに一致する。したがって、示された例では、スレッド1は、そのトランザクションが、それにトランザクションをコミットさせないようにする競合をもたらしたかどうかを決定する。指定された決定論的順序に従ってトランザクションがコミットされるため、ファシリティは、書き込み後書き込み、読み取り後書き込みの競合の結果、トランザクションの中止を回避するために残っているメモリを使用することができる。すなわち、トランザクションがコミットされる前にトランザクション内の操作がバッファに入れられるため、ファシリティは、両方のトランザクションを中止するのではなく、書き込み後書き込みまたは読み取り後書き込み操作が実際に競合するかどうかを決定することができる。示された例では、スレッド1およびスレッド2は、同じ共有メモリロケーション(すなわち、アドレスA)にアクセスしており、これは従来のトランザクショナルメモリシステムにおける読み込み後書き込みをもたらすことになるが、スレッド1のトランザクションは有効である。これは、スレッド1がアドレスAに値を格納し、トークン610がそのスレッドIDに一致するからである。すなわち、(スレッド1によって実行される)Aの格納は、(スレッド2によって実行される)Aのロードによって影響されない。その結果、スレッド1は、そのトランザクションをコミットし(例えば、STMCommitTransaction()を呼び出すことによって)、次いでトークン610は、次のスレッドIDに進められる。しかし、トークン610は、スレッド2のスレッドIDに一致した場合、スレッド1は、そのトランザクションを中止することになる。これは、スレッド1がAを格納した後、スレッド2がAをロードしたかもしれないからである。トークン610がスレッド2のIDに一致すると仮定すると、スレッド1およびスレッド2は、そのトランザクションを中止することになる。この場合、スレッド2は、スレッド1の中止されたトランザクションを再開する前に、中止されたトランザクションを開始し、コミットすることになる。] [0106] 示されるように、時刻T1で、スレッド1は、そのトランザクションをコミットし、次いでトークン610は、スレッド2に進められる。しかし、スレッド2は、そのトランザクションをコミットすることができない。というのは、スレッド2は、同じトランザクション中にスレッド1によって格納された値をロードしたからである。すなわち、スレッド2は、スレッド1がAを格納する前に、Aをロードしたかもしれない。その結果、スレッド2は、そのトランザクションを中止し、再開しなければならない。示された例において、中止されたスレッド以降のスレッドIDを有するすべてのスレッドが中止される。一方、他の実施形態では、並行のトランザクションが同じ共有リソースにアクセスした以降のIDを有するスレッドのみが中止され、再開される。したがって、示された例では、スレッド3のトランザクションは、中止され、再開される。しかし、他の実施形態において、スレッド3のトランザクションは、中止されない。というのは、そのトランザクションは、並行のトランザクション中にスレッド2またはスレッド1によってアクセスされた共有リソースにアクセスしなかったからである。代わりに、スレッド3は、単にトークン610がそのスレッドIDに一致するのを待つことになる。スレッドIDがトークンに一致するスレッドが、その対応するトランザクションを正常にコミットするまで、トークン610は進められないことに留意されたい。] [0107] 示されるように、時刻T3で、スレッド2〜3は、その中止されたトランザクションを再開する。時刻T4で、トークン610の現在の値は、スレッド2のIDに一致するため、スレッド2は、その再開されたトランザクションが、それにトランザクションをコミットさせない競合をもたらしたかどうかを決定する。示された例において、スレッド2および3の再開されたトランザクションは、任意の共有メモリロケーションにアクセスしない。その結果、時刻T4で、スレッド2は、そのトランザクションを正常にコミットし、次いでトークン610は、スレッド3に進められる。時刻T5で、スレッド3は、そのトランザクションを正常にコミットし、次いでトークン610は、スレッド1に戻される。] [0108] 次に、時刻T6で、スレッド1〜3は、トランザクションを開始し、プロセスは上述したように続行する。時刻T6で、スレッド1および3の並行のトランザクションによって、スレッド3がそのトランザクションを中止し、再開することに留意されたい。しかし、スレッド1および2は、決定論的にコミットし、トークン610は、上述したように、スレッド3に進められる。] [0109] いくつかの実施形態において、コミットされない(「推測的な」)データはスレッド間に転送され、それによって中止されたトランザクションの数を低減し、マルチスレッドアプリケーション内のさらなる並行性を回復する。例えば、図21は、1つまたは複数の実施形態における、トランザクショナルメモリ(TM)フォワーディングの一例を示す高レベル図である。説明を容易にするために、ある期間にわたるスレッドデータ構造600の一部分の内容が示される。また、説明を容易にするために、スレッドIDがスレッド1、スレッド2、スレッド3などのようにスレッドコンテナ605に配列されると仮定する。ある期間にわたってトークン値610によって示されるように、スレッドがトランザクションをコミットする順序は、決定論的である。説明を容易にするために、トークン610の最初の値は、スレッド1のスレッドIDに対応する。] 図21 [0110] TMフォワーディングが有効にされ、スレッド(「アップデータ」スレッドと呼ばれる)が、別のスレッドに対して共有またはプライベートと見なされるメモリロケーションに書き込むためのメモリロケーションを発行すると、アップデータスレッドは、メモリロケーションに格納されたデータが更新されたことを示すメッセージをブロードキャストする。ブロードキャストに応答して、データの古くなったコピーを含む各スレッドは、そのキャッシュから古くなったデータを削除する。いくつかの実施形態において、別のスレッド(「呼び出し側」スレッドと呼ばれる)が共有メモリロケーションを読み取るためのメモリ操作を順次発行した場合、データの更新されたコピーは、アップデータスレッドが決定論的順序で呼び出し側スレッドに先行することを条件に、トランザクションの中止の代わりに、呼び出し側スレッドに転送される。例えば、示された実施形態において、時刻T0で、スレッド1〜3は、トランザクションを開始する。スレッド1は、メモリロケーションAに書き込むためのメモリ操作を発行し、メモリロケーションAに格納されたデータが更新されたことを示すメッセージをブロードキャストする。説明を容易にするために、スレッド2は、メモリロケーションAに格納されたデータを以前キャッシュに入れたと仮定する。スレッド2がスレッド1からブロードキャストを受信すると、スレッド2は、そのキャッシュからデータの古くなったコピーを削除する。スレッド2は、メモリロケーションAを読み取るためのメモリ操作を順次発行する。データはもはやキャッシュに入れられていないため、スレッド2は、メモリロケーションAが更新されたかどうかを決定し、そうである場合、決定論的順序でそれに先行するスレッドによってそれが更新されたかどうかを決定する。この例で、決定論的順序でスレッド1がスレッド2に先行するため、スレッド1によってメモリロケーションAに格納されるべきデータの更新されたコピーは、スレッド2に転送される。スレッド2に転送されたデータは、推測的である。というのは、スレッド1は、データがスレッド2によって受信されたときにそのトランザクションをコミットしていないからである。いくつかの実施形態において、推測的なデータが、最終的に中止されるコミットされていないトランザクションから転送される場合、推測的なデータを消費したすべてのスレッドも中止される。すなわち、スレッド1がそのトランザクションを中止する場合、スレッド2もそのトランザクションを中止する。というのは、それがスレッド1から推測的なデータを消費したからである。] [0111] スレッド1〜3が対応するトランザクションを終了した後、各スレッドは、そのトランザクションをコミットしようと試行する。時刻T1で、トークン610の現在の値は、スレッド1のIDに一致し、スレッド1にそのトランザクションをコミットさせない競合は存在しない。したがって、スレッド1は、時刻T1でそのトランザクションをコミットし、次いでトークン610は、決定論的順序で次のスレッドIDに進められる(すなわちスレッド2)。時刻T2で、トークン610の現在の値は、スレッド2のIDに一致し、スレッド2にそのトランザクションをコミットさせない競合は存在しない。すなわち、スレッド1が、推測的データが以前スレッド2に転送されたトランザクションを正常にコミットしたため、スレッド2にそのトランザクションをコミットさせないための競合は存在しない。したがって、時刻T2で、スレッド2は、そのトランザクションをコミットし、トークン610は、決定論的順序で次のスレッドIDに進められる(すなわちスレッド3)。時刻T3で、トークン610の現在の値は、スレッド3のIDに一致し、スレッド3にそのトランザクションをコミットさせない競合は存在しない。その結果、スレッド3は、時刻T3でそのトランザクションをコミットし、トークン610は、決定論的順序で次のスレッドIDに進められる(すなわちスレッド1)。次に、時刻T4で、スレッド1〜3は、トランザクションを開始し、プロセスは上述したように続行する。] [0112] 図22は、1つまたは複数の実施形態における、ファシリティによって実行されるトランザクショナルメモリフォワーディングプロセス2200を示すフロー図である。トランザクショナルメモリシステムは、ハードウェアトランザクショナルメモリ(HTM)システム、ソフトウェアトランザクショナルメモリ(STM)システム、またはハイブリッドハードウェア−ソフトウェアトランザクショナルメモリシステム(HS−TM)とすることができることに留意されたい。ステップ2205〜2260で、ファシリティは、呼び出し側スレッドのトランザクション内の各操作をループする。ステップ2205で、ファシリティは、操作を選択する。ステップ2210で、選択された操作が格納操作である場合、ファシリティはステップ2215に進み、そうでない場合、ファシリティはステップ2225に進む。] 図22 [0113] ステップ2215で、ファシリティは、格納操作を反映するために、呼び出し側スレッドのキャッシュを更新する。ステップ2220で、ファシリティは、格納操作によって指定されたメモリロケーションに格納されたデータが更新されたことを示すブロードキャストメッセージを送信し、次いでステップ2260に進む。ステップ2260で、トランザクション内の追加の操作が残っている場合、ファシリティはステップ2205に進み、そうでない場合、プロセス2200は戻る。いくつかの実施形態において、こうしたブロードキャストされたメッセージが受信されると、ファシリティは、現在のトランザクション中にスレッドが更新されたメモリロケーションにアクセスしたかどうかをスレッドごとに決定する。現在のトランザクション中にスレッドがメモリロケーションにアクセスしていない場合、メッセージは、そのスレッドについて無視される。そうではなく、現在のトランザクション中にスレッドがメモリロケーションにアクセスした場合、ファシリティは、スレッドが決定論的順序でアップデータスレッドに先行するかどうかを決定する。スレッドが決定論的順序でアップデータスレッドに先行する場合、メッセージは、スレッドについて無視される。そうではなく、スレッドが決定論的順序でアップデータスレッドに先行しない場合、ファシリティは、そのスレッドによって実行されたトランザクションを中止する。] [0114] ステップ2225で、操作がロード操作である場合、ファシリティはステップ2330に進み、そうでない場合、ファシリティはステップ2260に進む。ステップ2230で、ロード操作によって指定されたメモリロケーションが呼び出し側スレッドによってキャッシュに入れられる場合、ファシリティはステップ2235に進み、そうでない場合、ファシリティはステップ2240に進む。ステップ2235で、ファシリティは、呼び出し側スレッドのキャッシュからデータをロードし、次いでステップ2260に進む。ステップ2240で、別のスレッド(「アップデータスレッド」と呼ばれる)によるトランザクション中にメモリロケーションが更新された場合、ファシリティはステップ2245に進み、そうでない場合、ファシリティはステップ2255に進む。] [0115] ステップ2245で、アップデータスレッドが決定論的順序で呼び出し側スレッドに先行する場合、ファシリティはステップ2250に進み、そうでない場合、ファシリティはステップ2255に進む。ステップ2250で、ファシリティは、ロード操作によって指定されたメモリロケーションに格納されたデータを、アップデータスレッドのキャッシュから呼び出し側スレッドに転送し、次いで、ファシリティはステップ2260に進む。ステップ2255で、ファシリティは、メモリからロード操作によって指定されたメモリロケーションに格納されたデータをロードし、次いでステップ2260に進む。ステップ2260で、トランザクション内の追加の操作が残っている場合、ファシリティはステップ2205に進み、そうでない場合、プロセス2200は戻る。] [0116] 図9は、1つまたは複数の実施形態において、マルチスレッドアプリケーションコードを増補するためにファシリティによって実行されるプロセス900を示すフロー図である。ステップ905〜940で、ファシリティは、マルチスレッドアプリケーションコード545の各関数をループする。ステップ905で、ファシリティは、関数を選択し、次いでステップ910に進む。ステップ910で、ファシリティは、DMP_Function_Start()関数515など、決定論的マルチプロセッシング起動関数を挿入し、次いでステップ915に進む。ステップ915で、ファシリティは、DMP_Init()関数520など、決定論的マルチプロセッシング初期化関数を挿入し、次いでステップ920に進む。ステップ920〜930で、ファシリティは、選択されたアプリケーションの各ブロックをループする。ステップ920で、ファシリティは、ブロックを選択し、次いでステップ925に進む。ステップ925で、ファシリティは、構文解析ブロック関数1000を呼び出し、次いでステップ930に進む。ステップ930で、追加のブロックが残っている場合、ファシリティはステップ920に進み、そうでない場合、ファシリティはステップ935に進む。ステップ935で、ファシリティは、DMP_Function_End()540など、決定論的プロセッシング終了関数を挿入し、次いでステップ940に進む。ステップ940で、追加の関数が残っている場合、ファシリティはステップ905に進み、そうでない場合、これらのステップは終了する。] 図9 [0117] 図10は、1つまたは複数の実施形態における、ブロックを構文解析するためにファシリティによって実行されるプロセス1000を示すフロー図である。ステップ1005で、ブロックがロードブロックであることをファシリティが決定した場合、ファシリティはステップ1010に進み、そうでない場合、ファシリティはステップ1015に進む。ステップ1010で、ファシリティは、ロードブロックの前にDMP_Load()関数530への呼び出しを挿入し、次いでファシリティは戻る。ステップ1015で、ブロックが格納ブロックであることをファシリティが決定した場合、ファシリティはステップ1020に進み、そうでない場合、ファシリティはステップ1025に進む。ステップ1020で、ファシリティは、格納ブロックの前にDMP_Store()関数525への呼び出しを挿入し、次いでファシリティは戻る。ステップ1025で、ブロックがジャンプブロックであることをファシリティが決定した場合、ファシリティはステップ1030に進み、そうでない場合、ファシリティはステップ1035に進む。ステップ1030で、ファシリティは、ジャンプの前にDMP_Commit()関数535への呼び出しを挿入し、ジャンプ先ポイントでDMP_Init()関数520への呼び出しを挿入し、次いでファシリティは戻る。ステップ1035で、ブロックが関数呼び出しであることをファシリティが決定した場合、ファシリティはステップ1040に進み、そうでない場合、ファシリティはステップ1045に進む。ステップ1040で、ファシリティは、呼び出し前にDMP_Commit()関数535への呼び出しを挿入し、呼び出し後DMP_Init()520への呼び出しを挿入し、次いでファシリティは戻る。ステップ1045で、ブロックがI/O呼び出しであることをファシリティが決定した場合、ファシリティは、上述したようにステップ1040に進み、そうでない場合、ファシリティはステップ1050に進む。ステップ1050で、ブロックが戻りブロックであることをファシリティが決定した場合、ファシリティはステップ1055に進み、そうでない場合、ファシリティは戻る。ステップ1055で、ファシリティは、戻りブロック前にDMP_Commit()535への呼び出しを挿入し、次いでファシリティは戻る。] 図10 [0118] 図11は、1つまたは複数の実施形態における、マルチスレッドアプリケーションの増補された関数の制御フローグラフ1100の一例である。「制御フローグラフ」という用語は、その実行中にアプリケーションによってトラバースされ得るすべてのパスの表現を指す。グラフ1100における各ノード1105〜1130は、基本ブロック、すなわち、任意のジャンプまたはジャンプターゲットのない直線のコードを表す。ジャンプターゲットは、ブロックを開始し、ジャンプは、ブロックを終了させる。例えば、DMP_Init()関数520を表すブロック1110は、ジャンプターゲットである。ブロック1105は、入口ブロックを表し、そこを通ってすべての制御がフローグラフに入る。ブロック1130は、出口ブロックを表し、そこを通ってすべての制御フローが出る。有向辺、例えば、ブロック1115と1125との間の辺、1120と1125との間の辺、およびブロック1110とブロック1115、1120、および1125との間の辺は、制御フローにおいてジャンプを表すために使用される。] 図11 [0119] 図12は、1つまたは複数の実施形態における、決定論的マルチプロセッシング(「DMP」)初期化関数1200を示すフロー図である。例えば、DMP初期化関数1200は、ファシリティがトランザクショナルメモリシステムと共に動作するとき、実行され得る。DMP初期化関数は、スレッドがトランザクションの処置を開始または続行できるように、スレッドが初期化された状態であるかどうかを決定するために実行され得る。スレッドが初期化されない(すなわち、スレッドのinitSite変数の値がゼロに等しい)場合、その実行は、トークンの値がスレッドIDに一致するまで一時停止される。スレッドが初期化された場合、スレッドは実行を続ける。] 図12 [0120] ステップ1205で、ファシリティは、スレッド開始変数(「initSite」)の値がゼロに等しいことを決定した場合、ファシリティはステップ1210に進み、そうでない場合、ファシリティは戻る。スレッドの初期化変数は、例えば、スレッドが正常にトランザクションをコミットした後、ゼロに割り当てることができる。ステップ1210で、トークンの現在の値がスレッドIDに一致することをファシリティが決定した場合、ファシリティはステップ1215に進み、そうでない場合、ファシリティは折り返してステップ1210に戻る。すなわち、ファシリティは、スレッドIDがトークンの値に一致するまで、ステップ1210におけるスレッド実行を一時停止する。ステップ1215で、ファシリティは、initSite変数を、スレッドがトランザクションを開始するメモリアドレスに割り当て、次いでファシリティは戻る。次いでinitSite変数は、トランザクションをコミットできない場合、明示的なジャンプアドレスとして使用され得る。] [0121] 図13は、1つまたは複数の実施形態における、決定論的マルチプロセッシング(「DMP」)コミット関数1300を示すフロー図である。例えば、DMPコミット関数1300は、ファシリティがトランザクショナルメモリシステムと共に動作するとき、実行され得る。ステップ1305で、ファシリティは、コミットブロック変数の値を減分し、次いでステップ1310に進む。コミットブロック変数は、スレッドによって実行された操作の数をカウントするために使用される。ステップ1310で、コミットブロック変数の値がゼロであることをファシリティが決定した場合、ファシリティはステップ1315に進み、そうでない場合、ファシリティは戻る。ステップ1315で、ファシリティが間に競合があったことを決定した(例えば、トランザクション中に別のスレッドによって書き込まれたロケーションからスレッドが読み取ったため)場合、ファシリティはステップ1320に進み、そうでない場合、ファシリティはステップ1325に進む。ステップ1320で、ファシリティはトランザクションを中止する。ステップ1325で、ファシリティは、トランザクションをコミットし、次いでステップ1330に進む。ステップ1330で、ファシリティは、スレッドのintiSite変数の値をゼロに割り当て、次いでステップ1335に進む。ステップ1335で、ファシリティは、コミットブロック変数の値をコミットブロックサイズに割り当てることによって、スレッドのコミットブロック変数の値をリセットし、次いで、ステップ1340に進む。ステップ1340で、ファシリティは、トークンの値を次のスレッドIDの値に割り当てることによって、トークンを進め、次いでファシリティは戻る。] 図13 [0122] このように、マルチスレッドアプリケーションの決定論的マルチプロセッシングのためのファシリティについて説明した。ファシリティについて、特定の実施形態を参照して説明してきたが、ファシリティは、記載した実施形態に限定されず、添付の特許請求の範囲の意図および範囲内の修正および変更で実施することができることを理解されたい。したがって、明細書および図面は、制限的意味ではなく、例示的意味でみなされるものとする。]
权利要求:
請求項1 マルチスレッドアプリケーションのクリティカルパス(critical path)において前記マルチスレッドアプリケーションのスレッドのインターリービング(interleaving)を制御するためのマルチプロセッシングシステムであって、複数のスレッドを指定するマルチスレッドアプリケーションコードと、前記マルチスレッドアプリケーションコードを、それぞれ予め定められた数の操作(operations)から成る2つ以上の量子(quanta)に分割(divide)するための量子ビルダコンポーネント(quantum builder component)と、同期コード(synchronization code)が前記マルチスレッドアプリケーションのスレッドに前記2つ以上の量子を実行させる決定論的順序(deterministic order)を指定(specify)するための決定論的(deterministic)実行コンポーネント(execution component)と、スレッド実行を監視(monitor)し、その予め定められた数の操作を実行する前に、前記同期コードを呼び出すかどうかを決定するための適応(adaptive)量子ビルダコンポーネントと、スレッドの実行を監視し、前記同期コードが前記適応量子ビルダコンポーネントによって呼び出されない場合、スレッドがその予め定められた数の操作(operations)を実行することに応答して前記同期コードを呼び出す(invoke)ための量子完了(completion)コンポーネントとを含み、前記マルチスレッドアプリケーションコードの複数の実行パスについて特定の入力が指定されたとき、各実行パス(execution pass)が前記特定の入力について同じ出力を生成(produces)するマルチプロセッシングシステム。 請求項2 前記適応量子ビルダコンポーネントが、アプリケーションレベルの同期プリミティブ(primitive)への変更について、スレッドの実行を監視する請求項1に記載のマルチプロセッシングシステム。 請求項3 アプリケーションレベル同期プリミティブへの前記変更がロック(lock)の解除(release)である請求項2に記載のマルチプロセッシングシステム。 請求項4 前記ロックが解除されると、前記適応量子ビルダコンポーネントが前記量子境界(boundary)を終了(ends)させる請求項2に記載のマルチプロセッシングシステム。 請求項5 前記適応量子ビルダコンポーネントが共有メモリへのスレッドアクセスを監視する請求項1に記載のマルチプロセッシングシステム。 請求項6 閾数の操作が共有メモリとして指定されたメモリ以外のメモリにアクセスすると、前記適応量子ビルダコンポーネントが前記量子境界を終了させる請求項5に記載のマルチプロセッシングシステム。 請求項7 前記適応量子ビルダコンポーネントが、前記マルチスレッドアプリケーションコード内にコードを挿入(inserting)することによって、スレッドの実行を監視する請求項1に記載のマルチプロセッシングシステム。 請求項8 前記挿入された同期コードがメモリ操作を追跡(tracking)するための共有テーブル(sharing table)を含む請求項7に記載のマルチプロセッシングシステム。 請求項9 前記決定論的コンポーネントが前記決定論的順序(deterministic order)を指定するために使用されるトークン(token)を実装(implements)し、前記適応量子ビルダコンポーネントが前記トークンによって指定されたスレッドのスレッド実行(execution)を監視する請求項1に記載のマルチプロセッシングシステム。 請求項10 ハードウェアで排他的(exclusively)に実行される請求項1に記載の方法。 請求項11 ソフトウェアで排他的に実行される請求項1に記載の方法。 請求項12 ハードウェアおよびソフトウェアの組み合わせを使用して実行される請求項1に記載の方法。 請求項13 マルチスレッドアプリケーションのスレッドによって実行されるメモリ操作の順序を制御するためのマルチプロセッシングシステムにおける方法において、マルチプロセッシングシステムにおいてマルチスレッドアプリケーションコードを実行するステップであって、前記マルチスレッドアプリケーションコードが複数のスレッドを指定する、ステップと、前記マルチスレッドアプリケーションコードの前記実行を2つ以上の量子に分割するステップであって、各量子がメモリ操作を含む予め定められた数の操作から成る、ステップと、前記複数のスレッドが前記2つ以上の量子を実行する決定論的順序を指定するステップであって、前記マルチスレッドアプリケーションコードが実行されるとき、メモリ操作を指定するスレッド間(inter-thread)通信が決定論的(deterministic)である、ステップと、前記予め定められた数の操作の実行前に量子を終了(end)させるかどうかを決定するために、量子のスレッドの実行を監視するステップとを含む方法。 請求項14 トークンがスレッドの識別子(identifier)に一致(matches)するとき、前記スレッドが量子を実行するように、前記複数のスレッドが前記2つ以上の量子を実行する前記決定論的順序が前記トークンによって指定される請求項13に記載の方法。 請求項15 スレッド実行を監視するステップが、識別子が前記トークンに一致する前記スレッドによって発行される(issued)プライベートデータへのアクセス数を追跡(tracking)するステップと、前記スレッドによって発行されたプライベートデータへのアクセス数が予め定義された(predefined)数を超えるとき、前記予め定められた数の操作の前記実行の前に前記量子を終了させるステップとを含む請求項14に記載の方法。 請求項16 スレッド実行を監視するステップが、アプリケーションレベル同期プリミティブ(primitive)が、識別子が前記トークンに一致する前記スレッドによって解除される(released)ことの指示(indication)を受信するステップと、前記アプリケーションレベル同期プリミティブの解除に応答して、前記予め定められた数の操作の実行前に前記量子(quantum)を終了させるステップとを含む請求項14に記載の方法。 請求項17 スレッドの実行を監視するステップが、前記マルチスレッドアプリケーションコード内に同期コードを挿入するステップを含む請求項13に記載の方法。 請求項18 マルチプロセッシングシステムに、マルチスレッドアプリケーションのスレッドによって実行されるメモリ操作の順序を制御させることができるコードを格納するコンピュータ可読記憶媒体において、前記コードが、マルチスレッドアプリケーションコードを複数の量子に分割するためのコードであって、各量子が予め定められた数のメモリ操作から成る、コードと、前記複数の量子が実行される決定論的順序を指定するためのコードと、前記マルチスレッドアプリケーションの前記決定論的実行が前記マルチスレッドアプリケーションのクリティカルパスに従うように、スレッドが前記予め定められた数のメモリ操作の実行を終了する前に、量子を終了させるためのコードとを含むコンピュータ可読記憶媒体。 請求項19 マルチスレッドアプリケーションを配置し、前記マルチスレッドアプリケーションのスレッドによって実行されるメモリ操作の順序を制御するためのマルチプロセッシングシステムにおける方法において、マルチプロセッシングシステムにおいて実行する仮想マシン内のマルチスレッドアプリケーションコードを実行するステップであって、前記マルチスレッドアプリケーションコードが複数のスレッドを指定する、ステップと、前記マルチスレッドアプリケーションコードの前記実行を複数の量子に分割するステップであって、各量子がメモリ操作を含む予め定められた数の操作から成る、ステップと、特定のスレッドが前記複数の量子の中の量子を実行する決定論的順序を指定するステップであって、前記マルチスレッドアプリケーションコードが実行されるとき、スレッド間通信を指定するメモリ操作が決定論的に実行される、ステップと、前記仮想マシン内の前記スレッド間通信を追跡して、前記指定された決定論的順序が、特定のスレッドがクラッシュ(crash)をもたらすために観察される量子を実行する既知の順序に一致するかどうかを決定するステップと、前記指定された決定論的順序が既知の順序に一致することの決定に応答して、前記既知の順序のさらなる実行を回避(avoiding)するステップとを含む方法。 請求項20 前記既知の順序のさらなる実行を回避するステップが、特定のスレッドが前記複数の量子の中の量子を実行する新しい決定論的順序(order)を指定するステップを含む請求項19に記載の方法。 請求項21 前記既知の順序のさらなる実行を回避するステップが、量子における前記予め定められた数の操作を変更するステップを含む請求項19に記載の方法。 請求項22 前記変更がランダムである請求項21に記載の方法。 請求項23 配置された(deployed)マルチスレッドアプリケーションにおける動的バグ(dynamic bug)回避(avoidance)のためのマルチプロセッシングシステムにおいて、複数のスレッドを指定する配置されたマルチスレッドアプリケーションコードと、前記コードを、それぞれ決定論的操作数(deterministic number of operations)から成る2つ以上の量子(quanta)に分割するための量子ビルダコンポーネントと、前記マルチスレッドアプリケーションのスレッドが前記2つ以上の量子を実行する決定論的順序を指定するための決定論的コンポーネントと、前記指定された決定論的順序での前記複数のスレッド間の通信を監視し、既知の並行処理のバグの実行を回避するための動的バグ回避コンポーネントであって、前記既知の並行処理のバグが、以前、前記マルチスレッドアプリケーションにクラッシュさせた前記複数のスレッド間の通信のシーケンスである、動的バグ回避コンポーネントとを含むマルチプロセッシングシステム。 請求項24 前記コードが仮想マシン内に配置される請求項23に記載のマルチプロセッシングシステム。 請求項25 前記監視される通信が共有メモリにアクセスするメモリ操作である請求項23に記載のマルチプロセッシングシステム。 請求項26 既知の並行処理のバグの実行が、新しい決定論的順序を指定する前記決定論的コンポーネントによって回避される請求項23に記載のマルチプロセッシングシステム。 請求項27 既知の並行処理のバグの実行が、新しい決定論的操作数を指定し、前記コードを、前記新しい決定論的操作数をそれぞれ指定する2つ以上の量子に分割する量子ビルダコンポーネントによって回避される請求項23に記載のマルチプロセッシングシステム。 請求項28 複数の既知の並行処理のバグを格納するローカルバグライブラリと、前記マルチスレッドアプリケーションがクラッシュしたとき、決定論的順序、および前記複数のスレッド間の通信のシーケンスを識別し、前記識別された決定論的順序および前記識別された通信のシーケンスに対応する新しい既知の並行処理のバグを含むように前記ローカルバグライブラリを更新するためのバグ報告コンポーネントとをさらに含む請求項23に記載のマルチプロセッシングシステム。 請求項29 前記バグ報告コンポーネントが前記新しい既知の並行処理のバグに関連付けられた情報を含む更新をバグアグリゲータ(aggregator)システムに送信する請求項28に記載のマルチプロセッシングシステム。 請求項30 前記バグ報告コンポーネントがバグアグリゲータシステムから更新を受信し、前記更新が前記マルチスレッドアプリケーションの並行処理のバグに関連付けられた情報を含み、前記バグ報告コンポーネントが前記受信された情報を含むように前記ローカルバグライブラリを更新する請求項28に記載のマルチプロセッシングシステム。 請求項31 決定論的順序で実行される複数のスレッドを指定するマルチスレッドアプリケーションにおける並列化(parallelism)を回復(recovering)するためのマルチプロセッシングシステムにおける方法において、複数のスレッドを指定するマルチスレッドアプリケーションコードを2つ以上の量子に分割するステップであって、各量子がスレッドによって実行されるべき予め定められた数の操作から成る、ステップと、スレッドによって実行されるべき量子ごとに前記スレッドに対して証明可能(provably)にローカルであるメモリロケーションにアクセスする任意の操作を識別するステップと、前記マルチスレッドアプリケーションコード内に同期コードを挿入して、前記複数のスレッドが前記2つ以上の量子を実行する決定論的順序を指定するステップであって、前記挿入された同期コードが、前記スレッドに対して証明可能にローカルであるメモリロケーションにアクセスする前記識別された操作以外のメモリロケーションにアクセスする操作を監視するための共有メモリデータ構造を実装する、ステップとを含む方法。 請求項32 前記マルチスレッドアプリケーションコードを実行するステップと、前記スレッドが、別のスレッドに対してプライベートとして前記共有テーブルにおいて識別されるメモリロケーションにアクセスするための操作を発行するとき、前記複数のスレッドのそれぞれが実行における決定論的ポイントに到達(reaches)し、前記決定論的順序が、前記スレッドが実行を始めることを指定するまで、前記スレッドの実行を一時停止(suspending)するステップとをさらに含む請求項31に記載の方法。 請求項33 前記スレッドが、前記スレッドに対して証明可能にローカルであるメモリロケーションにアクセスするための操作を発行(issues)するとき、前記指定された決定論的順序に関係なく前記操作を実行するステップをさらに含む請求項32に記載の方法。 請求項34 マルチプロセッシングシステムに、マルチスレッドアプリケーションのスレッドによって実行されるメモリ操作の順序を制御させることができるコードを格納するコンピュータ可読記憶媒体において、前記コードが、マルチスレッドアプリケーションコードを複数の量子に分割するためのコードであって、各量子が予め定められた数のメモリ操作から成る、コードと、前記複数の量子が実行される決定論的順序を指定するためのコードと、単一のスレッドに対してローカルであると証明されないメモリロケーションにアクセスするメモリ操作の、異なるスレッドによる前記実行を決定論的にすると共に、前記単一のスレッドによる、前記単一のスレッドに対してローカルであると証明されるメモリロケーションにアクセスするメモリ操作の同時実行を可能にするためのコードとを含むコンピュータ可読記憶媒体。 請求項35 決定論的順序で実行される複数のスレッドを指定するマルチスレッドアプリケーションにおける並列化を回復するためのマルチプロセッシングシステムにおける方法において、複数のスレッドを指定するマルチスレッドアプリケーションコードを2つ以上の量子に分割するステップであって、各量子がスレッドによって実行されるべき予め定められた数の操作から成る、ステップと、1つまたは複数の異なるメモリロケーションごとに、前記メモリロケーションにアクセスする少なくとも1つのメモリロケーションを含む量子を構文解析するステップであって、前記メモリロケーションの少なくとも1つについて、前記量子が前記メモリロケーションにそれぞれアクセスする複数のメモリ操作を含む、ステップと、前記異なるアクセスされたメモリロケーションごとに、前記メモリロケーションにアクセスする第1に起こるメモリ操作についてのみ、同期コードが挿入される、前記マルチスレッドアプリケーションコードから結果コードを生成するステップであって、前記同期コードが、前記複数のスレッドが前記2つ以上の量子を実行する決定論的順序を指定するために使用される、ステップとを含む方法。 請求項36 前記結果コードを実行するステップをさらに含む請求項35に記載の方法。 請求項37 マルチスレッドアプリケーションをテストするためのマルチプロセッシングシステムにおける方法において、開発コンピュータから、複数のスレッドを指定するマルチスレッドアプリケーションをテストする旨の要求を受信するステップと、前記受信された要求に関するどんな支払いもないとき、マルチスレッドアプリケーションを2つ以上の量子に分割するステップであって、各量子が前記複数のスレッドうちの1つのスレッドによって実行される予め定められた数の操作から成る、ステップと、前記複数のスレッドが前記2つ以上の量子を実行する決定論的順序を指定するステップと、前記マルチスレッドアプリケーションの複数の実行パスについて、指定された入力についてバグが存在するかどうかを実行パスごとに識別するステップと、バグが識別されないとき、前記開発コンピュータに、バグが前記マルチスレッドアプリケーションにおいて識別されなかったことの指示を送信するステップと、1つまたは複数のバグが識別されたとき、前記開発コンピュータに、1つまたは複数のバグが識別されたことの指示を送信するステップと、前記識別されたバグを所定の料金で(for a fee)明らかにすると申し出るステップとを含む方法。 請求項38 前記識別されたバグを所定の料金で(for a fee)明らかにするという前記申し出が受け入れられたことの指示を前記開発コンピュータから受信するステップと、前記識別されたバグ(bugs)を明らかにする(revealing)ステップと、をさらに含む請求項37に記載の方法。 請求項39 前記開発コンピュータで、前記識別されたバグを再生するための機構を提供するステップをさらに含む請求項38に記載の方法。 請求項40 新しい決定論的順序が実行パスごとに指定される請求項37に記載の方法。 請求項41 実行パスごとに、前記マルチスレッドアプリケーションが2つ以上の量子に分割され、各量子が、前記複数のスレッドのうちの1つのスレッドによって実行される新しい所定の数の操作から成る、請求項37に記載の方法。 請求項42 前記料金が識別されたバグの数に基づく請求項37に記載の方法。 請求項43 コンテンツが、コンピューティングシステムに、コンピュータプログラムをテストするための方法を実行させることができるコンピュータ可読媒体であって、前記方法が、開発コンピュータから、識別されたコンピュータプログラムをテストする旨の要求を受信するステップと、前記受信された要求に関するどんな支払いもないとき、前記コンピュータプログラムによって含まれるバグを識別しようと試行する(attempt)ために、前記コンピュータプログラムをテストするステップと、バグが識別されないとき、前記開発コンピュータに、バグが前記コンピュータプログラムにおいて識別されなかったことの指示を送信するステップと、1つまたは複数のバグが識別されたとき、前記開発コンピュータに、1つまたは複数のバグが識別されたことの指示を送信するステップと、前記識別されたバグを所定の料金(a fee)で明らかにすると申し出るステップとを含むコンピュータ可読媒体。
类似技术:
公开号 | 公开日 | 专利标题 Abdulla et al.2017|Stateless model checking for TSO and PSO Joshi et al.2015|Efficient persist barriers for multicores Gramoli2015|More than you ever wanted to know about synchronization: synchrobench, measuring the impact of the synchronization on concurrent algorithms Batty et al.2015|The problem of programming language concurrency semantics US10324824B2|2019-06-18|Systems, methods, and devices for vertically integrated instrumentation and trace reconstruction US20170123862A1|2017-05-04|Concurrent Execution of Critical Sections by Eliding Ownership of Locks Curtsinger et al.2015|Coz: Finding code that counts with causal profiling Bergan et al.2010|Deterministic Process Groups in dOS. US9268666B2|2016-02-23|System and method for debugging of computer programs Burckhardt et al.2010|Concurrent programming with revisions and isolation types Saito2005|Jockey: a user-space library for record-replay debugging Rosenblum et al.1995|The impact of architectural trends on operating system performance Christie et al.2010|Evaluation of AMD's advanced synchronization facility within a complete transactional memory stack Effinger-Dean et al.2012|IFRit: interference-free regions for dynamic data-race detection Zhou et al.2004|iWatcher: Efficient architectural support for software debugging Hangal et al.2004|TSOtool: A program for verifying memory systems using the memory consistency model Johnson et al.2009|Shore-MT: a scalable storage manager for the multicore era US7673181B1|2010-03-02|Detecting race conditions in computer programs US7958497B1|2011-06-07|State synchronization in recording and replaying computer programs US6327668B1|2001-12-04|Determinism in a multiprocessor computer system and monitor and processor therefor Sarkar et al.2012|Synchronising c/c++ and power Veeraraghavan et al.2012|DoublePlay: parallelizing sequential logging and replay Jula et al.2008|Deadlock immunity: Enabling systems to defend against deadlocks Lozi et al.2012|Remote core locking: migrating critical-section execution to improve the performance of multithreaded applications Karlin et al.1991|Empirical studies of competitve spinning for a shared-memory multiprocessor
同族专利:
公开号 | 公开日 EP2266026A4|2012-01-11| EP2266026A1|2010-12-29| US8739163B2|2014-05-27| JP5624480B2|2014-11-12| US20090235262A1|2009-09-17| WO2009114645A1|2009-09-17|
引用文献:
公开号 | 申请日 | 公开日 | 申请人 | 专利标题 US6101524A|1997-10-23|2000-08-08|International Business Machines Corporation|Deterministic replay of multithreaded applications| US6625635B1|1998-11-02|2003-09-23|International Business Machines Corporation|Deterministic and preemptive thread scheduling and its use in debugging multithreaded applications|JP2012128628A|2010-12-15|2012-07-05|Internatl Business Mach Corp <Ibm>|Program optimization apparatus, optimization method, and optimization program| JP2013101563A|2011-11-09|2013-05-23|Toshiba Corp|プログラム変換装置、プログラム変換方法、および変換プログラム| JP2014194769A|2013-03-13|2014-10-09|Cloudera Inc|Low latency query engine for APACHEHADOOP| WO2018037787A1|2016-08-22|2018-03-01|日立オートモティブシステムズ株式会社|テスト項目生成方法、演算装置|US5909559A|1997-04-04|1999-06-01|Texas Instruments Incorporated|Bus bridge device including data bus of first width for a first processor, memory controller, arbiter circuit and second processor having a different second data width| US6298370B1|1997-04-04|2001-10-02|Texas Instruments Incorporated|Computer operating process allocating tasks between first and second processors at run time based upon current processor load| WO2000074114A1|1999-05-27|2000-12-07|Oliver Design, Inc.|Disk cascade scrubber| WO2001027764A1|1999-10-13|2001-04-19|Board Of Regents The University Of Texas System|Software fault tolerance of concurrent programs using controlled re-execution| US6832367B1|2000-03-06|2004-12-14|International Business Machines Corporation|Method and system for recording and replaying the execution of distributed java programs| WO2002021281A2|2000-09-08|2002-03-14|Network Appliance, Inc.|Panic message analyzer| WO2003030012A1|2001-09-28|2003-04-10|Tidal Networks, Inc.|Multi-threaded packet processing engine for stateful packet pro cessing| CN101694643B|2003-09-30|2012-10-10|明导公司|使用一个或多个自动机的系统验证| US20050081206A1|2003-10-14|2005-04-14|Armstrong Douglas R.|Methods and apparatus for profiling threaded programs| US7730501B2|2003-11-19|2010-06-01|Intel Corporation|Method for parallel processing of events within multiple event contexts maintaining ordered mutual exclusion| US7490218B2|2004-01-22|2009-02-10|University Of Washington|Building a wavecache| US7716031B2|2005-02-25|2010-05-11|Coware, Inc.|Interface converter for unified view of multiple computer system simulations| WO2007056597A1|2005-11-10|2007-05-18|Hewlett-Packard Development Company L.P.|Program thread synchronization| US20070143755A1|2005-12-16|2007-06-21|Intel Corporation|Speculative execution past a barrier| US7792805B2|2006-05-30|2010-09-07|Oracle America, Inc.|Fine-locked transactional memory| US8316352B2|2006-06-09|2012-11-20|Oracle America, Inc.|Watchpoints on transactional variables| US20080209436A1|2006-10-25|2008-08-28|Gul Agha|Automated testing of programs using race-detection and flipping| US7711678B2|2006-11-17|2010-05-04|Microsoft Corporation|Software transaction commit order and conflict management| US7860847B2|2006-11-17|2010-12-28|Microsoft Corporation|Exception ordering in contention management to support speculative sequential semantics| US8719807B2|2006-12-28|2014-05-06|Intel Corporation|Handling precompiled binaries in a hardware accelerated software transactional memory system| US8060482B2|2006-12-28|2011-11-15|Intel Corporation|Efficient and consistent software transactional memory| WO2008101756A1|2007-02-20|2008-08-28|International Business Machines Corporation|Method and system for concurrent message processing| US8533681B2|2007-03-07|2013-09-10|The Board Of Trustees Of The University Of Illinois|Atomicity violation detection using access interleaving invariants| US8458724B2|2007-06-15|2013-06-04|Microsoft Corporation|Automatic mutual exclusion| US7676636B2|2007-07-10|2010-03-09|Sun Microsystems, Inc.|Method and apparatus for implementing virtual transactional memory using cache line marking| US8239633B2|2007-07-11|2012-08-07|Wisconsin Alumni Research Foundation|Non-broadcast signature-based transactional memory| WO2009076654A1|2007-12-12|2009-06-18|University Of Washington|Deterministic multiprocessing| US7966459B2|2007-12-31|2011-06-21|Oracle America, Inc.|System and method for supporting phased transactional memory modes| US8453120B2|2010-05-11|2013-05-28|F5 Networks, Inc.|Enhanced reliability using deterministic multiprocessing-based synchronizedreplication|US8561026B2|2007-11-27|2013-10-15|International Business Machines Corporation|Method, apparatus and computer program for facilitating the improvement of a user interface| WO2009076654A1|2007-12-12|2009-06-18|University Of Washington|Deterministic multiprocessing| US7823019B2|2008-05-08|2010-10-26|Arm Limited|Debug circuitry| US9418005B2|2008-07-15|2016-08-16|International Business Machines Corporation|Managing garbage collection in a data processing system| US8307246B2|2008-10-29|2012-11-06|Aternity Information Systems Ltd.|Real time monitoring of computer for determining speed of various processes| US9032254B2|2008-10-29|2015-05-12|Aternity Information Systems Ltd.|Real time monitoring of computer for determining speed and energy consumption of various processes| US8640133B2|2008-12-19|2014-01-28|International Business Machines Corporation|Equal duration and equal fetch operations sub-context switch interval based fetch operation scheduling utilizing fetch error rate based logic for switching between plurality of sorting algorithms| US8490181B2|2009-04-22|2013-07-16|International Business Machines Corporation|Deterministic serialization of access to shared resource in a multi-processor system for code instructions accessing resources in a non-deterministic order| US8875111B2|2009-04-23|2014-10-28|Microsoft Corporation|Intermediate language representation and modification| US8812796B2|2009-06-26|2014-08-19|Microsoft Corporation|Private memory regions and coherence optimizations| US20100332768A1|2009-06-26|2010-12-30|Microsoft Corporation|Flexible read- and write-monitored and buffered memory blocks| US8250331B2|2009-06-26|2012-08-21|Microsoft Corporation|Operating system virtual memory management for hardware transactional memory| US8356166B2|2009-06-26|2013-01-15|Microsoft Corporation|Minimizing code duplication in an unbounded transactional memory system by using mode agnostic transactional read and write barriers| US8370577B2|2009-06-26|2013-02-05|Microsoft Corporation|Metaphysically addressed cache metadata| US8489864B2|2009-06-26|2013-07-16|Microsoft Corporation|Performing escape actions in transactions| US8539456B2|2009-06-30|2013-09-17|Intel Corporation|Automatic conversion of MPI source code programs into MPI thread-based programs| US8229907B2|2009-06-30|2012-07-24|Microsoft Corporation|Hardware accelerated transactional memory system with open nested transactions| US8402218B2|2009-12-15|2013-03-19|Microsoft Corporation|Efficient garbage collection and exception handling in a hardware accelerated transactional memory system| US8533440B2|2009-12-15|2013-09-10|Microsoft Corporation|Accelerating parallel transactions using cache resident transactions| US9092253B2|2009-12-15|2015-07-28|Microsoft Technology Licensing, Llc|Instrumentation of hardware assisted transactional memory system| US8539465B2|2009-12-15|2013-09-17|Microsoft Corporation|Accelerating unbounded memory transactions using nested cache resident transactions| US8838906B2|2010-01-08|2014-09-16|International Business Machines Corporation|Evict on write, a management strategy for a prefetch unit and/or first level cache in a multiprocessor system with speculative execution| US8533399B2|2010-01-15|2013-09-10|International Business Machines Corporation|Cache directory look-up re-use as conflict check mechanism for speculative memory requests| US8751748B2|2010-01-15|2014-06-10|International Business Machines Corporation|Reader set encoding for directory of shared cache memory in multiprocessor system| US8417897B2|2010-03-31|2013-04-09|Oracle International Corporation|System and method for providing locale-based optimizations in a transactional memory| WO2011137464A1|2010-05-03|2011-11-10|Keba Ag|Verfahren zum selektiven aufzeichnen, rekonstruieren und analysieren des programmlaufs eines steuerungsprogramms| US8453120B2|2010-05-11|2013-05-28|F5 Networks, Inc.|Enhanced reliability using deterministic multiprocessing-based synchronizedreplication| US9176783B2|2010-05-24|2015-11-03|International Business Machines Corporation|Idle transitions sampling with execution context| US8793689B2|2010-06-09|2014-07-29|Intel Corporation|Redundant multithreading processor| US8843684B2|2010-06-11|2014-09-23|International Business Machines Corporation|Performing call stack sampling by setting affinity of target thread to a current process to prevent target thread migration| US8799872B2|2010-06-27|2014-08-05|International Business Machines Corporation|Sampling with sample pacing| US8769518B1|2010-06-29|2014-07-01|Ca, Inc.|Ensuring determinism during programmatic replay in a virtual machine| US8499299B1|2010-06-29|2013-07-30|Ca, Inc.|Ensuring deterministic thread context switching in virtual machine applications| US8732670B1|2010-06-29|2014-05-20|Ca, Inc.|Ensuring determinism during programmatic replay in a virtual machine| US9038048B2|2010-07-22|2015-05-19|The Trustees Of Columbia University In The City Of New York|Methods, systems, and media for protecting applications from races| US9454460B2|2010-07-23|2016-09-27|The Trustees Of Columbia University In The City Of New York|Methods, systems, and media for providing determinism in multithreaded programs| US20120089873A1|2010-08-17|2012-04-12|Nec Laboratories America, Inc.|Systems and methods for automated systematic concurrency testing| US8745440B1|2010-09-21|2014-06-03|F5 Networks, Inc.|Computer-implemented system and method for providing software fault tolerance| US8549504B2|2010-09-25|2013-10-01|Intel Corporation|Apparatus, method, and system for providing a decision mechanism for conditional commits in an atomic region| KR101649925B1|2010-10-13|2016-08-31|삼성전자주식회사|멀티 트레드 프로그램에서 변수의 단독 메모리 접근여부를 분석하는 방법| US8819700B2|2010-12-22|2014-08-26|Lsi Corporation|System and method for synchronous inter-thread communication| US8799904B2|2011-01-21|2014-08-05|International Business Machines Corporation|Scalable system call stack sampling| US9146746B2|2011-03-01|2015-09-29|University Of Washington Through Its Center Of Commercialization|Systems and methods for providing deterministic execution| US8910188B1|2011-07-14|2014-12-09|Google Inc.|Deterministic data processing| CN104220989B|2011-12-21|2017-12-12|英特尔公司|用于识别并且再现多线程程序中并发冲突的方法及系统| US9135139B2|2012-06-27|2015-09-15|Intel Corporation|Methods and systems to identify and reproduce concurrency violations in multi-threaded programs using expressions| US9575806B2|2012-06-29|2017-02-21|Intel Corporation|Monitoring accesses of a thread to multiple memory controllers and selecting a thread processor for the thread based on the monitoring| US9575813B2|2012-07-17|2017-02-21|Microsoft Technology Licensing, Llc|Pattern matching process scheduler with upstream optimization| US8707326B2|2012-07-17|2014-04-22|Concurix Corporation|Pattern matching process scheduler in message passing environment| US8949795B2|2012-08-23|2015-02-03|International Business Machines Corporation|Generating test cases for covering enterprise rules and predicates| US9075601B1|2013-03-07|2015-07-07|Ca, Inc.|Providing a scripting interface to existing code| US9117021B2|2013-03-14|2015-08-25|Intel Corporation|Methods and apparatus to manage concurrent predicate expressions| US9471318B2|2013-03-15|2016-10-18|International Business Machines Corporation|System management and instruction counting| US9501340B2|2013-03-15|2016-11-22|Intel Corporation|Mechanism for facilitating dynamic and efficient management of instruction atomicity violations in software programs at computing systems| US10725889B2|2013-08-28|2020-07-28|Micro Focus Llc|Testing multi-threaded applications| GB2549239A|2014-11-13|2017-10-18|Advanced Risc Mach Ltd|Context sensitive barriers in data processing| US9841914B2|2015-05-05|2017-12-12|Sap Se|Managed energy-efficient hybrid main memory systems| US20180075080A1|2015-07-17|2018-03-15|Hitachi, Ltd.|Computer System and Database Management Method| US9851957B2|2015-12-03|2017-12-26|International Business Machines Corporation|Improving application code execution performance by consolidating accesses to shared resources| US10031697B2|2016-01-19|2018-07-24|Qualcomm Incorporated|Random-access disjoint concurrent sparse writes to heterogeneous buffers| US10275269B1|2016-05-27|2019-04-30|Bromium, Inc.|Hypervisor to support nested virtualization| CN106648863B|2016-12-08|2020-01-03|武汉斗鱼网络科技有限公司|一种安卓应用安装包、应用目标进程保活方法及系统| US10275337B2|2017-01-17|2019-04-30|International Business Machines Corporation|Intelligent processing of distributed breakpoints| US10599552B2|2018-04-25|2020-03-24|Futurewei Technologies, Inc.|Model checker for finding distributed concurrency bugs|
法律状态:
2012-03-13| A621| Written request for application examination|Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20120312 | 2013-03-09| A521| Written amendment|Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20130308 | 2013-08-22| A977| Report on retrieval|Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20130822 | 2013-09-25| A131| Notification of reasons for refusal|Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20130924 | 2014-03-18| A521| Written amendment|Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20140317 | 2014-08-26| TRDD| Decision of grant or rejection written| 2014-08-29| A01| Written decision to grant a patent or to grant a registration (utility model)|Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20140828 | 2014-10-02| A61| First payment of annual fees (during grant procedure)|Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20140926 | 2014-10-03| R150| Certificate of patent or registration of utility model|Ref document number: 5624480 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 | 2017-10-03| LAPS| Cancellation because of no payment of annual fees|
优先权:
[返回顶部]
申请号 | 申请日 | 专利标题 相关专利
Sulfonates, polymers, resist compositions and patterning process
Washing machine
Washing machine
Device for fixture finishing and tension adjusting of membrane
Structure for Equipping Band in a Plane Cathode Ray Tube
Process for preparation of 7 alpha-carboxyl 9, 11-epoxy steroids and intermediates useful therein an
国家/地区
|