6


2

同じオブジェクトから複数のスレッドを読み取っても安全であることをVisual Cのドキュメントで読みました。

私の質問は、複数のコアを持つX86-64 CPUはこれをどのように処理するのですか?

1 MBのメモリブロックがあるとします。 異なるスレッドが文字通りまったく同じデータを同時に読み取ることができますか?それとも1つのコアだけが一度に特定のワードを読み取ることを許可されている状態でコアは一度に1ワードを読み取ることができますか?

2 Answer


10


1MBブロックに書き込みが実際にない場合は、書き込みはコミットされず、したがってキャッシュコヒーレンシ問題は発生しないため、各コアは問題なく独自のキャッシュラインから読み取ることができます。

マルチコアアーキテクチャでは、基本的に各コア用のキャッシュと、最新の情報を持っていない一部のコアでキャッシュを無効にする「キャッシュコヒーレンスプロトコル」があります。 私はほとんどのプロセッサがキャッシュコヒーレンシのために MOESI protocolを実装していると思います。

キャッシュコヒーレンシは、主に議論されてきた複雑なトピックです(Joe Duffyによる記事が特に好きです。 .bluebytesoftware.com / blog / 2006/01/26 / BrokenVariantsOnDoublecheckedLocking.aspx [ここ]。 それにもかかわらず、議論は、明らかにロックフリーであるが、プロセッサキャッシュ間のコヒーレンシを維持するためにキャッシュコヒーレンシプロトコルがキックインするために遅くなる可能性があるコードのパフォーマンスペナルティを中心に展開します。一貫性を維持するため、パフォーマンスが低下しません。

明確にするために、コメントで述べたように、x86とx64アーキテクチャは SMPでコア間で共有される単一のバスを実装しているので、RAMに同時にアクセスすることはできませんメインメモリにアクセスする公平性 それにもかかわらず、この状況は各コアがデータのそれ自身のコピーを持つことを可能にする各コアキャッシュによって隠されています。 1MBのデータの場合、コアがキャッシュを更新している間に何らかの競合が発生する可能性がありますが、それはごくわずかです。

いくつかの便利なリンク:


5


異なるコアが同じメモリブロックから読み取ることができるだけでなく、同時に書き込むこともできます。 それが「安全」かどうかは、まったく別の話です。 あなたが特別に許さない方法で同じメモリブロックをめぐって戦う複数のコアから守るためにあなたはあなたのコード(ある種のセマフォかそれらの派生物で通常行われる)にある種の保護を実装する必要があります。

コアが一度に読み取るメモリのサイズについて、それは通常レジスタの価値、32ビットCPUの場合は32ビット、64ビットCPUの場合は64ビットなどです。 ストリーミングもdwordごとに行われます(例えばmemcpyを見てください)。

実際の同時マルチコアとは、すべてのコアが単一のバスを使用してメモリの読み書きを行うため、すべてのリソース(RAM、外部デバイス、浮動小数点処理ユニット)へのアクセスは一度に1つの要求、一度に1つのコアです。 。 しかし、コア内部の実際の処理は完全に並行しています。 DMA転送もバスをブロックせず、並行転送は一度に1つずつキューに入れられ処理されます(100%確実ではないと思います)。

編集:明確にするために、ここでの他の回答とは異なり、私はノーキャッシュのシナリオについてだけ話しています。 もちろん、メモリがキャッシュされている場合、読み取り専用アクセスは完全に同時です。