Возможно ли для потока атомарно обновить 4 разных места в общей памяти? - PullRequest
1 голос
/ 25 апреля 2019

Предположим, что поток ядра пытается обновить 4 разных места в общей памяти.Могу ли я заставить эту операцию завершиться неудачно и отменить ее, если какой-либо другой поток перезаписал какое-либо из этих мест?В частности, может ли это быть выполнено атомарно?

mem[a] = x;
mem[b] = y;
mem[c] = z;
mem[d] = w;

1 Ответ

4 голосов
/ 25 апреля 2019

Нет, за исключением специального случая.

Это не может быть выполнено атомарно, в общем случае, когда a, b, c и d являются произвольными (то естьне обязательно смежный), и / или x, y, z, w каждый по 32 бита или больше.

Я использую «атомарно» для обозначения атомарной операции RMW, которую аппаратное обеспечение предоставляет .

Такие операции ограничены максимум 64-битным общим числом, поэтому 4 32-битные или более крупные величины могут не работать.Кроме того, все данные должны быть смежными и «естественно» выровненными, поэтому независимые местоположения не могут быть доступны в одном атомном цикле.

В особом случае, когда 4 величины - это 16-битные или 8-битные величины и смежныеи выровненный, вы можете использовать пользовательский атомарный .

Альтернативы для рассмотрения:

Вы можете использовать критических секций для достижения таких целей, вероятно, взначительные затраты производительности, сложность кода и хрупкость.

Другая альтернатива - изменить алгоритм, чтобы использовать некоторую форму параллельного сокращения .Поскольку вы работаете на уровне потокового блока, это может быть лучшим подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...