問題タブ [memory-barriers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
opencl - OpenCL では、バリア() とは対照的に、mem_fence() は何をしますか?
barrier()
(私は理解していると思います) とは異なりmem_fence()
、ワーク グループ内のすべての項目に影響を与えるわけではありません。OpenCL の仕様には、(セクション 6.11.10) と記載されていmem_fence()
ます。
カーネルを実行するワークアイテムのロードとストアを命令します。
(したがって、単一の作業項目に適用されます)。
しかし、同時に、セクション 3.3.1 では次のように述べています。
ワークアイテム メモリ内では、ロード/ストアの一貫性があります。
そのため、作業項目内でメモリは一貫しています。
では、どんなことにmem_fence()
役立つのでしょうか。アイテム間では機能しませんが、アイテム内では必要ありません...
アトミック操作を使用していないことに注意してください (セクション 9.5 など)。mem_fence()
それらと組み合わせて使用するという考え方ですか?もしそうなら、私は例を見てみたいです。
ありがとう。
更新: で使用すると どのように役立つかがわかりますbarrier()
(暗黙的に、バリアが呼び出すためmem_fence()
) - しかし、それは別々に存在するので、確かにもっとあるはずですか?
c# - CPUアーキテクチャに基づいて実行時に条件付きコードを持つことはできますか?
私は.Net4.5を使用しています(プレビュー... 4はこの質問の目的には問題ありません)。私は糸脱毛の仕事をしています。
私の調査によると、x86 CPUには強力なメモリモデルがあり、書き込みが並べ替えられないことを意味します。これにより、ロックを安全に解放できます。これは、メモリモデルが弱いItaniumCPUには当てはまりません。
揮発性、メモリバリア、および実行の並べ替えの原則を理解しています。
理想的には、CPUがItaniumの場合はキーポイントにメモリバリアを挿入しますが、x86の場合は挿入しません。JITが処理するランタイムコンパイラ指令のように、これを動的に行うことは可能ですか?
そうでない場合は、2つのプラットフォーム用に別々のビルドが必要になることに気付きました。その場合、2セットのC#ファイルを使用せずに、ターゲットを変更するだけでこれを行うための最も洗練された方法は何ですか?
c# - 遅延読み込みと Thread.MemoryBarrier の使用
別のオブジェクトへの参照を持つクラスを設計する場合、参照されるオブジェクトを最初に使用するときにのみ作成することが有益な場合があります。たとえば、遅延読み込みを使用します。
私はよくこのパターンを使用して、遅延ロードされたプロパティを作成します。
次に、BCL のソース コードを参照しているときに、次のコードを見つけました。
私が知る限り、これらはどれもスレッドセーフではありません。たとえば、複数のEncoding
オブジェクトを作成できます。Encoding
私はそれを完全に理解しており、余分なオブジェクトが作成されても問題ないことを知っています。これは不変であり、まもなくガベージ コレクションになります。
Thread.MemoryBarrier
ただし、なぜが必要なのか、またマルチスレッド シナリオで 2 番目の実装が最初の実装とどのように異なるのかを理解したいと思っています。
明らかに、スレッドの安全性が懸念される場合、最適な実装はおそらく次を使用することLazy<T>
です。
c# - Thread.MemoryBarrier() についての説明が必要
重複の可能性:
Thread.MemoryBarrier() が必要な理由
O'Reilly の C# からの要約:
メソッド A と B が異なるスレッドで同時に実行されたとします。
著者は次のように述べています。「バリア 1 と 4 により、この例では「0」を書き込むことができなくなります。バリア 2 と 3 により、鮮度が保証されます。B が A の後に実行された場合、_complete の読み取りが true と評価されることが保証されます。」
私の質問は次のとおりです。
- バリア 4 が必要な理由 バリア1じゃ足りない?
- なぜ 2 と 3 が必要なのですか?
- 私が理解していることから、バリアは次の命令の後にその場所の前に命令を実行することを防ぎます、私は正しいですか?
java - メモリバリアとTLB
メモリバリアは、データキャッシュの一貫性を保証します。ただし、TLBの一貫性が保証されますか?
スレッド間でMappedByteBufferを渡すときに、JVM(java 7 update 1)がメモリエラー(SIGBUS、SIGSEG)でクラッシュすることがあるという問題が発生しています。
例えば
Thread.yield()がないと、force()、put()、およびCのmemcpy()でクラッシュが発生することがあります。これらはすべて、メモリに不正にアクセスしようとしていることを示しています。Thread.yield()を使用しても問題はありませんが、信頼できる解決策のようには思えません。
誰かがこの問題に遭遇しましたか?TLBとメモリバリアについての保証はありますか?
編集:OSはCentos 5.7ですが、i7およびDualXeonマシンでの動作を確認しました。
なぜ私はこれをするのですか?メッセージの書き込みにかかる平均時間は長さにもよりますが35〜100 nsであり、プレーンなwrite()の使用はそれほど高速ではないためです。現在のスレッドでメモリマップとクリーンアップを行う場合、これには50〜130マイクロ秒かかります。バックグラウンドスレッドを使用すると、メインスレッドがバッファを交換するのに約3〜5マイクロ秒かかります。なぜバッファを交換する必要があるのですか?私は多くのGBのデータを書き込んでおり、ByteBufferのサイズを2GB以上にすることはできないためです。
c# - これはThread.MemoryBarrier()の正しい使用法ですか?
ループの実行を制御するフィールドがあると仮定します。
そして、次のようなコードを持つスレッドを実行しています。
これで、同期メカニズムを使用せずに、別のスレッドがに設定さshouldRun
れる可能性があります。false
Thread.MemoryBarrier()を理解している限り、whileループ内にこの呼び出しを含めると、作業スレッドがキャッシュされたバージョンのを取得できなくなりshouldRun
、無限ループが発生するのを効果的に防ぐことができます。
Thread.MemoryBarrierについての私の理解は正しいですか?変数を設定できるスレッドがある場合(これは簡単に変更できません)、これは、スレッドによってfalseに設定されるshouldRun
と、ループが確実に停止するようにするための合理的な方法ですか?shouldRun
c++ - 共有メモリへのアトミック アクセス
特定の方法でメモリを解釈する複数のプロセス間で共有メモリがあります。元:
私が望むのは、カウンターがアトミックに更新/インクリメントされることです。そして、そのアドレスでメモリ解放が行われるようにします。たとえば、共有メモリを使用していない場合は、次のようになります
ランダムなメモリ位置でこれを達成するにはどうすればよいですか (上記の DataBlock カウンターであると解釈されます)。アーキテクチャ (x86 Linux) の要求に応じてアドレスが整列されていることを保証できます。
- 更新をアトミックにする - どうやって?(つまり、atomicupdate(addr, newvalue))
- マルチコアのメモリ同期 - (つまり、memorysync(addr)) - 私が見ることができる唯一の方法は、 std::atomic_thread_fence(std::memory_order_release) を使用することです - しかし、これは「すべてのアトミックストアとリラックスしたアトミックストアのメモリ同期順序を確立します」 - それは私にとってはやり過ぎです-カウンターの場所を同期させたいだけです。どんな考えでも感謝します。
c++ - Atomics 用の C++ メモリ バリア
これに関しては、私は初心者です。次のメモリバリアの違いを簡単に説明できる人はいますか?
- 窓
MemoryBarrier();
- フェンス
_mm_mfence();
- インライン アセンブリ
asm volatile ("" : : : "memory");
- 本質的な
_ReadWriteBarrier();
簡単な説明がない場合は、良い記事や本へのリンクがあれば、おそらくそれを理解するのに役立つでしょう. 今までは、これらの呼び出しをラップする他の人が作成したオブジェクトを使用するだけで問題ありませんでしたが、基本的にメモリバリアを実装する方法は複数あるという現在の考え方よりもよく理解したいと思います。
multithreading - 2番目のスレッドが最初のスレッドの終了を待機する場合、メモリバリアは必要ですか?
スレッドがロックせずAlpha
に変数に書き込んでいると仮定します。A
2番目のスレッドBeta
は終了を待機してから、変数を順番にAlpha
読み取ります。A
中身A
が新鮮でない可能性はありますか?スレッドの有効期間を超えてメモリ書き込みを遅らせることはできますか?スレッドのAlpha
終了を待機する標準のメカニズムは、暗黙的にメモリバリアとして機能しませんか?
更新1
メモリバリアを含まない待機の例はありますか?
c - フラグを使用してスレッド間で通信する
インターネットでは、並列プログラミングでのキーワードの使用について多くの議論がありvolatile
、時には矛盾した議論があります。
このトピックに関するより信頼できる議論の1つは、ArchRobisonによるこの記事のようです。彼が使用している例は、あるスレッドから別のスレッドに値を渡すタスクです。
スレッド1は行列積を計算し、それをスレッド2に渡します。スレッド2はそれを使って他のことを行います。マトリックスは可変M
であり、フラグはvolatile
ポインターR
です。
- スレッド1は、行列積Mを乗算して計算し、RをMを指すようにアトミックに設定します。
- スレッド2は、R!= NULLになるまで待機してから、Mを係数として使用して別の行列積を計算します。
つまり、Mはメッセージであり、Rは準備完了フラグです。
著者は、Rを揮発性として宣言することで、スレッド1からスレッド2への変更を伝播する際の問題を解決できるが、これが発生したときにMの値がどうなるかについては保証しないと主張しています。そして、への割り当てR
とM
並べ替えることができます。したがって、両方M
をR
揮発性にするか、pthreadなどのライブラリで同期メカニズムを使用する必要があります。
私の質問は、Cで次のことを行う方法です
1)2つのスレッド間で単一のフラグを共有する方法-フラグをアトミックに割り当てる方法。他のスレッドが変更を確認し、他のスレッドの変更をテストすることを確認します。この場合、揮発性物質の使用は合法ですか?または、一部のライブラリは、おそらくメモリバリアを含む、概念的に優れた、またはより高速な方法を提供できますか?
2)Robisonの例を正しく実行する方法、つまり、マトリックスMをあるスレッドから別のスレッドに送信して安全に実行する方法(できればpthreadを使用して移植可能)