Подтвердить что ты не робот

Почему INC-инструкция x86 не является атомарной?

Я читал, что инструкция INC для x86 не является атомарной. Мой вопрос, почему? Предположим, что мы увеличиваем 64-битное целое число на x86-64, мы можем сделать это с одной инструкцией, так как инструкция INC работает как с переменными памяти, так и с регистром. Итак, как получилось, что он не атомный?

4b9b3361

Ответ 1

Почему? Ядру процессора еще нужно прочитать значение, хранящееся в памяти, вычислить его прирост, а затем сохранить его обратно. Там задержка между чтением и хранением, и в то время другая операция могла повлиять на это местоположение памяти.

Даже при исполнении вне очереди процессорные ядра достаточно "умны", чтобы не перебирать свои собственные инструкции и не будут нести ответственность за изменение этой памяти в промежутке времени. Однако другое ядро ​​могло бы выпустить инструкцию, которая изменяет это местоположение, передача DMA могла повлиять на это местоположение или другое оборудование, которое каким-то образом коснулось этой памяти.

Ответ 2

Современные процессоры x86 как часть конвейера выполнения компилируют инструкции x86 в набор операций нижнего уровня; Intel называет эти uOps, AMD rOps, но то, что сводится к тому, что некоторые типы одиночных инструкций x86 выполняются фактическими функциональными блоками в CPU как несколько шагов.
Это означает, например, что:

INC EAX

выполняется как единственный "мини-оператор", например uOp.inc eax (позвольте мне называть его, что они не отображаются).
Для других операндов все будет выглядеть по-другому, например:

INC DWORD PTR [ EAX ]

низкоуровневая декомпозиция, хотя будет выглядеть больше:

uOp.load tmp_reg, [ EAX ]
uOp.inc tmp_reg
uOp.store [ EAX ], tmp_reg

и, следовательно, не выполняется атомарно. Если, с другой стороны, вы префикс, произнеся LOCK INC [ EAX ], который скажет, что этап "компиляции" конвейера будет разлагаться по-другому, чтобы обеспечить выполнение требования атомарности.

Причина этого, конечно, как упоминалось другими - скорость; почему сделать что-то атомарным и обязательно медленнее, если не всегда требуется?

Ответ 3

Вам действительно не нужна гарантированная атомная операция, если вам это нужно, от Agner Fog Ресурсы оптимизации программного обеспечения: instruction_tables.pdf (1996 - 2017):

Инструкции с префиксом LOCK имеют длительную задержку, которая зависит от организации кеша и, возможно, от скорости RAM. Если имеется несколько процессоров или ядер или устройств прямого доступа к памяти (DMA) то все заблокированные инструкции блокируют строку кэша для эксклюзивного доступа, которая может включать доступ к ОЗУ. Префикс LOCK обычно стоит более ста тактов, даже на однопроцессорном систем. Это также относится к инструкции XCHG с операндом памяти.