- C++相談室 part146
868 :デフォルトの名無しさん[sage]:2019/12/14(土) 13:34:08.27 ID:T/HCOnVQ - >>772
>x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ 別に。 コアAの読み書きをコアA自身が見る分にはそうかもわからんが コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る (アウトオブオーダー実行の影響で 安全に動かすには適切にメモリバリアで順序化する必要がある
|
- C++相談室 part146
870 :デフォルトの名無しさん[sage]:2019/12/14(土) 13:37:51.96 ID:T/HCOnVQ - といってもロックレス何ちゃらぐらいの制御であればInterlockedCompareExchange()で済むから
スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが
|
- C++相談室 part146
871 :デフォルトの名無しさん[sage]:2019/12/14(土) 13:38:24.93 ID:T/HCOnVQ - >>869
迷信
|
- C++相談室 part146
873 :デフォルトの名無しさん[sage]:2019/12/14(土) 13:39:40.59 ID:T/HCOnVQ - リードキューやコマンドキューにコマンドが入るのはアウトオブオーダープロセスの事後であるため
そのような保証は無い
|
- C++相談室 part146
878 :デフォルトの名無しさん[sage]:2019/12/14(土) 14:57:30.67 ID:T/HCOnVQ - 確かにリンク先のインテルのマニュアルの
>8.2.3.2 Neither Loads Nor Stores Are Reordered with Like Operations >Example 8-2. Stores Are Not Reordered with Older Loads に >Initially x = y = 0r1 = 1 and r2 = 1 is not allowed と書いてあって>>875と同じことが書いてあるが疑わしい マニュアルが間違っているのではないか、 ちな >8byteのデータはアドレスが8の倍数のときにアライメントされている。 から安全に読み書きできるというのはi486みたいな古いプロセッサーだとかえって危険らしい >8.1.1 Guaranteed Atomic Operations を見たらワカル、
|
- C++相談室 part146
879 :デフォルトの名無しさん[sage]:2019/12/14(土) 15:04:35.33 ID:T/HCOnVQ - つか上のインテルのマニュアルには「投機的実行時中のメモリアクセスではメモリアクセス例外は発生しない」
旨が2箇所ぐらいに書かれているが、 ということはつまりアセンブリコード上A→BまたはA→Cというメモリアクセスが条件によってどちら片方だけ実行されることを意図したコードであっても A→B→Cというメモリアクセス順に成り得ることを意味し、他コアからもそう見えてしまうはずだが、 これをメモリアクセス順がreorderされていないうちに入れてしまうのはどうなのか、、、 マニュアル執筆者の国語の再教育が必要なのではないか
|
- C++相談室 part146
882 :デフォルトの名無しさん[sage]:2019/12/14(土) 15:20:09.00 ID:T/HCOnVQ - そりゃー間違ったマニュアルにしたがって実装したら間違った実装になり得る(キリ
ていうかアウトオブオーダー実行の影響がマルチコアCPUにおいても透過的だと認めやっても良いが、 >>879の投機的実行の件はどうなんじゃ? あるコアが投機的実行中に他のコアをストップさせるのでは何のための投機的実行かわからん…
|