問題タブ [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.
c - メモリバリアとキャッシュフラッシュ
キャッシュフラッシュがあってもメモリバリアが実装されているアーチはありますか? メモリバリアは CPU の並べ替えにのみ影響することを読みましたが、メモリバリアに関連するステートメントを読みました:すべての cpu が値を確認できるようにします...、しかし私にとっては、キャッシュのフラッシュ/無効化を意味します。
c++ - C++ のメモリバリアの例は何ですか?
C++11 のミューテックス ロックはvoid lock() volatile
. コンパイラはどの関数がメモリ バリアであり、どの関数がそうでないかをどのように判断しますか? 揮発性でなくても、すべての関数はバリアですか? あまり知られていない記憶障害と、誰もが知っておくべき記憶障害とは?
x86 - メモリの並べ替え: 以前のストアを使用して、別の包括的な場所にロードを並べ替えることができますか?
intel のプロセッサ マニュアル:セクション 8.2.3.4 のリンクでは、ロードは以前のストアを別の場所に並べ替えることができるが、以前のストアを同じ場所に並べ替えることができないと記載されています。
したがって、次の 2 つの操作を並べ替えることができることを理解しています。
また、次の 2 つの操作は順序を変更できません。
しかし、ストアとロードが別の場所にある場合、ロードはストアを完全に取り囲んでいます。たとえば、次のようになります。
では、この場合の 'y' は 0 にできますか?
編集(@Hans Passant) 状況をさらに説明するために、この手法を使用して、ロックされた命令を使用せずにスレッド間の一種の準同期を考案できるかどうかを確認しようとしています。
したがって、グローバル変数が与えられた場合のより具体的な質問は次のとおりです。
そして、次のコードを実行する 2 つのスレッド:
スレッド 1:
スレッド 2:
両方のスレッドで 'y' を 1 にすることはできますか?
注: __builtin_popcountl は、変数に設定されたビット数をカウントする組み込みの gcc 組み込み関数です。
c - コンパイラ レベルおよびハードウェア レベルでのメモリ フェンシング
ここでメモリフェンシングについて読みました...そして、それについて少し説明が必要です
asm volatile ("" : : : "メモリ")
これにより、コンパイラ レベルのメモリ フェンスが提供され、プロセッサはこれを使用しても並べ替えを実行できます。
同様の命令でコンパイラレベルのフェンシングとプロセッサレベルのフェンシングの両方を達成できる方法はありますか?
私は遭遇しました、
asm volatile("sfence" : : : "メモリ")
これは何をしますか?コンパイラ レベルのストア フェンシングのみを提供しますか?
これに関する情報は非常に役立ちます。
ありがとう
c++ - 最速のインラインアセンブリスピンロック
パフォーマンスが重要なC++でマルチスレッドアプリケーションを作成しています。スレッド間で小さな構造をコピーするときは、多くのロックを使用する必要があります。このため、スピンロックを使用することを選択しました。
私はこれについていくつかの調査と速度テストを行いましたが、ほとんどの実装はほぼ同じくらい高速であることがわかりました。
- SpinCountが1000に設定されたMicrosoftのCRITICAL_SECTIONは、約140時間単位をスコアリングします
- このアルゴリズムをMicrosoftのInterlockedCompareExchangeスコアで実装すると、約95時間単位になります。
- また、このコード
__asm {}
のようなものを使用してインラインアセンブリを使用しようとしましたが、スコアは約70時間単位ですが、適切なメモリバリアが作成されているかどうかはわかりません。
編集:ここに示されている時間は、2つのスレッドがスピンロックを1,000,000回ロックおよびロック解除するのにかかる時間です。
これは大きな違いではないことは知っていますが、スピンロックは頻繁に使用されるオブジェクトであるため、プログラマーはスピンロックを作成するための可能な限り最速の方法に同意したと思います。しかし、それをグーグルすると、多くの異なるアプローチにつながります。この前述の方法CMPXCHG8B
は、 32ビットレジスタを比較する代わりにインラインアセンブリと命令を使用して実装した場合に最速になると思います。さらに、メモリバリアを考慮に入れる必要があります。これは、コア間の共有メモリに対する「排他的権利」を保証するLOCK CMPXHG8B(私は思いますか?)によって行うことができます。ついに[いくつかの提案]忙しい待ち時間にはNOP:REPを伴うべきだとこれにより、ハイパースレッディングプロセッサが別のスレッドに切り替えることができるようになりますが、これが正しいかどうかはわかりません。
さまざまなスピンロックのパフォーマンステストから、大きな違いはないことがわかりますが、純粋に学術的な目的のために、どれが最も速いかを知りたいと思います。ただし、アセンブリ言語とメモリバリアの経験は非常に限られているため、次のテンプレートでLOCKCMPXCHG8Bと適切なメモリバリアを使用して提供した最後の例のアセンブリコードを誰かが記述できれば幸いです。
gcc - mfence と asm volatile の違い ("" : : : "memory")
私が理解している限り、mfence
はハードウェア メモリ バリアasm volatile ("" : : : "memory")
ですが、 はコンパイラ バリアです。ただし、asm volatile ("" : : : "memory")
mfence の代わりに使用できます。
私が混乱した理由はこのリンクです
c - ロックフリー キューでのメモリ バリアの使用
私は最近、Paul McKenney の 2010 年のホワイト ペーパー「Memory Barriers: a Hardware View for Software Hackers」を読みました。
特にメモリとコンパイラのバリアに関して、M&S キュー エンキュー関数を実装する、以下に示す C コードの小さなセクションに関するフィードバック/コメント/ガイダンスを非常に高く評価します。
このコードはポインターとカウンターのペアを使用してABAを処理しており、この投稿のために、x86/x64 専用に記述されていると見なす必要があります。
インライン コメントはすべて、この投稿のために現在書かれており、現在私が考えていることを表現しているという点で、この投稿の一部です。
簡潔にするために、アサートのコードと構造体のキャッシュ ライン パディングなどを削除しました。
現在、コードはかなり壊れていると思いますが、正しい理由でそう考えていることを確認したいと思います。
c# - スレッドに参加するときにメモリバリアが必要ですか?
スレッド A が、変数 V への書き込みのみを目的として別のスレッド B を生成し、それが終了するのを待つ場合、スレッド A での V の後続の読み取りが新鮮であることを保証するためにメモリバリアが必要ですか? 終了/参加操作にそれらを冗長にする暗黙の障壁があるかどうかはわかりません。
次に例を示します。
上記のスニペットのバリアのいずれかまたは両方 (またはそれ以上) が必要ですか?
c - TMS320F2812 DSP のメモリ バリアを作成するにはどうすればよいですか?
TI C/C++ コンパイラ v6.1 ユーザー ガイド ( spru514e ) を調べましたが、何も見つかりませんでした。
asm
ステートメントはこの点に関して何も提供していないようです.マニュアルは変数の値を変更することに対してさえ警告しています(p132) 。変数への影響を宣言するための GNU 拡張機能は実装されていません (p115)。
また、メモリ バリアの組み込みも見つかりませんでした ( __memory_changed()
Keil の armcc のように)。
Web や TI フォーラムを検索しても何も見つかりませんでした。
続行する方法について他のヒントはありますか?
synchronization - スレッド同期: 書き込みの可視性を保証する方法
ソフトウェアとハードウェアのメモリ モデル、メモリ フェンス、ストア/ロードの再順序付けなどに関する情報はすでにたくさんあります。ただし、共有メモリに対する読み取りと書き込みの相対的な順序を保証することに焦点を当てているようです。
そのようなシステムがスレッドの書き込みを潜在的に長い時間遅らせることは合法的な振る舞いでしょうか?
たとえば、メモリ内のデータ構造を更新し、他のスレッドに更新を通知するフラグを立てるスレッドを考えてみましょう。
私が読んだほとんどのメモリ モデルによると、メモリ バリアは、古い値 1、2、または 3 を読み取っている間、他のスレッドが dataWritten を true として監視できないことを保証します。つまり、これらの書き込みをアトミックにします。
しかし、書き込みがまったく見られると確信できますか? フラグが値よりも早く書き込まれない限り、メモリ モデルの下で書き込みを無期限に遅らせることは合法でしょうか?
データベース用語では、メモリ モデルを使用して耐久性を判断できますか (上記の例のようにメモリ フェンスとフラグを使用して保証できるアトミック性と一貫性に加えて)。
更新: 可視性の適時性に関する volatile の詳細なセマンティクスは、Java メモリ モデルとメモリ モデルの順序と可視性のコンテキストで同じトピックを扱いますか? C++11 用。その議論はハードウェア メモリ モデルにも適用されますか。つまり、CPU ISA は正しい可視性シーケンスをハードに保証するだけで、遅延可視性を「ソフト」に保証しますか?