27

ロックフリー/ウェイトフリー アルゴリズムについて調査を行っているときに、誤った共有の問題に遭遇しました。もう少し掘り下げていくと、Folly のソース コード (Facebook の C++ ライブラリ) にたどり着きました。具体的には、このヘッダー ファイルFOLLY_ALIGN_TO_AVOID_FALSE_SHARINGマクロの定義 (現在は 130 行目) にたどり着きました。一見して最も驚いたのは、値が128 (つまり、64 ではなく) であるということでした...

/// An attribute that will cause a variable or field to be aligned so that
/// it doesn't have false sharing with anything at a smaller memory address.
#define FOLLY_ALIGN_TO_AVOID_FALSE_SHARING __attribute__((__aligned__(128)))

私の知る限り、最新の CPU のキャッシュ ブロックの長さは 64 バイトであり、実際には、Intel からのこの記事を含め、これまでに見つけたすべてのリソースで、64 バイトのアラインメントパディングについて説明されており、フォールス シェアリングを回避するのに役立ちます。

それでも、Facebook の人々は、必要に応じて、クラス メンバーを 128 バイトに調整およびパディングします。FOLLY_ALIGN_TO_AVOID_FALSE_SHARING次に、の定義のすぐ上にある説明の始まりを見つけました。

enum {
    /// Memory locations on the same cache line are subject to false
    /// sharing, which is very bad for performance.  Microbenchmarks
    /// indicate that pairs of cache lines also see interference under
    /// heavy use of atomic operations (observed for atomic increment on
    /// Sandy Bridge).  See FOLLY_ALIGN_TO_AVOID_FALSE_SHARING
    kFalseSharingRange = 128
};

もう少し詳細が得られますが、まだいくつかの洞察が必要だと感じています. アトミック操作を多用すると、隣接するキャッシュ ラインの同期、またはそれらに対する RMW 操作がどのように相互に干渉するかについて興味があります。 誰かがこれがどのように起こる可能性があるかについて私に教えてもらえますか?

4

3 に答える 3

5

Hans がコメントで指摘したように、これに関するいくつかの情報は、「Intel® 64 および IA-32 アーキテクチャー最適化リファレンス マニュアル」のセクション 3.7.3「第 2 レベル キャッシュのハードウェア プリフェッチ」、Intel Core マイクロアーキテクチャーに記載されています。 :

「ストリーマー — メモリから第 2 レベルのキャッシュにデータまたは命令をロードします。ストリーマーを使用するには、データまたは命令を 128 バイトのブロックに編成し、128 バイトに配置します。このブロック内の 2 つのキャッシュ ラインのいずれかに最初にアクセスすると、メモリ内にある間に、ストリーマーがペア ラインをプリフェッチするようにトリガーします。」

于 2019-04-14T08:52:45.223 に答える
0

Intel は 64 バイトのキャッシュ ラインを使用していますが、他にも 128 バイトのキャッシュ ラインを使用するさまざまなアーキテクチャがあるようです。たとえば、次のようになります。

http://goo.gl/8L6cUl

Power Systems は、128 バイト長のキャッシュ ラインを使用します。Intel プロセッサ (64 バイトのキャッシュ ライン) と比較して、これらのより大きなキャッシュ ラインは...

私は、他のアーキテクチャ、古いものであっても同じことをするというメモをインターネットのあちこちに散らばっていることを発見しました:

http://goo.gl/iNAZlX

Origin コンピュータの SGI MIPS R10000 プロセッサ

プロセッサのキャッシュ ライン サイズは 128 バイトです。

したがって、おそらく Facebook のプログラマーは安全にプレイしたいと考え、プロセッサ アーキテクチャに基づいた#define/の大きなコレクションを持ちたくありませんでした。一部の新しい Intel プロセッサには 128 バイトのキャッシュ ラインがあり、誰もコードを修正することを覚えていないというリスクがありました。#if

于 2015-03-23T06:17:16.203 に答える
-1

アトミック操作を使用するかどうかに関係なく、キャッシュには、キャッシュが動作する最小単位である「キャッシュライン」があります。これは、プロセッサのモデルに応じて、32 ~ 128 バイトの範囲です。偽の共有とは、同じキャッシュライン内の要素が異なるスレッド (異なるプロセッサで実行される [1]) 間で「共有」される場合です。これが発生すると、1 つのプロセッサが「その値」を更新すると、他のすべてのプロセッサがそのデータの「そのコピーを取り除く」ように強制されます。アトミック操作の場合はさらに悪化します。アトミック操作を実行するには、操作を実行するプロセッサが値を更新する前に、他のすべてのプロセッサが「それらのコピー」を削除していることを確認する必要があるためです (他のプロセッサが値を使用していないことを確認するため)。古い"

したがって、パフォーマンスの観点から、1 つのスレッドで使用される変数がある場合は、データをそれに合わせて、それらを独自のキャッシュラインに分離します (元の投稿の例では、これは 128 バイトであると想定されています)。値 - データの各塊が偶数のキャッシュライン境界で始まり、他のプロセッサが同じデータを「共有」しないことを意味します (スレッド間でデータを本当に共有している場合を除きます - その時点で、関連するキャッシュのメンテナンスを行う必要があります)プロセッサ間でデータが正しく更新されるようにするため)

[1] または、複数のコアを備えた最新の CPU のプロセッサ コア。簡単にするために、「プロセッサ」または「プロセッサ」という用語を使用して、実際のプロセッサ ソケットまたは 1 つのソケット内のプロセッサ コアに対応させました。この議論では、区別はほとんど関係ありません。

于 2015-03-22T21:23:42.843 に答える