Рассматривает ли gcc расслабленную атомарную операцию как ограждение компилятора?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Рассматривает ли gcc расслабленную атомарную операцию как ограждение компилятора?

Сообщение Anonymous »

У меня есть следующий код с GCC8.3, x86-64 Linux:

Код: Выделить всё

// file: inc.cc
int inc_value(int* x) {
(*x)++;
//std::atomic ww;
//ww.load(std::memory_order_relaxed);
(*x)++;
return *x;
}
создает следующую сборку для операции увеличения:

Код: Выделить всё

 g++ -S inc.cc -o inc.s -O3
addl  $2, %eax
после того, как я включил использование атомарной переменной, я получил:

Код: Выделить всё

  addl  $1, (%rdi)
movl  -4(%rsp), %eax
movl  (%rdi), %eax
addl  $1, %eax
movl  %eax, (%rdi)
Похоже, что Relaxed-atomic-load работает как ограждение компилятора (точно так же, как asm Volating("":::"memory");) , поэтому GCC не может переупорядочить инструкции вокруг него;
Я знал:
  • cppreference говорит, что нет гарантии порядка в памяти вокруг расслабленной работы, так что для компилятора это нормально изменить порядок
  • X86-64 имеет надежную модель памяти TSO; Атомарные операции не генерируют инструкции lock/xchg/mfence cpu-fence, а работают только как ограждение компилятора (за исключением seq_cst);
Согласно вышеизложенному, GCC следует переупорядочить+оптимизировать код, добавив $2, %eax, так же, как расслабленная операция не имеет никакого эффекта; Но результат показывает, что GCC воспринимает расслабленную нагрузку как ограждение компилятора и останавливает любое переупорядочение; Итак, у меня есть следующий вопрос:
  • для x86-64, всегда ли GCC генерирует полную защиту компилятора для атомарных операций? даже несмотря на то, что это спокойная операция; Кроме того, GCC генерирует команду mov-to-memory вместо инструкции mov-to-register (не кэширует значение tmp в регистре), подразумевает ли «атомный-компилятор-забор» также побочный эффект памяти для GCC, поэтому GCC должен хранить/загружать значения из памяти вокруг забора?
  • Если да, то для x86-64 достаточно ли использовать только 2 порядка: Relaxed-order и seq_cst? Поскольку x86-64 имеет гарантии TSO, а расслабленный порядок рассматривается как полная защита компилятора, он может заменить использование Release/Acquire/Consume.


Подробнее здесь: https://stackoverflow.com/questions/793 ... iler-fence
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»