問題タブ [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.

0 投票する
3 に答える
9383 参照

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()) - しかし、それは別々に存在するので、確かにもっとあるはずですか?

0 投票する
2 に答える
366 参照

c# - CPUアーキテクチャに基づいて実行時に条件付きコードを持つことはできますか?

私は.Net4.5を使用しています(プレビュー... 4はこの質問の目的には問題ありません)。私は糸脱毛の仕事をしています。

私の調査によると、x86 CPUには強力なメモリモデルがあり、書き込みが並べ替えられないことを意味します。これにより、ロックを安全に解放できます。これは、メモリモデルが弱いItaniumCPUには当てはまりません。

揮発性、メモリバリア、および実行の並べ替えの原則を理解しています。

理想的には、CPUがItaniumの場合はキーポイントにメモリバリアを挿入しますが、x86の場合は挿入しません。JITが処理するランタイムコンパイラ指令のように、これを動的に行うことは可能ですか?

そうでない場合は、2つのプラットフォーム用に別々のビルドが必要になることに気付きました。その場合、2セットのC#ファイルを使用せずに、ターゲットを変更するだけでこれを行うための最も洗練された方法は何ですか?

0 投票する
2 に答える
245 参照

c# - 遅延読み込みと Thread.MemoryBarrier の使用

別のオブジェクトへの参照を持つクラスを設計する場合、参照されるオブジェクトを最初に使用するときにのみ作成することが有益な場合があります。たとえば、遅延読み込みを使用します。

私はよくこのパターンを使用して、遅延ロードされたプロパティを作成します。

次に、BCL のソース コードを参照しているときに、次のコードを見つけました。

私が知る限り、これらはどれもスレッドセーフではありません。たとえば、複数のEncodingオブジェクトを作成できます。Encoding私はそれを完全に理解しており、余分なオブジェクトが作成されても問題ないことを知っています。これは不変であり、まもなくガベージ コレクションになります。

Thread.MemoryBarrierただし、なぜが必要なのか、またマルチスレッド シナリオで 2 番目の実装が最初の実装とどのように異なるのかを理解したいと思っています。

明らかに、スレッドの安全性が懸念される場合、最適な実装はおそらく次を使用することLazy<T>です。

0 投票する
2 に答える
699 参照

c# - Thread.MemoryBarrier() についての説明が必要

重複の可能性:
Thread.MemoryBarrier() が必要な理由

O'Reilly の C# からの要約:

メソッド A と B が異なるスレッドで同時に実行されたとします。


著者は次のように述べています。「バリア 1 と 4 により、この例では「0」を書き込むことができなくなります。バリア 2 と 3 により、鮮度が保証されます。B が A の後に実行された場合、_complete の読み取りが true と評価されることが保証されます。」

私の質問は次のとおりです。

  1. バリア 4 が必要な理由 バリア1じゃ足りない?
  2. なぜ 2 と 3 が必要なのですか?
  3. 私が理解していることから、バリアは次の命令の後にその場所の前に命令を実行することを防ぎます、私は正しいですか?
0 投票する
1 に答える
1574 参照

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以上にすることはできないためです。

0 投票する
5 に答える
2215 参照

c# - これはThread.MemoryBarrier()の正しい使用法ですか?

ループの実行を制御するフィールドがあると仮定します。

そして、次のようなコードを持つスレッドを実行しています。

これで、同期メカニズムを使用せずに、別のスレッドがに設定さshouldRunれる可能性があります。false

Thread.MemoryBarrier()を理解している限り、whileループ内にこの呼び出しを含めると、作業スレッドがキャッシュされたバージョンのを取得できなくなりshouldRun、無限ループが発生するのを効果的に防ぐことができます。

Thread.MemoryBarrierについての私の理解は正しいですか?変数を設定できるスレッドがある場合(これは簡単に変更できません)、これは、スレッドによってfalseに設定されるshouldRunと、ループが確実に停止するようにするための合理的な方法ですか?shouldRun

0 投票する
3 に答える
13435 参照

c++ - 共有メモリへのアトミック アクセス

特定の方法でメモリを解釈する複数のプロセス間で共有メモリがあります。元:

私が望むのは、カウンターがアトミックに更新/インクリメントされることです。そして、そのアドレスでメモリ解放が行われるようにします。たとえば、共有メモリを使用していない場合は、次のようになります

ランダムなメモリ位置でこれを達成するにはどうすればよいですか (上記の DataBlock カウンターであると解釈されます)。アーキテクチャ (x86 Linux) の要求に応じてアドレスが整列されていることを保証できます。

  1. 更新をアトミックにする - どうやって?(つまり、atomicupdate(addr, newvalue))
  2. マルチコアのメモリ同期 - (つまり、memorysync(addr)) - 私が見ることができる唯一の方法は、 std::atomic_thread_fence(std::memory_order_release) を使用することです - しかし、これは「すべてのアトミックストアとリラックスしたアトミックストアのメモリ同期順序を確立します」 - それは私にとってはやり過ぎです-カウンターの場所を同期させたいだけです。どんな考えでも感謝します。
0 投票する
2 に答える
10490 参照

c++ - Atomics 用の C++ メモリ バリア

これに関しては、私は初心者です。次のメモリバリアの違いを簡単に説明できる人はいますか?

  • MemoryBarrier();
  • フェンス_mm_mfence();
  • インライン アセンブリasm volatile ("" : : : "memory");
  • 本質的な_ReadWriteBarrier();

簡単な説明がない場合は、良い記事や本へのリンクがあれば、おそらくそれを理解するのに役立つでしょう. 今までは、これらの呼び出しをラップする他の人が作成したオブジェクトを使用するだけで問題ありませんでしたが、基本的にメモリバリアを実装する方法は複数あるという現在の考え方よりもよく理解したいと思います。

0 投票する
3 に答える
789 参照

multithreading - 2番目のスレッドが最初のスレッドの終了を待機する場合、メモリバリアは必要ですか?

スレッドがロックせずAlphaに変数に書き込んでいると仮定します。A2番目のスレッドBetaは終了を待機してから、変数を順番にAlpha読み取ります。A

中身Aが新鮮でない可能性はありますか?スレッドの有効期間を超えてメモリ書き込みを遅らせることはできますか?スレッドのAlpha終了を待機する標準のメカニズムは、暗黙的にメモリバリアとして機能しませんか?

更新1

メモリバリアを含まない待機の例はありますか?

0 投票する
4 に答える
1502 参照

c - フラグを使用してスレッド間で通信する

インターネットでは、並列プログラミングでのキーワードの使用について多くの議論がありvolatile、時には矛盾した議論があります。

このトピックに関するより信頼できる議論の1つは、ArchRobisonによるこの記事のようです。彼が使用している例は、あるスレッドから別のスレッドに値を渡すタスクです。

スレッド1は行列積を計算し、それをスレッド2に渡します。スレッド2はそれを使って他のことを行います。マトリックスは可変Mであり、フラグはvolatileポインターRです。

  1. スレッド1は、行列積Mを乗算して計算し、RをMを指すようにアトミックに設定します。
  2. スレッド2は、R!= NULLになるまで待機してから、Mを係数として使用して別の行列積を計算します。

つまり、Mはメッセージであり、Rは準備完了フラグです。

著者は、Rを揮発性として宣言することで、スレッド1からスレッド2への変更を伝播する際の問題を解決できるが、これが発生したときにMの値がどうなるかについては保証しないと主張しています。そして、への割り当てRM並べ替えることができます。したがって、両方MR揮発性にするか、pthreadなどのライブラリで同期メカニズムを使用する必要があります。

私の質問は、Cで次のことを行う方法です

1)2つのスレッド間で単一のフラグを共有する方法-フラグをアトミックに割り当てる方法。他のスレッドが変更を確認し、他のスレッドの変更をテストすることを確認します。この場合、揮発性物質の使用は合法ですか?または、一部のライブラリは、おそらくメモリバリアを含む、概念的に優れた、またはより高速な方法を提供できますか?

2)Robisonの例を正しく実行する方法、つまり、マトリックスMをあるスレッドから別のスレッドに送信して安全に実行する方法(できればpthreadを使用して移植可能)