Есть ли способ ускорить это?
Как часто, "как мы реализуем этот последовательный алгоритм на GPU?"это, вероятно, неправильный вопрос здесь. Вам нужно сделать шаг назад и подумать о , какие параллельные алгоритмы могут дать тот же результат, что и ваш последовательный алгоритм .
Код, который вы разместили, вероятно, не очень близок к реальному коду, который у вас естьв уме. Но если бы я пытался заполнить пространство случайными частицами согласно некоторому распределению, вместо того, чтобы создавать частицы одну за другой и случайным образом генерировать их местоположения по отдельности, я бы просматривал каждое местоположение и генерировал для него случайную выборку на основе функции распределения.
Таким образом, по сути, превратите алгоритм "выталкивания" в алгоритм "вытягивания".
Это становится намного сложнее, если у вас действительно есть веская причина для отслеживания отдельных частиц, но у нас нетМне действительно было дано достаточно информации.
Мне также было любопытно, можно ли здесь использовать ROP (выходные блоки рендеринга), поскольку их функция выглядит довольно схожей с этим типом вычислений. Из некоторых источников кажется, что буфер рендеринга на графическом процессоре может быть оптимизирован, например, для доступа на запись.
Да, это определенно стоит изучить, если вы должны придерживаться подхода «push», так какпохоже, что аддитивное смешивание - это то, что вы хотите. В дополнение к операциям смешивания, трафаретный буфер также может представлять интерес. Возможно, вы захотите рассмотреть рендеринг «точечных спрайтов», которые поддерживаются всеми основными 3D-API - рендеринг отдельных пикселей - это не то, что обычно делают 3D-приложения, и, следовательно, не обязательно то, для чего оптимизированы графические процессоры и их драйверы, а точечные. спрайты в основном предназначены для рисования систем частиц.