Хотя я не читаю сборку Itanium и не претендую на понимание ее модели памяти, я заметил кое-что очень странное и явно противоречивое в одном предложенном отображении атома C / C ++ в Itanium.
В C / C ++ 11 сопоставлениях с процессорами предлагаемая реализация атомарного анализа на Itanium не предполагает никаких заборов или заградительных ограждений:
Consume Fence: <ignore>
Acquire Fence: <ignore>
Release Fence: <ignore>
Acq_Rel Fence: <ignore>
(что в любом случае означает ограничение на потребление?)
И действительно, в этом предложении ослабленные атомные нагрузки и хранилища никогда не ослабляются:
Load Relaxed: ld.acq
Load Consume: ld.acq
Load Acquire: ld.acq
...
Мы видим, что все расслабленные простые (не RMW) операции уже являются Acq_Rel в этих отображениях.Но, глядя на операции RMW, вы увидите, что расслабленные и неслабые операции различаются:
Cmpxchg Release: cmpxchg.rel
Cmpxchg AcqRel: cmpxchg.rel; mf
Если реализация Cmpxchg AcqRel не имеет безвозмездной поддержки mf
(маловероятно), это означает, что поведение получения не является автоматическим вcmpxchg.rel
.
Разве не должна хотя бы расслабленная операция RMW только для выпуска, сопровождаемая ограждением захвата, обеспечить хотя бы гарантии acq_rel RMW?Если так, разве это не показывает, что предложение является дефектным?