2015-12-05 8 views
7

アップデート3
「メモリ順序は、」何であるかを理解した後、私は問題は完全にコンパイラとは関係ありません知っています。
はい、私のCPUアーキテクチャはIntel x86でなので、どのようなコードを書いても、メモリの順序効果は決して発生しません。C++ 11原子::店舗と原子::負荷

更新2
逆アセンブリコードを確認します。しかし、コードをどのように追加しても、x.storeは常にy.storeの前にあります。
問題は、CPUの代わりにコンパイラ(これらのコードの順序を変更しない)から来るはずです(私が考える限り)。

更新:私がコメントを読んだ後、私はCPUのマシンを借りているよう
、それはアルファは、ARMまたはPPCであるようです。
誰も私がこの種のマシンをどこで使うことができるか知っていますが、これは無料ではありませんか?

起源:
私は以下のコードをテストしています。

atomic<int> x(0); 
atomic<int> y(0); 

void thr1() 
{ 
    x.store(1,memory_order_relaxed); 
    y.store(1,memory_order_relaxed); 
} 

void thr2() 
{ 
    while(!y.load(memory_order_relaxed)) 
     ; 
    cout<<x.load(memory_order_relaxed)<<endl; //may 0 or 1 
} 

私は、出力は、私は常に1
を取得し、関係なく、私が試したどのくらいの時間、しかし0
ないかもしれません知っているがために、私のCPUのx86アーキテクチャで、このですか?

この問題を解決するにはどうすればよいですか?
(私はCppMemを知っていますが、ループは使用できません)

+0

おそらくhttp://www.1024cores.net/home/relacy-race-detector/rrd-introductionを試してみてください。 –

+0

ご注文が十分に緩和されたハードウェアをお持ちでない場合は、これを確認できない場合があります。これをDEC AlphaやPlaystationで実行できますか? –

+0

これは何か違いがあるのか​​どうかはわかりませんが、両方の数字が同じページにある可能性が高いと思われます。たぶんあなたは別のページにそれらを置く場合、異なる結果が表示されます。 – 5gon12eder

答えて

3

あなたが経験していることは「問題」ではありません。少なくとも、基準に関する限りではありません。

注文が緩和される場合、注文が保証されなくなります。これは、実装がの場合は、でなければならないというわけではありません。

異なるコンパイラで表示されることがあります。もう一度、そうではないかもしれません。地獄、ちょうど最適化を変更すると、それが起こる可能性があります。それからもう一度、たぶん、そうでないかもには、最終的には何もできません(何らかの並べ替えや類似のツールのエミュレーションの外で)。 の可能性があるということを保証しているだけであることを保証していないからです。

+0

私はメモリの順序を理解する限り、_compiler_は何らかの理由でそれをより良く決定する必要がある場合、サブジェクトストアを並べ替えることができます。その場合、x86でもこの「弱点」を観察することは可能でしょう。しかし、私はGCCとClangでこれを理解することはできません。非アトミックストアの順序を変更したり、SIMDを使用してバッチ処理したりします。しかし、変数を原子にすると、ストアは規則的な動きになります。 –

+0

@ ConstantinBaranov:コンパイラが命令を別の順序で置くことができるかどうか、および* hardware *が指定された順序でそれらを実行するかどうかという2つの質問があります。コンパイラが別の順序で配置する必要がないと見なされた場合、コンパイラはそれを行いません。さらに、指示が異なる順番で来ているからといって、エミュレーションやその他の深刻なデバッグなしに見ることはできません。 –

関連する問題