【问题标题】:Java raytracing float vs doubleJava 光线追踪浮点与双精度
【发布时间】:2015-09-12 08:33:30
【问题描述】:

上学期我们不得不为学校的一门课程开发光线追踪器。放学了,我试着摆弄一下。

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

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

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

【问题讨论】:

  • 我相信double d = 1d 是两条指令,而float f = 1f 是一条。即使在 64 位机器上。使用 64 位 JVM。
  • “我在 64 位环境中运行” 64 位操作系统不算作 64 位环境。您的编译器和其他工具(如果您正在使用 Java,例如 JVM)也必须是 64 位的。
  • 你能放一些代码吗!
  • @Code-Apprentice for Java 我认为 32/64 位编译之间没有真正的区别?我在 64 位版本的 JVM 上运行它。

标签: java floating-point raytracing


【解决方案1】:

计算速度而言,浮点数和双精度数几乎没有区别,因为桌面处理器是平台。差异只能来自增加的内存带宽需求,因为双倍需要两倍的空间。

它与基于 GPU 的计算不同,它们更适合浮点数,例如Nvidia GPU 的双倍性能大幅下滑。

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

【讨论】:

  • 感谢您的回答!这似乎是一个很好的权衡,我会尝试的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多