В отличие от barrier() (который, как мне кажется, я понимаю), mem_fence() не влияет на все элементы рабочей группы. Спецификация OpenCL говорит (раздел 6.11.10), для mem_fence():
Заказы загружаются и сохраняются в рабочем ядре, выполняющем ядро.
(поэтому он применяется к одному рабочему элементу).
Но в то же время в разделе 3.3.1 говорится, что:
В памяти рабочего элемента имеется согласованность загрузки/хранения.
поэтому внутри рабочего элемента память последовательна.
Для чего полезно mem_fence()? Он не работает во всех элементах, но не нужен внутри элемента...
Обратите внимание, что я не использовал атомные операции (раздел 9.5 и т.д.). Является ли идея, что mem_fence() используется вместе с ними? Если это так, я хотел бы увидеть пример.
Спасибо.
Обновить. Я вижу, как это полезно при использовании с barrier() (неявно, поскольку барьер вызывает mem_fence()) - но, конечно, должно быть больше, поскольку он существует отдельно?