2011-01-14 19 views
3

私は最近、using volatileの質問をしました。非常にの情報の記事がメモリの壁とその用途について議論しています。これらの記事を読んだ後、私はかなり編集的になってしまった。隣接するメモリ領域のmemcpy()安全性

私は64ビットマシンを持っています。複数のスレッドからメモリの隣接した重複しない領域にmemcpyするのは安全ですか?

char buff[10]; 

はそれが常に安全な一つのスレッドが最初の5バイトにmemcpyをするためのものである最後の5バイトに第二のスレッドのコピー:たとえば、私はバッファを持っていると言いますか?

私の腸内反応(およびいくつかの簡単なテスト)はこれが完全に安全であることを示していますが、私は完全に私を納得させることができるどこにでもドキュメンテーションを見つけることができませんでした。

答えて

6

安全、はい。この限られた例ではなく、少なくとも演奏者。 1つのキャッシュラインを2つのコアに同時に入れることはできません。コアBがバッファに書き込む間、コアAを強制的に待機させ、メモリが転送されている間待機してから書き込みを行います。マルチコアメモリのコピーは、この効果を避けるために、サイズが非常に大きくなければなりません。

+0

これは、メモリがvolatileと宣言された場合はプロセッサ、コンパイラの最適化レベルによって異なります。一般に、各コアはキャッシュの独自のコピーに書き込みます。キャッシュのコピーは、プロセッサが後でフラッシュアウトする際に後で解決します。実際のメモリ同期障壁は、実際に書き込まれたメモリを実際に読み込もうとする際に、決定論的な振る舞いを得るためには完全に必要であることが明らかです。 –

+2

x86/x64など多くのプロセッサはキャッシュ一貫性があります(http://en.wikipedia.org/wiki/Cache_coherency)。 2つのコアは同じキャッシュラインを保持することができ、両方のコピーは常に同じ値を保持するように常に最新の状態に保たれます。言うまでもなく、2つのコアから同じキャッシュラインにアクセスすることは、パフォーマンスに大きな影響を与えます。 – Timo

+0

@Adam:幸いにも、私は執筆だけを心配しています。さもなければ、私はおそらくさらに妄想的であろう。 – JaredC

2

memcpyの各インスタンスがバッファの一部だけに書き込みを行っている限り、完全に安全です。 C++での任意のフォームの配列割り当ては非常に低レベルです。それはプログラムのための適切なサイズで割り当てられた記憶域の連続ブロックであり、ポインタ以外のものとして存在するオブジェクトとしての配列は単に錯覚です。 memcpyには配列の重複しない範囲を与えます。そして、まったく隣り合っている2つの完全に別々の配列ではないことを知る方法がありません。書き込みは干渉しません。

+0

MemCpy? memcpyにもっと似ています。さらに、OPは、異なるスレッドからのメモリへの同時アクセスの問題を懸念しています。 –

+0

あなたの巧みで礼儀正しいコピー編集は、それが提供された協同精神で評価されます。とにかく、OPは、別のスレッドでメモリの隣接していない領域への同時アクセスの問題について懸念しています。これは私が答えたものです。 –

4

はい、完全に安全です。メモリバスへのアクセスのシリアル化はハードウェアで行われます。

0

はいこれは、どんな種類の先行注文ともまったく無関係です。バイトをコピーするだけです。

関連する問題