上个学期,我们必须为学校的课程开发光线追踪器。学校正在完成,我试图用它来捣乱。
我想知道如果我将所有浮点计算从double更改为float(所有计算都是使用双精度计算)会发生什么变化。所以我将每个变量更改为float类型,并简单地将从Math方法返回的每个double转换为float。在几个场景中测试我的光线跟踪器显示了相当不错的性能提升。
在网上搜索我发现浮动可能更快的各种原因,但也有人说在64位环境中双倍可能会更快,甚至更快。问题是,我在64位环境和JVM中运行。这种性能提升的原因是什么?
现在,我正在阅读PBRT书,并计划在此之后从头开始重写光线跟踪器。为所有浮点计算选择浮点数会产生任何问题吗?在我的测试中我没有注意到任何东西,但是对于某些场景来说可能较低的精度(交叉点测试似乎可能会造成问题)?或者可能是一种权衡,比如在关键测试中使用double,为不太关键的计算使用float?我将不得不使用其他数学库来摆脱铸造,我会采用浮动方式。
答案 0 :(得分:6)
对于计算的速度,float和double之间几乎没有区别,只要桌面处理器是平台。差异只能来自增加的内存带宽要求,因为双倍需要两倍的空间。
它与基于GPU的计算不同,它们更适合浮动和例如Nvidia GPU大幅下降了两倍。
我采取混合方式;存储具有浮点精度的多边形数据,但以double为单位进行所有计算。占用内存小,精度高 - 双赢。
答案 1 :(得分:0)
我这么晚才回答,这可能与您无关,但可能对其他人有所帮助。我还在Go中作为个人项目(也使用PBR书)开发了光线追踪器,并且遇到了同样的问题... 32或64位浮点数。我认为我将使用32位的主要原因是:SIMDizing射线三角形相交测试。无论您的处理器可以使用哪种指令集(例如SSE4,AVX2,AVX512),每条指令的32位fp op运算量都是64位指令的2倍。