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