Рассматривает ли 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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Wordpress — генерировать случайное уникальное число, используя атомарную операцию, и обновлять базу данных
    Anonymous » » в форуме Php
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Я хочу использовать атомарную транзакцию с колбой
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как выполнить атомарную замену файлов?
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Установите gcc из исходного кода: bash: gcc -v /usr/bin/gcc: это каталог
    Гость » » в форуме C++
    0 Ответы
    153 Просмотры
    Последнее сообщение Гость
  • Добавить ограждение за многоцелевым приложением, используя поиск Hibernate
    Anonymous » » в форуме JAVA
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

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