4

私のコードは以下のように単純です。読み取りと書き込み用のrmbwmbを見つけましたが、一般的なものは見つかりませんでした。lwsyncはPowerPCで利用できますが、x86の代わりとなるものは何ですか?よろしくお願いします。

#define barrier() __asm__ volatile ("lwsync")
...
    lock()
    if(!pInst);
    {
        T* temp=new T;
        barrier();
        pInst=temp;
    }
    unlock();
4

3 に答える 3

2

rmb()および wmb() は Linux カーネル関数です。もありmb()ます。

x86 命令はlfence、、、sfenceおよびmfence、IIRC です。

于 2010-08-15T22:46:04.673 に答える
0

Cilkランタイムには、興味深いと思われる特定のファイルがあります。つまり、cilk-sysdep.hには、メモリバリアを含むシステム固有のマッピングが含まれています。x86、つまりi386に関する質問の小さなセクションを抽出します

    ファイル:-cilk-sysdep.h(LHSの番号は実際には行番号です)

    252 * xchg命令を使用して、メモリアクセスをシリアル化します。
    253 * Intel ArchitectureSoftwareDeveloper'sに従って実行されます
    254 *マニュアル、第3巻:システムプログラミングガイド
    255 *(http://www.intel.com/design/pro/manuals/243192.htm)、7-6ページ、
    256 * "P6ファミリプロセッサの場合、ロックされた操作はすべてをシリアル化します
    257 *未処理のロードおよびストア操作(つまり、それらが実行されるのを待つ)
    258 *完了)。 "xchg命令は、によってロックされた操作です。
    259*デフォルト。推奨されるメモリバリアはcpuidであることに注意してください
    260 *命令、これは本当に遅い(〜70サイクル)。対照的に、
    261 * xchgはわずか約23サイクルです(さらに、書き込みバッファーごとに数サイクルです)
    262 *エントリ?)。まだ遅いですが、私が見つけることができる最高のものです。-KHR
    263 *
    264 * Bradleyも「mfence」のタイミングを設定し、PentiumIVではxchglはまだかなり高速です
    265*mfenceは2.5GHZP4で約125nsかかるようです
    266*xchglは2.5GHZP4で約90nsかかるようです
    267 *ただし、Opteronでは、mfenceとxchglのパフォーマンスはどちらも* MUCH MUCHBETTER*です。
    268 * mfenceは1.5GHZAMD64で8nsかかります(多分これは801です)
    269*フェンスは5nsかかります
    270*lfenceは3nsかかります
    271*xchglは14nsかかります
    272*mfence-benchmark.cを参照
    273 * /
    274 int x = 0、y;
    275 __asm__ volatile( "xchgl%0、%1": "= r"(x): "m"(y)、 "0"(x): "memory");
    276}

私がこれについて気に入ったのは、xchglの方が速いように見えるという事実です:)実際にそれらを実装してチェックする必要があります。

于 2011-08-24T03:48:28.707 に答える
0

このコードでは、ロックとロック解除が正確にはわかりません。それらはミューテックス操作であると推測しています。powerpc では、mutex 取得関数は isync を使用し (ハードウェアが lock() の前に if (!pInst) を評価する可能性があります)、unlock() に lwsync (または、mutex 実装が古い場合は sync) があります。 .

したがって、pInst へのすべてのアクセス (読み取りと書き込みの両方) がロックおよびロック解除メソッドによって保護されていると仮定すると、バリアの使用は冗長になります。ロック解除には、ロック解除操作が完了する前に pInst ストアが確実に見えるようにするための十分なバリアがあります (同じロックが使用されていると仮定して、後続のロックの取得後に pInst ストアが見えるようになります)。

x86 および x64 では、lock() は何らかの形式の LOCK プレフィックス付き命令を使用し、自動的に双方向フェンシング動作を行います。

x86 および x64 でのロック解除はストア命令のみである必要があります (CS 内で特別な文字列命令を使用しない限り、その場合は SFENCE が必要になります)。

マニュアル:

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

すべてのフェンスと LOCK 接頭辞の効果 (およびそれが暗示される場合) に関する優れた情報があります。

ps。ロック解除コードには、コンパイラの順序付けを強制するものも必要です (ストア ゼロの場合は、GCC スタイルのasm _ volatile _ ( "" ::: "memory" )のようなものも必要になります)。 )。

于 2012-01-27T19:36:33.347 に答える