3

Intel では、CMPXCHG への引数はキャッシュ ラインにアラインされている必要があります (Intel は MESI を使用して CAS を実装しているため)。

ARM では、ldrex と strex は排他予約グラニュアルで動作します。

明確にするために、これはARM上で操作対象のデータをキャッシュラインに揃える必要がないことを意味しますか?

4

3 に答える 3

2

排他的アクセス制限

排他的アクセスには、次の制限が適用されます。

• 特定の ID を持つ排他的書き込みのサイズと長さは、同じ ID を持つ先行する排他的読み取りのサイズと長さと同じでなければなりません。

• 排他アクセスのアドレスは、トランザクション内の合計バイト数に合わせる必要があります。

• 排他的読み出しと排他的書き込みのアドレスは同一でなければなりません。

• 排他的アクセスの読み取り部分の ARID フィールドは、書き込み部分の AWID と一致する必要があります。

• 排他的アクセスの読み取り部分と書き込み部分の制御信号は同一でなければなりません。

• 排他的アクセス バーストで転送されるバイト数は、2 の累乗、つまり 1、2、4、8、16、32、64、または 128 バイトでなければなりません。

• 排他的バーストで転送できる最大バイト数は 128 です。

• ARCACHE[3:0] または AWCACHE[3:0] 信号の値は、排他アクセスを監視しているスレーブがトランザクションを認識できることを保証する必要があります。たとえば、スレーブによって監視されている排他的アクセスには、トランザクションがキャッシュ可能であることを示す ARCACHE[3:0] または AWCACHE[3:0] の値があってはなりません。

これらの制限を守らないと、予期しない動作が発生します。

上記は AMBA/AXI 仕様からのものです。一部のベンダーでは AWLOCK/ARLOCK が無視されていることがわかります (つまり、ldrex/strex はコアの外では機能しません)。これを示すコードがいくつかあります。排他的アクセスをサポートしていないシステムが見つかった場合は、少なくともそうします。

https://github.com/dwelch67/raspberrypi/tree/master/extest

タスクと移植性に応じて、ifdef で囲まれた swp および ldrex/strex ソリューションを提供する必要がある場合や、利用可能な多数のレジスタ (ランタイム) を使用して、コアでサポートされている命令とサポートされていない命令を通知する必要がある場合があります。あなたは走っています。(少なくとも 1 つのケースでは、swp も ldrex/strex もサポートされていない場合があります)。

于 2012-07-08T15:32:03.790 に答える
1

It says so right in the ARM Architecture Reference Manual A.3.2.1 "Unaligned data access". LDREX and STREX require word alignment. Which makes sense, because an unaligned data access can span exclusive reservation granules.

于 2012-07-08T14:04:56.110 に答える
1

Intel では、CMPXCHG への引数をキャッシュに合わせる必要はありません。試してみてください。うまくいくことがわかります。

しかし、あなたは正しいです。キャッシュ可能なメモリでは、Intel はキャッシュ プロトコルを使用して CMPXCHG を実装します。したがって、使用率の高い 2 つの独立した同期変数を同じキャッシュ ラインに配置しない方が賢明です。2 つのプロセッサがこれらの異なる変数を使用して同期している場合、キャッシュ ラインが前後にスラッシングする可能性があるからです。しかし、これは他のデータとまったく同じ問題です。異なるプロセッサが同時に同じキャッシュラインに書き込むことはできません。偽の共有。

しかし、ライン アラインされたロックをキャッシュすることはできません。

struct Foo {
  int data;
  Lock lock;
  int data_after;
};

同じキャッシュラインに異なるロックを配置できます。

struct Foo {
  int data;
  Lock read_lock;
  int data_between;
  Lock write_lock;
  int data_after;
};

読み取りと書き込みは相互に排他的である傾向があるため、損失はない可能性があります。

同じキャッシュラインに異なるロックを配置できます。

struct Foo {
  int data;
  Lock read_lock;
  int data_between;
  Lock write_lock;
  int data_after;
};

ちなみに、キャッシュされていないメモリでは、Intel は CMPXCHG のようなアトミック操作にキャッシュ スヌーピング プロトコルを使用しません。そのため、ライン アライン同期変数をキャッシュする理由はほとんどありません。多くのメモリ サブシステムは、キャッシュされていない場合でも、キャッシュライン サイズによってインターリーブします。

ARM に関しては、ほとんど同じです。

スヌーピー バスまたはキャッシュされていないバスでは、キャッシュ ラインのアラインメントについてあまり心配する必要はないかもしれません。

しかし、クラスター化されたキャッシュ階層では、x86 とまったく同じ問題があります。さらに、実際には、CMPXCHG のような操作を「エクスポート」する方法はよく知られていますが、ARM ldrexd/strexd はそうではありません。

于 2013-07-18T00:37:23.807 に答える