Надеюсь, очень простой вопрос! У меня есть система частиц, которую я обновляю с помощью вычислительного шейдера (просто обновляю буфер данными о положении). Прямо сейчас я читаю из входного буфера и пишу в другой выходной буфер (это будет входной буфер следующего кадра). Но мне было интересно, поскольку каждое обновление считывает/записывает в один и тот же слот, может быть более эффективно или даже возможно обновить буфер на месте, а не создавать два и пинг-понг туда и обратно.
Я подозреваю, что ответ здесь «нет, это плохая идея», поскольку я уверен, что существует целый ряд неопределенных поведений вокруг кешей, порядка доступа к памяти и т. д., но я подумал, что стоит спросить, есть ли какой-либо подход, который мог бы работайте с таким буфером на месте, так как было бы неплохо сохранить эту дополнительную память (и если бы это было быстрее!).
Если каждый отдельный вызов шейдера касается только своих байтов в буфере и больше никого... тогда все в порядке. Читайте/изменяйте/записывайте в свое удовольствие. Этот вызов может даже прочитать данные, которые он только что записал, и они будут видны этому вызову. Никакой специальной синхронизации не требуется.
И это не ваша работа — беспокоиться о проблемах с кешем, связанных с соседними операциями чтения. Это работа GPU. Пока каждый вызов считывает непересекающуюся память из всех остальных, проблем нет. То есть вам не нужно знать размер строки кэша.
Теперь вам нужна соответствующая синхронизация для любого процесса, который будет в дальнейшем использовать эти данные. Но тебе это все равно понадобится.
Спасибо за быстрый и очень подробный ответ! Я попробую это - и, возможно, проведу параллельное сравнение, чтобы увидеть, есть ли разница в производительности в любом случае.