Предполагается, что архитектура ARM64 или x86-64.
Я хочу убедиться, что эти два эквивалента:
a = _InterlockedCompareExchange64((__int64*)p, 0, 0);
MyBarrier(); a = *(volatile __int64*)p; MyBarrier();
Где MyBarrier()
- это барьер памяти (подсказка) уровня компилятора, например __asm__ __volatile__ ("" ::: "memory")
.Таким образом, метод 2 должен быть быстрее, чем метод 1.
Я слышал, что функции _Interlocked()
также подразумевали бы барьер памяти как на уровне компилятора, так и на уровне оборудования.
Я слышал, что прочитал (собственновыровненные) внутренние данные являются атомарными на этих архитектурах, но я не уверен, что метод 2 может быть широко использован?
(ps. потому что я думаю, что CPU будет обрабатывать зависимость от данных автоматически, поэтому аппаратный барьер здесь не особо рассматривается.)
Спасибо за любые рекомендации / исправления по этому вопросу.
Вот некоторые тесты для Ivy Bridge (ноутбук i5).
(петли 1E + 006: 27мс ):
; __int64 a = _InterlockedCompareExchange64((__int64*)p, 0, 0);
xor eax, eax
lock cmpxchg QWORD PTR val$[rsp], rbx
(петли 1E + 006: 27мс ):
; __faststorefence(); __int64 a = *(volatile __int64*)p;
lock or DWORD PTR [rsp], 0
mov rcx, QWORD PTR val$[rsp]
(1E + 006 циклов: 7мс ):
; _mm_sfence(); __int64 a = *(volatile __int64*)p;
sfence
mov rcx, QWORD PTR val$[rsp]
(1E + 006 циклов: 1.26ms , не синхронизировано?):
; __int64 a = *(volatile __int64*)p;
mov rcx, QWORD PTR val$[rsp]