关于程序生成,聚类和GPU卸载的浮点确定性

我在空闲时间里已经devise了一个分布式程序生成系统,最近我一直在考虑的一个问题,就更广泛的架构而言,当你不能确保你有一个运行持久世界的同类机器集群。

我的devise的一部分要求任何给定的机器可以根据需要重新生成程序内容,从而允许在任何可用的机器上完成工作,根据需要销毁并重新创建不重要但资源匮乏的内容。

我一直在基本思想上运行,我将使用高精度的32/64位整数来处理大多数事情,而且一般工作正常,但是标准的相干噪声algorithm在计算中都使用浮点值。

  • 我是否需要实现所有这些algorithm的自定义非浮点版本(即使用long)还是有更好的方法?
  • 我是否应该使用定点types来处理这种事情,如果是这样的话,那么如果可能的话,这会如何影响我的select,以便将部分PCG工作卸载到GPU上? 另外,固定点types是否足够快,可以在游戏引擎中大量使用?
  • 我可以忽略浮点精度问题,如果我可以摆脱最高水平的精度? 即,如果我很乐意使用不超过六位小数的结果,这是否保持我在不同的机器和架构安全?

注意:我的引擎纯粹是事物的模拟方面。 当用户玩游戏时,如果渲染不一致,那对我来说并不重要; 重要的是无论集群中的哪台机器都在做这项工作,程序化生成的源数据会一直重新生成。

我可以忽略浮点精度问题,如果我可以摆脱最高水平的精度? 即,如果我很乐意使用不超过六位小数的结果,这是否保持我在不同的机器和架构安全?

这完全取决于你的需求。 如果您必须确保在具有相同input的不同硬件上重复执行相同的输出,则答案可能不是。 浮点algorithm有足够的摆动空间,没有广泛的testing,这种方法相当于猜测和希望。 经常被引用的需要阅读的是每个计算机科学家应该知道的关于浮点运算的知识 ; 这是一个很好的作品,当我进行科学计算时,我经常反思的是,但是早于IEEE 754-2008 ,因此可能不会再讲完整的内容。

我是否应该使用定点types来处理这种事情,如果是这样的话,那么如果可能的话,这会如何影响我的select,以便将部分PCG工作卸载到GPU上?

固定点只能解决不一致的问题,如果你可以确保事情不会在你自己的代码中或者在库调用的背后变成浮点。

另外,固定点types是否足够快,可以在游戏引擎中大量使用?

在这篇文章中最近有些涉及这个问题 。 简而言之,这取决于。 您正在执行的操作,执行的频率,使用的硬件以及量化的性能预期都是决定是否足够好的因素。 如果你必须确保输出的一致性,你可能没有其他可行的select。

我是否需要实现所有这些algorithm的自定义非浮点版本(即使用long)还是有更好的方法?

大多数语言都有定点math库。 可能值得search分布式科学计算资源。

作为替代scheme,您可以考虑为需要确保一致性的输出构建某种校验和操作。 这并不能解决原来的问题,但确实可以让你确定问题是否在你的系统中体现出来。 (IE快速确定不匹配的输出)。 完全有可能这种情况发生得如此之less,以至于避免这个问题是不值得的,但通过调和不同的结果更容易处理。