質問

参照カウントを使用して管理し、SMP システム上のスレッド間で共有したい不変のデータ構造がいくつかあります。

リリースコードは次のようになります。

void avocado_release(struct avocado *p)
{
    if (atomic_dec(p->refcount) == 0) {
        free(p->pit);
        free(p->juicy_innards);
        free(p);
    }
}

する atomic_dec メモリバリアが必要ですか?もしそうなら、どのような記憶障壁があるのでしょうか?

その他の注意事項:アプリケーションは PowerPC および x86 上で実行する必要があるため、プロセッサ固有の情報は歓迎されます。GCC アトミック組み込み関数についてはすでに知っています。不変性に関しては、refcount は のみ オブジェクトの継続時間とともに変化するフィールド。

役に立ちましたか?

解決

x86 では、次のようなロック接頭辞付きのアセンブリ命令に変わります。 LOCK XADD.
単一の命令であるため、中断はありません。追加の「機能」として、ロック プレフィックスにより完全なメモリ バリアが生成されます。

「...ロックされた操作は、すべての未解決の負荷と保存操作をシリアル化します(つまり、それらが完了するのを待ちます)。」 ...「ロックされた操作は、他のすべてのメモリ操作およびすべての外部から表示されるイベントに関してアトミックです。ロックされた命令を渡すことができるのは、命令フェッチとページ テーブル アクセスのみです。ロックされた命令は、あるプロセッサによって書き込まれたデータと別のプロセッサによって読み取られたデータを同期するために使用できます。" - インテル® 64 および IA-32 アーキテクチャー ソフトウェア開発者マニュアル, 、第8.1.2章。

メモリバリアは実際にはダミーとして実装されています LOCK OR または LOCK AND 両者に ネット そして Java JIT x86/x64 上。
つまり、好むと好まざるにかかわらず、追加のボーナスとして x86 で完全なフェンスが得られます。:)

PPC では異なります。アン LL/SC ペア - lwarx & stwcx - 内部に減算を使用すると、メモリ オペランドをレジスタにロードし、1 を減算し、ターゲットの場所に他にストアがない場合はそれを書き戻すか、存在する場合はループ全体を再試行するために使用できます。LL/SC は中断できます。
また、自動フルフェンスというわけでもありません。
ただし、これによってカウンタの原子性が損なわれることはまったくありません。
これは、x86 の場合、たまたまフェンスも「無料」で入手できることを意味します。
PPC では、 (lw)sync 命令.

全体として、アトミック カウンタが適切に動作するために明示的なメモリ バリアは必要ありません。

他のヒント

これは、原子アクセス(リード/変更すること/ 1原子単位として価値が実行の書き込みを保証する)とメモリ並べ替えを区別することが重要である。

メモリの障壁は、並べ替えの防止は、読み取りと書き込みや並べ替えがアトミックに完全に直交しています。例えば、PowerPCであなたが最も効率的なアトミックインクリメントを実装する場合、それは並べ替え防ぐことはできません。あなたが並べ替えないようにしたいなら、あなたはlwsyncまたはsync命令、またはいくつかの同等のハイレベル(C ++ 11?)メモリバリアを必要とします。

「問題のある方法で物事を並べ替えるコンパイラの可能性は、」コンパイラの最適化は非常に驚くべきことであり、ことができるため、一般的な記述としてナイーブ思えない存在であると主張しているので、CPUの(PowerPCの/ ARM /アルファ/特にMIPS)積極的にリオーダーメモリ操作をます。

Aコヒーレントキャッシュどちらかを保存しません。メモリの並べ替えが実際にどのように動作するかを確認するために http://preshing.com/ のを参照してください。

この場合は、しかし、私は答えは何の障壁が必要とされないことであると信じています。この特定の場合(参照カウント)の参照カウントとオブジェクト内の他の値との関係を必要としないからです。参照カウントがゼロに当たったとき、唯一の例外はあります。その時点ではリード取得障壁がが必要であるかもしれないので、他のスレッドからのすべての更新は、現在のスレッドに表示されていることを確認することが重要である。

あなたがあなた自身のatomic_decを実装しようとしているか、あなたはちょうどあなたが好きなシステムが提供する機能は動作しますか疑問に思っていますか?

一般的なルールとして、システムで提供されるアトミックインクリメント/デクリメント施設がちょうど正しいことを行うために必要なものは何でもメモリの障壁が適用されます。あなたがあなた自身のロックフリーのデータ構造やSTMライブラリを実装するようなものの奇抜をやっていない限り、あなたは一般的にメモリバリアを心配する必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top