更新了不同的问题描述。我之前的问题建议的双向路径跟踪不是一种选择。
我有一个使用 OpenCL 进行一些计算(物理模拟)的 Monte Carlo 代码。主机代码是用 Python 和 PyOpenCL 编写的。OpenCL 内核的最终结果是图像(检测器数据)的坐标元组(x,y 位置 + 强度/灰度值)。我有 3 个向量/一维数组(x 位置、y 位置和灰度值各一个)。每个一维数组大约有 1e6 到 1e8 个整数,其中 x,y 是整数,灰度值浮动。要创建的图像是几个 1000x1000 像素(1e6 到 1e7 像素)。
最终,我需要在每次运行时创建多个图像(每个图像具有不同的坐标元组),因此效率和低内存使用变得很重要。
从这些数据生成二维数组或图像的最快方法是什么?对同一位置 (x,y) 的多次写入确实发生了,我找不到一个好的解决方案来并行或在模拟期间执行此操作(因为可能同时写入图像中的同一位置)。
我目前所做的是将 3 个向量/一维数组复制回主机,并使用内联 C 函数在主机上串行生成图像。
代码中最耗时的部分是为 3 个一维数组创建输出缓冲区数组,然后在内核完成后从设备复制到主机。如果我可以:
i)将数据保存在设备上并使用第二个内核(经过测试,但如果串行完成会非常慢)
生成图像,或者我可以在内核中生成图像正在运行,因此总体上摆脱了 1D 数组。
ii) 是首选,但我不知道该怎么做。write_image 是否识别多个工作项是否要写入同一个数组索引?
我已经测试并行化 i) 通过为两个工作组生成 2 个独立的 2D 图像数组,每个工作组有 1 个工作项,每个项迭代超过 1D 向量的一半(工作),但是对于更多工作项和独立图像,创建额外的开销2D 数组耗时太长并且消耗太多内存。
任何想法表示赞赏。