我正在OpenCl中开发蒙特卡罗光线跟踪器,用于计算辐射传热分析的“视图因子”,并希望知道最佳方法来整理物体x与物体i发射的光线相交的次数。
现在基本算法如下:
现在通常在CPU上的并行实现中,每个线程只维护自己的数组[N]副本,然后当所有光线都从对象i触发时,主线程将对各个数组求和以得到结果。
在GPU上的OpenCL中,这不是一个实用的解决方案,因为当N增加时,很快就会出现本地内存短缺,使用带有障碍的单个阵列会削弱性能。
对于预先形成减少结果数组的最佳实践是什么,或者是内存屏障是唯一可行的解决方案?
答案 0 :(得分:0)
内核A)按照你的描述去做,最后将数组[N]的副本写回全局内存。
内核B)用于缩减的内核(“主线程”在您的描述中执行)。
完成后对内核A的所有调用设置事件。使内核B的调用依赖于那些事件。您甚至可以使用内核B的多次调用来进行金字塔缩减,需要两个(或更多,可能需要调整)数组并写出一个总和。一系列事件可以解决依赖关系并允许深度排队。