アトミックに16バイトの読み書きが必要です。私はcmpxchg16だけを使って書き込みを行います。これは、わかりにくいAMDのものを除いて、すべてのx64プロセッサで利用できます。x64 CPUでのアトミック16バイトの読み取り
ここで問題となるのは、整列した16バイトの値で、cmpxchg16(完全なメモリバリアのように動作する)を使用して変更した場合、16バイトの位置を半分古いデータと半分の新しいデータで読み取ることは可能ですか?
私はSSE命令を読んでいるので(読んでいる途中でスレッドを中断することはできません)、私は読み込みが矛盾したデータを見るのは不可能だと思います。私は原子でなければならないと思う。
私は、cmpxchg16が実行されたときに、16バイトをアトミックに変更し、2つの8バイトブロックを書き込んで、他のスレッドがその間に読み込みを行う可能性はないと仮定しています(正直なところ、原子でなければうまくいく)
私はそうですか?私が間違っている場合、ロックに頼らずに原子16バイトの読み込みを行う方法はありますか?
注:couple similar questions hereがありますが、書き込みがcmpxchg16でのみ行われるケースは扱われないため、これは別個の未解決の質問です。
編集:実際には私の推論は間違っていたと思います。 SSEロード命令は、2つの64ビット読み取りとして実行され、cmpxchg16が別のプロセッサによる2つの読み取りの間で実行される可能性があります。
のような単純なものと評価され、すなわち、それらはアトミックではありません。あなたの書き込みがCMPXCHG16Bで原子的に行われるという違いはありません。読み込みもアトミックでなければならないか、矛盾したデータが表示されることがあります。 AFAIKあなたの唯一の選択はCMPXCHG16Bで読むことです。 – Timo
Yeh、私は読んでいる間にスレッドが中断されるのを止めさせればよいと思ったのですが、実際のバス操作自体はまだインターリーブされている可能性があります。 – Eloff
cmpxchg16bを読み込みで使用すると、読み込み速度が遅くなります。しかし、25%以上のメモリを使用することで、Dmitry Vyukovのハッシュマップのようなseqlockスタイルのアプローチを行うことができます:http://www.1024cores.net/home/downloads – Eloff