SC-DRFにアトミックのみがあり、HRFダイレクトにないプログラムがあるのはなぜですか?


7

「ヘテロジニアスレースフリーメモリモデル」[1]の論文では、SC-DRFではアトミックのみで構成されるプログラムはレースフリーであるが、HRFダイレクトではないという記述があります。これがなぜなのか理解できません。これがどのように起こるかを誰かが説明できますか?

[1] Derek R. Hower et al。、「異質レースフリーメモリモデル」。でASPLOS '14の議事録、ACM、2014年(PDF

回答:


12

うまくいけば、彼らは明示的に「アトミックのみで構成されるプログラムはSC-DRFではレースフリーである」と明示的に述べなかったと思います。不正解です。

「[in]スコープ同期...アトミックがスコープを正しく使用しない場合、アトミックで完全に構成されるレースプログラムを作成することは可能です」[2ページの上部]とわずかに異なります(そして「racey」という単語を曖昧に使用しているため、おそらく誤ったステートメントを意味すると信じるようになります。)代わりに、スコープ付き同期では、アトミックで完全に構成されいる非順次一貫性のあるプログラムを書くことが可能であると述べたはずですスコープを正しく使用しないでください。

SC-DRF(大まかに:C ++およびJavaのメモリセマンティクス)は、メモリの場所を、同期オブジェクト(と呼ばれることもあるatomics)とデータオブジェクトの2つのクラスに分割します。ほとんどの場合、同期オブジェクトに対するすべての操作は、順次一貫していることが保証されてます。[1](競合なしではありません。)これは、プログラマーではなく、コンパイラーの制約です。1つのスレッドがアトミックオブジェクトaを書き込みb、次にアトミックオブジェクトを書き込むとプログラマが言った場合、すべてスレッドは、書き込みがこの順序で行われることを確認します。(コンパイラーはアクセスの順序を変更することを許可されておらず、順次一貫していないマシンに適切なメモリー・バリアとフェンスを挿入する必要があります。)

順次一貫性とは、すべてのプロセッサのすべてのスレッドが、すべてのメモリ操作の合計順序に同意することを意味します。1つのスレッドがその操作を考えている場合バツ 手術前に起こったyすべてのスレッドがその操作を考えるバツ 手術前に起こったy。シーケンシャルに一貫性があるということは、競争が激しいという意味ではなく、決定論的という意味でもありません。たとえば、2つの異なるスレッドがほぼ同時に同じ同期変数を書き込もうとする可能性があります。これらのアクセスは不安定になります。順次一貫したシステムは、1つのスレッドがその書き込みをバツ 書く前に起こった yすべてのスレッドが書き込みに同意しますバツ 書く前に起こった y。逐次一貫性は、ミューテックスや条件変数などの有用な非決定的同期オブジェクトを構築して推論できるため、便利です。

SC-DRFは、と言っている場合は、あなたのプログラムがあるデータレース無料、上の操作データオブジェクトがします表示されるように順次一貫。コンパイラー、データオブジェクトの操作を並べ替えたり(場合によっては削除したり)することができます。基盤となるマシンが順次一貫していない場合、コンパイラーはメモリバリアまたはフェンスを挿入する必要はありません。 ただし、コンパイラーは、同期オブジェクトの操作に関して、データオブジェクトの操作を並べ替えることはできません

データのレースフリーは、レースフリーと同じではありません。そして、逐次一貫性は、レースフリーと同じではありません。特定のプログラムの実行スケジュールがあるデータ、データオブジェクトのアクセスのいずれかのペアの場合は無料レースバツ そして y、2つの異なるスレッド(少なくとも1つは書き込み操作)により、アトミックオブジェクトアクセスの(順次的に一貫した)順序を使用して、 バツ 前に起こった y または y 前に起こった バツ。証明ができない場合、その実行スケジュールはデータの競争が激しいです。

プログラムは、あるデータ競合の無料すべての可能な実行スケジュールが無料データ競合している場合。データレース状の実行スケジュールがある場合、プログラムはデータレース状です。

ビーイングデータレース無料はプログラマではなく、コンパイラの制約です。それはあなたのプログラムがデータのレースであるならば、あなたのプログラムには意味論がないと言います。コンパイラーは、プログラムの停止、無限ループへの移行、コンピューターの爆破など、必要なことをすべて実行できます。

まあ。 TL; DR! SC-for-HRCについてはまだ触れていません。

SC-for-HRCでは、アトミックはどのスコープに属するかを指定する必要があります。アトミックアクセスは、(コンパイラによって)独自のスコープ内でのみ順番に一貫していることが保証されています。スコープ内のすべてのスレッドは、アトミックアクセスが発生する順序について同意しますが、別のスコープ内のスレッド同意しない場合があります(その順序はもちろん、アクセスをまったく表示できない場合もあります)。

たとえば、スレッド19がミューテックスAを取得してからミューテックスBを取得することにすべてのGPUスレッドが同意するが、すべてのCPUスレッドがスレッド19がミューテックスAまたはミューテックスBを取得することにまったく同意しない(または知らない)場合があります。SC-DRFには「スコープ」がないため、この問題は発生しません。

[1]順次一貫したアトミックの例外は、を明示的に使用することと関係がありstd::memory_order_relaxedます。だからそれをしないでください。(そして、私が言っている残りの部分では例外を無視します。)


SCの簡潔な説明ありがとうございます。これは私が今まで読んだ中で最高です。私はそれを終わらせたくありませんでした:)「レースフリー」とは何かを説明してもらえますか。それは、データレースフリーおよびSCとは異なると言うからです。
sanatana 2014

「レースフリー」とは、データと同期の両方が「レースフリー」であることを意味します。つまり、同期は確定的でなければなりません。(「競合」とは、非決定的なプロセスによって決定(解決)される順序です。)決定的な同期システム(たとえばgroups.csail.mit.edu/commit/papers/09/asplos073-olszewski.pdf)がありますが、それらは珍しく、これは1つではありません。
Wandering Logic

個人的には、同期操作に関して「レース」または「レースフリー」という用語をだれも使用しないことをお勧めします。ミューテックスを取得するユーザーの解決には、「非決定論的」と「決定論的」を使用することをお勧めします。したがって、「人種」という単語の前には常に「データ」という単語を付けることをお勧めします。
Wandering Logic

コンパイラは、同期オブジェクトの操作に関してデータオブジェクトの操作を並べ替えることはできません。」-(C ++)コンパイラ(およびCPU)は、SeqCst操作の暗黙的な取得/解放の特性に従って並べ替えることができませんか?(つまり、SeqCstストアを使用してデータオブジェクトの操作を一方向に並べ替え、SeqCstロードを使用して反対方向に並べ替えます)
LWimsey

@LWimseyはい、あなたは正しいと思います。私の回答はすでに長すぎたので、取得/リリースに関して不明確でした。
Wandering Logic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.