2009-11-03 12 views
6

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

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

1 MBのメモリがあるとします。異なるスレッドが文字通り同時に正確な同じデータを読み取ることができますか、コアは一度に特定の単語を読み取ることを許可されたコアを1つしか持たずに一度に1ワードを読み込みますか?

答えて

4

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

コアが一度に読み込むメモリのサイズについては、通常は32ビットのCPUでは32ビット、64ビットのCPUでは64ビットなどとなります。ストリーミングでさえ、dword(例えばmemcpyを見てください)によってdwordが実行されます。

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

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

+1

メモリアクセスは、現代のプロセッサでは実際にキャッシュラインのサイズ= 64バイトです。キャッシュラインへのアクセスは不可分です。コアは読み取りのためにラインを共有することができます。 – osgx

8

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

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

キャッシュコヒーレンシーは主に議論されている複雑なトピックです(特に私はJoe Duffy herehereの記事が好きです)。それにもかかわらず、ディスカッションは、明らかにロックフリーであるが、キャッシュコヒーレンシプロトコルがプロセッサキャッシュ全体のコヒーレンシを維持するために遅くなる可能性があるコードのパフォーマンス上の不利益を回避するが、書き込みがない限り、コヒーレンシを維持し、パフォーマンスを損なうことはありません。

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

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

+0

今日は正解です。 RAM自体は複数の同時アクセスを維持することはできませんが、これはキャッシュによって効果的に隠されます。しかし、複数のコアが非キャッシュ読み出しを実行する場合、これらの要求は依然として調停される必要があります。 – MSalters

関連する問題