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

使用OpenCL记录光线跟踪的光线相交数据的最佳方法,opencl,raytracing,Opencl,Raytracing,我正在OpenCl中开发一个蒙特卡罗射线跟踪器,用于计算辐射热传递分析的“视图因子”,并希望了解整理对象x与对象I发射的射线相交次数的最佳方法 现在基本算法如下: 从对象i的表面发射随机射线R 射线R与对象0-N的测试交点 确定与R相交的第一个对象,让它为对象x 通过递增int的数组记录第一个交点,使数组[i][x]+=1 对总光线数重复此操作 将数组第i行中的每个值除以从对象i激发的数组总数。 现在,通常在CPU上的并行实现中,每个线程只维护自己的数组副本[N],然后当所有光线都从对象i发射时

我正在OpenCl中开发一个蒙特卡罗射线跟踪器,用于计算辐射热传递分析的“视图因子”,并希望了解整理对象x与对象I发射的射线相交次数的最佳方法

现在基本算法如下:

从对象i的表面发射随机射线R 射线R与对象0-N的测试交点 确定与R相交的第一个对象,让它为对象x 通过递增int的数组记录第一个交点,使数组[i][x]+=1 对总光线数重复此操作 将数组第i行中的每个值除以从对象i激发的数组总数。 现在,通常在CPU上的并行实现中,每个线程只维护自己的数组副本[N],然后当所有光线都从对象i发射时,主线程将对各个数组求和以获得结果

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


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

内核a按照您描述的方法执行,在最后将自己的数组[N]副本写回全局内存

内核B主线程在您的描述中所做的用于缩减的内核


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

您是说内核A应该在本地内存中为每个工作组维护一个副本,在私有内存中为每个处理元素维护一个副本?在您的实现中查询本地内存大小是否可行,然后让每个内核调用计算这些本地数组[N]值的范围?在内核A的末尾,将这些本地数组[N]复制回全局缓冲区,并运行一些内核B来对它们执行缩减。