Использование одного и того же буфера в качестве ввода и вывода для вычислительного шейдера

Надеюсь, очень простой вопрос! У меня есть система частиц, которую я обновляю с помощью вычислительного шейдера (просто обновляю буфер данными о положении). Прямо сейчас я читаю из входного буфера и пишу в другой выходной буфер (это будет входной буфер следующего кадра). Но мне было интересно, поскольку каждое обновление считывает/записывает в один и тот же слот, может быть более эффективно или даже возможно обновить буфер на месте, а не создавать два и пинг-понг туда и обратно.

Я подозреваю, что ответ здесь «нет, это плохая идея», поскольку я уверен, что существует целый ряд неопределенных поведений вокруг кешей, порядка доступа к памяти и т. д., но я подумал, что стоит спросить, есть ли какой-либо подход, который мог бы работайте с таким буфером на месте, так как было бы неплохо сохранить эту дополнительную память (и если бы это было быстрее!).

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если каждый отдельный вызов шейдера касается только своих байтов в буфере и больше никого... тогда все в порядке. Читайте/изменяйте/записывайте в свое удовольствие. Этот вызов может даже прочитать данные, которые он только что записал, и они будут видны этому вызову. Никакой специальной синхронизации не требуется.

И это не ваша работа — беспокоиться о проблемах с кешем, связанных с соседними операциями чтения. Это работа GPU. Пока каждый вызов считывает непересекающуюся память из всех остальных, проблем нет. То есть вам не нужно знать размер строки кэша.

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

Спасибо за быстрый и очень подробный ответ! Я попробую это - и, возможно, проведу параллельное сравнение, чтобы увидеть, есть ли разница в производительности в любом случае.

Varrak 17.04.2023 01:53

Другие вопросы по теме