Потенциальные проблемы при использовании 16-байтных атомарных операций¶
Для процессоров elbrus-v4 и ниже ещё не было аппаратной поддержки 16-байтных
атомарных операций. Поэтому в компиляторе при построении 16-байтных атомарных
операций для режимов -march=elbrus-v4 и ниже строится вызов функции из
библиотеки libatomic. Функции внутри себя реализованы через использование mutex’а
Для процессоров elbrus-v5 и выше уже есть аппаратная поддержка 16-байтных
атомарных операций. Поэтому в компиляторе при построении 16-байтных атомарных
операций для режимов -march=elbrus-v5 и выше строится код, использующий аппаратную
поддержку и никак не использующий библиотеку libatomic
Такая работа компилятора приведёт к проблеме, когда внутри одной программы используются 16-байтные атомарные операции над одним и тем же адресом памяти в случае, если часть кода скомпилирована в режиме elbrus-v4 и ниже, а часть кода - в режиме elbrus-v5 и выше. Это обусловлено тем, что нельзя совмещать разные способы построения атомарных операций над одним и тем же адресом - нужно либо чтобы все обращения работали через библиотеку libatomic, либо чтобы все обращения работали через аппаратную поддержку
При наличии смеси из кодов, скомпилированных под разные режимы -march= и имеющих
атомарные операции над одним и тем же адресом в кодах с разными -march=,
следует использовать опцию -mno-quad-memory-atomic, которая запретит использование
аппаратной поддержки при построении 16-байтных атомарных операций
