【发布时间】:2012-03-26 13:23:02
【问题描述】:
我正在 OpenCl 中开发一个 Monte Carlo 射线追踪器,用于计算辐射传热分析的“视角因子”,并希望了解核对对象 x 与从对象 i 发射的射线相交的次数的最佳方法。
现在基本算法如下:
- 从物体 i 的表面发射随机射线 R
- 测试射线 R 与物体 0 - N 的交点
- 确定第一个与 R 相交的对象,设此为对象 x
- 通过递增 int 数组使得 array[i][x] +=1 记录第一个交集
- 重复光线总数
- 将数组第 i 行中的每个值除以从对象 i 触发的数组总数。
现在通常在 CPU 上的并行实现中,每个线程只维护自己的数组 [N] 副本,然后当所有光线都从对象 i 发射时,主线程将对各个数组求和以获得结果。
在 GPU 上的 OpenCL 中,这不是一个实用的解决方案,因为当 N 增加时,本地内存很快就会出现短缺,并且使用带屏障的单个数组会削弱性能。
什么是执行结果数组缩减的最佳实用方法,或者内存屏障是唯一实用的解决方案?
【问题讨论】:
标签: opencl raytracing