Haskell中的光线追踪

时间:2013-07-03 01:31:26

标签: performance haskell raytracing

我过去曾在C ++中使用(非常基本的)光线跟踪软件。 现在想要从头开始创建一个高级系统(CSG,光能传递等)。

我觉得有趣的是在Haskell中实现它,因为我也在学习函数式编程。

性能是光线跟踪算法中非常重要的事实。 Haskell程序通常比C ++程序慢。多少?这取决于具体情况。

考虑这个上下文(即可能非常复杂的RT)在Haskell中工作是否可行?

2 个答案:

答案 0 :(得分:7)

值得检查平面并行度的修复。如果你知道自己在做什么,就可以获得相当不错的性能,但为了获得出色的性能,它有时需要阅读并检查核心输出,看看为什么没有拆箱。

但是,这取决于。如果您正在为绝对性能编写C代码,那么很可能不会使用Repa来击败 C,因为别名分析目前似乎不是很好。 但是,除非你将C代码手动融合到一个单片函数中,否则我怀疑你从融合中获得的好处以及在Repa中的'自由并行性'可能有助于它竞争。

http://code.ouroborus.net/gloss/gloss-head/gloss-examples/raster/Ray/

http://www.youtube.com/watch?v=jBd9c1gAqWs

不要使用列表。如果您不想使用Repa,我建议您使用Data.Vector.Unboxed。

答案 1 :(得分:3)

我对Haskell也相对较新。我刚才在https://bitbucket.org/ratzes/hray/src在Haskell写的bitbucket中提交了一个四元数分形光线跟踪器。

代码并不完美,但它相当小,并且在samples文件夹中生成了图像。

我使用了Repa库(很好的修复here教程),在我看来这对于我的光线追踪程序是完美的。它允许我指定一个函数来计算特定光子的“命中”,然后它自动将该函数并行化在每个光子上。

不可否认,分形光线跟踪比普通光线跟踪更容易,因为您可以在“光子”路径上的任何点进行采样,以询问它是否发生碰撞。此外,没有实现任何像光能传递或焦散这样的先进技术,所以我无法评论那些像那些规模那么好的。