【发布时间】:2011-09-12 03:25:52
【问题描述】:
我正在用 C++ 编写路径跟踪器,我想尝试在 CUDA 或 OpenCL 中实现资源最密集的代码(我不确定该选择哪一个)。
我听说我的显卡版本的 CUDA 不支持递归,这是我的路径跟踪器大量使用的东西。
由于我使用 Python 和 C++ 编写了代码,因此我将发布一些简化的 Python 代码以提高可读性:
def Trace(ray):
hit = what_object_is_hit(ray)
if not hit:
return Color(0, 0, 0)
newRay = hit.bouceChildRayOffSurface(ray)
return hit.diffuse * (Trace(newRay) + hit.emittance)
我尝试手动展开函数,有一个明确的模式(d 是 diffuse 和 e 是 emittance):
Level 1: d1 * e1
Level 2: d1 * d2 * e2
+ e1
Level 3: d1 * d2 * d3 * e3
+ d1 * d2 * e2
+ e1
Level 4: d1 * d2 * d3 * d4 * e4
+ d1 * d2 * d3 * e3
+ d1 * d2 * e2
+ e1
虽然我可能是错的......
我的问题是,我将如何在 while 循环中实现此代码?
我正在考虑使用这种格式的东西:
total = Color(0, 0, 0)
n = 1
while n < 10: # Maximum recursion depth
result = magical_function()
if not result: break
total += result
n += 1
我以前从未真正处理过解开递归函数的任务,因此非常感谢任何帮助。谢谢!
【问题讨论】:
-
现在这个函数不是尾递归的。您将需要使用堆栈或使其尾递归。 (函数调用中有一个隐式堆栈。)
-
问题:
hit是什么? -
hit是ray所经过的对象。每次都不一样。 -
但是
hit在整个递归过程中是不变的?或者即使在递归的跟踪中它也会改变? -
是的,每次迭代都会重新定义。这发生在我在第一个代码块中省略的代码中。我将对其进行编辑以使其明确...
标签: python recursion cuda opencl