できますか原子的に増分値は、16ビットカウンターのx86/x86_64?
-
20-09-2019 - |
質問
ま保存したいメモリに変換し、既存の32ビットカウンターにおける16ビットカウンタです。このカウンターは原子的に増分/減.ばんこ
- どの指示はいつ使ったらよいでしたatomic_inc(uint16_t x)x86/x86_64?
- この信頼性マルチプロセッサーのx86/x86_64す。
- ある性能の罰金を支払うのいずれかにこれらのアーキテクチャのために?
- ある場合(3)何を期待される性能す。
さんのコメント!
解決
ここではスティーブのDelphiの答えに代わるものとして、GCCアセンブリの拡張子を使用しています一つです
uint16_t atomic_inc(uint16_t volatile* ptr)
{
uint16_t value(1);
__asm__("lock xadd %w0, %w1" : "+r" (value) : "m" (*ptr));
return ++value;
}
デクリメントするために、-1と1と++
と--
を変更します。
他のヒント
ここで働くDelphiの機能があります:
function LockedInc( var Target :WORD ) :WORD;
asm
mov ecx, eax
mov ax, 1
Lock xadd [ecx], ax
Inc eax
end;
私はあなたが必要とどの言語に変換することができると思います。
次のように
原子増加を実行する最も簡単な方法は、(これはインラインASM)である
asm
lock inc dword ptr Counter;
end;
Jは整数です。これは、直接そのメモリ位置にカウンターを増加します。
私は力ずくでこれをテストして、それが100%に動作します。
回答の質問:
- なるべく整理リストから2
- これがその信頼性、環境マルチプロセッサ
- あいの性能刑廃止
- の"ロック"プレフィックスのロックのバスのみならずプロセッサーはもちろん、外部ハードウェアをしたいといアクセスを経由のバスDMA(マスストレージ、グラフィックス...).でも遅いので、通常~100サイクルを引き起こす場合もあるより多額のコストがかかります。また"メガバイト"のカウンター、チャンス、直面するキャッシュ、その場合は、お待ちして~約100時計とにかく(メモリアクセス時間)の場合、ホームページへ戻るページの、数百に架からロックがどちらでも構いません。
所属していません StackOverflow