Я разрабатываю трассировщик лучей Монте-Карло в OpenCl для расчета «коэффициентов обзора» для радиационного анализа теплопередачи и хочу знать оптимальный способ сопоставления того, сколько раз объект x пересекается с лучами, испускаемыми из объекта i.
Теперь основной алгоритм выглядит следующим образом:
- Огненный случайный луч, R, с поверхности объекта i
- Проверка пересечения луча R с объектами 0 - N
- Определите первый объект, пересекаемый R, пусть это будет объект x
- Запишите первое пересечение, увеличивая массив целых чисел так, чтобы массив [i] [x] + = 1
- Повторите для общего количества лучей
- Разделите каждое значение в i-й строке массива на общее количество массивов, запущенных из объекта i.
Теперь, как правило, в параллельной реализации на ЦП каждый поток просто поддерживает свою собственную копию массива [N], а затем, когда все лучи запущены из объекта i, главный поток будет суммировать отдельные массивы для получения результатов.
В OpenCL на GPU это не практичное решение, так как при увеличении N быстро возникает нехватка локальной памяти, и использование одного массива с барьерами снизит производительность.
Что является лучшим практическим средством для предварительного сокращения массива результатов или является барьером памяти единственным практическим решением?