Если я хочу реализовать 128-битный атомарный тип на x64, могу ли я использовать _mm_store_si128
и _mm_load_si128
, чтобы избежать cmpxchg16b
для расслабленных load
и store
?
(Если нужно, могу предположить, что нужны только load
и store
, хотя было бы хорошо, если бы я мог смешать их с cmpxchg16b
)
movdqa
загрузка/сохранение в ассемблере — это получение/выпуск, и на практике это атомарно на последних процессорах. И на процессорах сlock cmpxchg16b
, GCC/clang, по крайней мере, использует его вместо блокировки для 16-байтовых атомов либо путем встраивания, либо с кодом вlibatomic
(gcc7 изменился на вызов без блокировки, потому что чтение черезlock cmpxchg16b
означает, что читатели все еще спорят друг с другом, поэтому обычные ожидания производительности от блокировки не оправдываются). Так что в этом случае да, смешивание SIMD сatomic<a_16_byte_type>
будет безопасным на большинстве аппаратных средств. Если вас интересует только один сервер, протестируйте его на этом сервере. - person Peter Cordes   schedule 14.04.2020atomic<T>
в текущем gcc/clang, если вы все еще хотите попробовать это, несмотря на отсутствие каких-либо будущих гарантий, что это безопасно. (или документацию для текущего поведения). Я закрыл это, потому что отсутствие гарантий безопасности должно быть препятствием для большей части кода, включая любой код, который вы хотите распространять среди других. Если бы он был известен как безопасный на некоторых/любых процессорах, GCC/clang уже использовал быmovdqa
для 16-байтовой чистой загрузки/чистого сохранения, как GCC используетmovq
для 8-байтового в 32-битном режиме. (GCC даже используетfild
, если SSE1 недоступен) - person Peter Cordes   schedule 14.04.2020cmpxchg16b
(в Boost), так и на блокировках (поставляется с компилятором). Поэтому я работал, не используя 128-битный atomic. Но я заметил, что на x86 64-битный atomic реализуется с использованием SSE илиfild
, как вы упомянули (хотя я наблюдаю другое поведение компилятора, а не GCC), поэтому мне было интересно узнать о SSE для 128-битного. - person Alex Guteniev   schedule 14.04.2020lock cmpxchg16b
, но по-прежнему используют его через libatomic. Он__atomic_load_16
или как там он называется в libatomic на самом деле не блокирует процессоры с этой функцией; один шаг вatomic<__int128>.load
, если вам интересно. Я думаю, clang встроит его, если вы скомпилируете с-mcx16
или-march=anything
, кроме k8. - person Peter Cordes   schedule 14.04.2020_InterlockedCompareExchange64
и__iso_volatile_load64
для 64-битного атомарного на x86, блокировки для 128-битного атомарного на x64 и_InterlockedCompareExchange128
для 128-битногоboost::atomic
на x64. - person Alex Guteniev   schedule 14.04.2020lock cmpxchg
непосредственно в качестве загрузки. Re: заборы: модель памяти x86/x86-64 программный порядок + store буфер с store forwarding. Компиляторы получают и выпускают бесплатно, просто блокируя переупорядочение во время компиляции. (Возможно, вы могли бы использоватьatomic_signal_fence()
как хак для портативного барьера только для компилятора или, конечно, просто использоватьatomic_thread_fence(mo_release)
). Вам нужна только инструкция mfence после сохранения seq_cst. (Или просто сделайте их сxchg
, что является полным барьером). - person Peter Cordes   schedule 14.04.2020_ReadWriteBarrier
,std::atomic_thread_fence(seq_cst)
- этоlock cmpxchg
с фиктивной переменной. И я хотел избежать каких-либо блокировок или инструкций*fence
для загрузки/сохранения. Насколько я понимаю, пока они не выпустят набор инструментов для взлома ABI,cmpxchg16b
не может быть введен в ихstd::atomic<128b>
, даже защищенный обнаружением ЦП. - person Alex Guteniev   schedule 14.04.2020atomic_thread_fence(mo_acq_rel)
на x86-64 - это нулевые ассемблерные инструкции или не встроенный вызов функции. - person Peter Cordes   schedule 14.04.2020std::atomic<128b>
для использованияlock cmpxchg16b
- правильно, это было бы нарушением ABI для MSVC, поскольку существующий код использует отдельную блокировку. Но GCC/clang на x86-64 Linux, по крайней мере, работает так, как я описал. godbolt.org/z/yp8GYX clang 10.0 по-прежнему встраиваетlock cmpxchg16b
с-march
, что позволяет это сделать. - person Peter Cordes   schedule 14.04.2020