【问题标题】:Optimal way to record ray intersection data for ray tracing using OpenCL使用 OpenCL 记录光线相交数据以进行光线追踪的最佳方式
【发布时间】:2012-03-26 13:23:02
【问题描述】:

我正在 OpenCl 中开发一个 Monte Carlo 射线追踪器,用于计算辐射传热分析的“视角因子”,并希望了解核对对象 x 与从对象 i 发射的射线相交的次数的最佳方法。

现在基本算法如下:

  1. 从物体 i 的表面发射随机射线 R
  2. 测试射线 R 与物体 0 - N 的交点
  3. 确定第一个与 R 相交的对象,设此为对象 x
  4. 通过递增 int 数组使得 array[i][x] +=1 记录第一个交集
  5. 重复光线总数
  6. 将数组第 i 行中的每个值除以从对象 i 触发的数组总数。

现在通常在 CPU 上的并行实现中,每个线程只维护自己的数组 [N] 副本,然后当所有光线都从对象 i 发射时,主线程将对各个数组求和以获得结果。

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

什么是执行结果数组缩减的最佳实用方法,或者内存屏障是唯一实用的解决方案?

【问题讨论】:

    标签: opencl raytracing


    【解决方案1】:

    内核 A)按照您的描述进行操作,最后将它们自己的 array[N] 副本写回全局内存。

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

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

    【讨论】:

    • 你是说内核 A 应该在本地内存中为每个工作组维护一个副本,在私有内存中为每个处理元素维护一个副本?
    • 在您的实现中查询本地内存大小是否可行,然后让每个内核调用计算这些(本地)数组 [N] 值的范围?在内核 A 结束时,将这些本地数组 [N] 复制回全局缓冲区并运行一些内核 B 以对它们执行归约。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2014-09-02
    • 2021-07-24
    • 2016-01-08
    • 2023-03-07
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多