В OpenCL, что делает mem_fence () в отличие от барьера ()?

В отличие от барьера () (что, я думаю, я понимаю), mem_fence () не влияет на все элементы в рабочей группе. В спецификации OpenCL сказано (раздел 6.11.10) для mem_fence () :

Упорядочивает загрузку и сохранение рабочего элемента, выполняющего ядро.

(поэтому это применимо к одиночному рабочему элементу).

Но, в то же время, в разделе 3.3.1 говорится, что:

В памяти рабочего элемента существует согласованность загрузки / сохранения.

так что в пределах рабочего элемента память согласована.

Так для чего полезна mem_fence () ? Это не работает с элементами, но не требуется внутри элемента ...

Обратите внимание, что я не использовал атомарные операции (раздел 9.5 и т. Д.). Есть ли идея, что mem_fence () используется вместе с ними? Если так, мне бы хотелось увидеть пример.

Спасибо.

Спецификация, для справки.

Обновление : я вижу, насколько это полезно при использовании с барьером () (неявно, поскольку барьер вызывает mem_fence () ) - но обязательно их должно быть больше, поскольку он существует отдельно?

11
задан einpoklum - reinstate Monica 22 August 2013 в 13:02
поделиться