Java 光线追踪浮动与双精度

Java raytracing float vs double

上学期我们不得不为学校的一门课程开发光线追踪器。学校快毕业了,我试着 fiddle 稍微用一下。

我想看看如果我将所有浮点计算从 double 更改为 float(所有计算都是用 double 完成的)会发生什么变化。所以我将每个变量都更改为 float 类型,并将 Math 方法返回的每个 double 简单地转换为 float。在几个场景上测试我的光线追踪器显示出相当不错的性能提升。

在网上搜索后,我发现了 float 可以更快的各种原因,但也有人说 double 可以一样快,甚至在 64 位环境中更快。问题是,我 运行 在 64 位环境和 JVM 中。性能提高的原因是什么?

现在,我正在阅读 PBRT 书籍,并计划在此之后从头开始重写光线追踪器。为所有浮点计算选择 float 会带来任何问题吗?我在测试期间没有注意到任何东西,但也许对于某些场景,精度可能较低(交叉测试似乎可能会带来问题)?或者也许是一种权衡,比如对关键测试使用 double 而对不太关键的计算使用 float ?我将不得不使用其他数学库来摆脱转换,我会采用浮动方式吗?

计算的速度而言,float 和 double 之间几乎没有区别,就 桌面处理器 而言平台。差异只能来自增加的内存带宽要求,因为双倍需要两倍 space.

它与基于 GPU 的计算不同,它们更适合浮点数,例如Nvidia GPU 的故障显着增加一倍。

我会采用混合方法;以浮点精度存储多边形等数据,但以双精度进行所有计算。内存占用小,精度高-双赢。

我这么晚才回答,这可能与您无关,但也许对其他人有帮助。作为个人项目,我也在使用 Go 中的光线追踪器(也使用 PBR 书),并且有同样的问题......32 或 64 位浮点数。我认为我将使用 32 位主要是出于一个原因:SIMDizing ray-triangle 交集测试。无论您的处理器可以使用哪种指令集(例如 SSE4、AVX2、AVX512),与 64 位相比,它每条指令执行的 32 位 fp 运算量是 2 倍。