Независимо от настройки порядка памяти, вам требуется атомарная операция в обоих циклах.Оказывается, что с процессорами x86, которые по своей природе строго упорядочены в большинстве ситуаций, это приводит к использованию одних и тех же кодов asm для каждого fetch_add: lock xadd
.Эта атомарная операция на процессорах x86 всегда последовательна, поэтому здесь нет возможности оптимизации при указании расслабленного порядка памяти.
Использование расслабленного порядка памяти позволяет дополнительно оптимизировать окружающие операции, но ваш код больше не обеспечиваетВозможности оптимизации, поэтому выдаваемый код одинаков.Обратите внимание, что результаты могут отличаться при использовании слабо упорядоченного процессора (например, ARM) или при большем количестве манипуляций с данными в цикле (что может предложить больше возможностей переупорядочения).
С cppreference (мой курсив):
std :: memory_order указывает, как регулярные неатомарные обращения к памяти должны быть упорядочены вокруг атомарной операции.
Документ Модели памяти для программистов на C / C ++ предоставляет много более подробных сведений об этом.
В качестве примечания, многократно работающийатомарные эталонные тесты или запуск их на разных процессорах x86 (даже одного и того же производителя) может привести к совершенно разным результатам, поскольку потоки могут не распределяться по всем ядрам в равной степени, а на задержки кэша влияет то, является ли это локальным ядром, другоеядро на том же чипе или на другом чипе.Это также зависит от того, как конкретный процессор обрабатывает потенциальные конфликты согласованности.Кроме того, кэши уровня 1, 2 и 3 ведут себя по-разному, как и оперативная память, поэтому общий размер набора данных также оказывает существенное влияние.См. Оценка стоимости атомарных операций на современных архитектурах .