我的硕士论文有一些挑战,我希望你能帮助我,或者指出我的正确方向。
我正在使用Knaus和Zwicker (http://www.cs.jhu.edu/~misha/ReadingSeminar/Papers/Knaus11.pdf)使用OptiX的新方法实现渐进光子映射。该方法使PPM的每一次迭代/帧独立,更适合于多GPU。
我所做的(使用单个GPU)是使用OptiX跟踪一些光子,然后将它们存储在一个缓冲区中。然后,光子被排序成一个空间散列图使用CUDA和推力,永远不会离开GPU。我想在GPU上创建空间哈希映射,因为它是我渲染器的瓶颈。最后,该缓冲器用于间接辐射估计。这是一个多通道算法,包括射线追踪,光子追踪,光子地图生成,最后生成图像。
我知道OptiX可以支持多个GPU。每个上下文启动都被划分在GPU上。对缓冲区的任何写入似乎都被序列化并广播到每个设备,因此它们的缓冲区内容是相同的。
我想做的是让一个GPU做一个帧,而第二个GPU做下一个帧。然后,我可以组合结果,例如在CPU或GPU的一个组合传递。如果我可以在每个设备上并行执行每一次传递(在每一次传递之间同步),这也是可以接受的。这有可能吗?
例如,我是否可以在两个不同的主机线程上创建两个OptiX上下文映射到每个设备。这将允许我像以前一样进行CUDA/推力空间散列图生成,假设光子在一个设备上,并在管道末端合并两个生成的图像。然而,编程指南指出它不支持多线程上下文处理。我可以使用多个进程,但是在进程间的通信中有很多混乱。这种方法还需要与创建场景几何,编译PTX文件等重复工作。
谢谢!
发布于 2014-02-10 19:47:37
OptiX已经相应地将工作负载分配给您的GPU,所以您的方法可能不会比让OptiX处理所有GPU更快。
如果您想强迫您的数据留在设备上(注意,在这种情况下,来自不同设备的写入将使RT_BUFFER_GPU_LOCAL而不是保持一致),您可以使用编程指南中所示的标志。
https://stackoverflow.com/questions/16039633
复制相似问题