2

既存の 32 ビット カウンターを 16 ビット カウンターに変換してメモリを節約したいと考えています。このカウンターは、アトミックにインクリメント/デクリメントされます。私がこれを行う場合:

  1. x86/x86_64 での atom_inc(uint16_t x) にはどの命令を使用しますか?
  2. これは、マルチプロセッサ x86/x86_64 マシンで信頼できますか?
  3. これを行うために、これらのアーキテクチャのいずれかに支払うパフォーマンスのペナルティはありますか?
  4. (3) で「はい」の場合、予想されるパフォーマンスの低下はどれくらいですか?

コメントしてくれてありがとう!

4

4 に答える 4

4

これは、Steve の 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 に、++--, デクリメントに変更します。

于 2009-10-09T06:25:27.990 に答える
3

動作する Delphi 関数は次のとおりです。

function LockedInc( var Target :WORD ) :WORD;
asm
        mov     ecx, eax
        mov     ax, 1
   Lock xadd    [ecx], ax
        Inc     eax
end;

必要な言語に変換できると思います。

于 2009-10-09T06:13:13.107 に答える
0

アトミックな増加を実行する最も簡単な方法は次のとおりです (これはインライン ASM です)。

asm
  lock inc dword ptr Counter;
end;

ここで、J は整数です。これにより、メモリの場所で Counter が直接増加します。

これを力ずくでテストしたところ、100% 動作します。

于 2010-07-28T02:34:55.703 に答える
-1

他の 3 つの質問に答えるには:

  1. 2 から始まる番号付きリストを作成する方法が見つかりませんでした
  2. はい、これはマルチプロセッサ環境で信頼できます
  3. はい、パフォーマンスのペナルティがあります
  4. 「ロック」プレフィックスは、プロセッサだけでなく、DMA (マスストレージ、グラフィックスなど) 経由でバスにアクセスする可能性のある外部ハードウェアに対しても、バスをロックします。そのため、通常は 100 クロック サイクルほど遅くなりますが、コストが高くなる可能性があります。しかし、「メガバイト」のカウンターがある場合、キャッシュ ミスに直面する可能性があります。この場合、約 100 クロック (メモリ アクセス時間)、ページ ミスの場合、数100 であるため、ロックによるオーバーヘッドは問題にならない可能性があります。
于 2009-10-09T09:13:20.403 に答える