使用OpenCL记录光线跟踪的光线交叉数据的最佳方法

时间:2012-03-09 02:34:25

标签: opencl raytracing

我正在OpenCl中开发蒙特卡罗光线跟踪器,用于计算辐射传热分析的“视图因子”,并希望知道最佳方法来整理物体x与物体i发射的光线相交的次数。

现在基本算法如下:

  1. 从物体i的表面射出随机射线R,
  2. 测试光线R与物体0 - N
  3. 的交叉点
  4. 确定与R相交的第一个对象,将其作为对象x
  5. 通过递增int的数组来记录第一个交集,使得array [i] [x] + = 1
  6. 重复光线总数
  7. 将数组第i行中的每个值除以从对象i触发的数组总数。
  8. 现在通常在CPU上的并行实现中,每个线程只维护自己的数组[N]副本,然后当所有光线都从对象i触发时,主线程将对各个数组求和以得到结果。

    在GPU上的OpenCL中,这不是一个实用的解决方案,因为当N增加时,很快就会出现本地内存短缺,使用带有障碍的单个阵列会削弱性能。

    对于预先形成减少结果数组的最佳实践是什么,或者是内存屏障是唯一可行的解​​决方案?

1 个答案:

答案 0 :(得分:0)

内核A)按照你的描述去做,最后将数组[N]的副本写回全局内存。

内核B)用于缩减的内核(“主线程”在您的描述中执行)。

完成后对内核A的所有调用设置事件。使内核B的调用依赖于那些事件。您甚至可以使用内核B的多次调用来进行金字塔缩减,需要两个(或更多,可能需要调整)数组并写出一个总和。一系列事件可以解决依赖关系并允许深度排队。