2015-12-23 5 views
2

При использовании imageStore в OpenGL, это атомарно?Является ли imageStore атомарным?

Или, другими словами, предположим, что у меня есть один вызов подсчитанного шейдера, который записывает «82» в местоположение и другой вызов, который записывает «42» в одно и то же место.

Когда у меня есть третий вызов, который читается с того же места: Я гарантированно получил начальное значение или 42 или 82? Или я могу получить неопределенное значение, потому что они оба могли писать одновременно? (Я знаю, что не знаю, какой из них я получу).

Будет ли изменяться ответ на вышеуказанные вопросы, если они оба записывают одно и то же значение вместо разных значений?

+0

Можете ли вы пояснить, что вы подразумеваете под «вызовом шейдера»? Это единственная команда рисования с несколькими фрагментами? Несколько примитивов? Несколько команд рисования? Вычислительный шейдер вызывается один раз или несколько раз? –

+0

@ColonelThirtyTwo: Термин «[вызов шейдера] (https://www.opengl.org/wiki/Shader#Execution_and_invocations)» имеет хорошо установленное определение. –

+0

@NicolBolas Я вижу, спасибо за ссылку. –

ответ

3

Спецификация неясна на этом.

В спецификации много говорится о заказе выписок, а также о видимости операций магазина. Но ни в коем случае не говорит, что произойдет, если у вас есть два вызова, которые участвуют в записи в одно и то же место памяти. Он не говорит, что значение будет неопределенным или что это будет одна из нескольких возможностей.

Спецификация, похоже, имеет отверстие в этом отношении. Таким образом, я бы не сделал ничего, что предполагало бы, что такие записи действительно «атомные» в этом отношении.

+1

Не тот ответ, на который я надеялся, но большое спасибо! Почему вы думаете, что я делаю что-то неправильно? Я думаю, что допустимый пример использования может быть чем-то вроде строк: проверьте, есть ли черный пиксель во всем изображении. Для этого создайте один вычислительный поток на пиксель, загрузите его и запишите в единую общую папку (буфер или текстуру или что-то еще) «true», если она черная. Таким образом, для меня не имеет значения, что такое порядок записи, мне просто нужно знать, если хотя бы один из потоков написал правду для этого местоположения ... И я думал, что использование атомистики для этого не очень эффективно и может быть излишним. –

1

Я не думаю, что ответ, выбранный здесь, является правильным, если вы посмотрите на найденную спецификацию here, в ней конкретно говорится, что imageStore вместе с другими функциями, предоставляемыми расширением, являются атомарными.

+0

Я считаю, что документация, с которой вы связаны, устарела на ~ 5 лет. Текущей документацией является [OpenGL v4.6 Core Profile, §7.12 p156 «Доступ к шейдерной памяти»] (https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf#page=178), который, похоже, соответствует тому, что говорит принятый ответ. – user69513