1

更新了不同的问题描述。我之前的问题建议的双向路径跟踪不是一种选择。

我有一个使用 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 数组耗时太长并且消耗太多内存。

任何想法表示赞赏。

4

1 回答 1

2

Python 不适用于高性能应用程序,尤其是当它涉及循环时——类似于 Matlab。

但是如果你想坚持使用 Python 并并行化你的代码,最好的方法是使用 PyCuda,你可以每个像素有一个线程并在 GPU 上运行计算。

请注意,最有效的光线追踪是向后光线追踪,它将光线从相机发送到场景(例如,每个像素一条光线),这样您就可以确保不会浪费原本永远不会到达相机的光线。也许在尝试并行化代码之前的第一件事是理解和实现更有效的算法。

如果您想要全局效果,您可以查看(双向)路径跟踪和照片映射。

于 2013-04-06T04:23:33.640 回答