Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 什么';在Haskell中运行跨平台确定性仿真的最有效方法是什么?_Performance_Haskell_Floating Point_Floating Accuracy - Fatal编程技术网

Performance 什么';在Haskell中运行跨平台确定性仿真的最有效方法是什么?

Performance 什么';在Haskell中运行跨平台确定性仿真的最有效方法是什么?,performance,haskell,floating-point,floating-accuracy,Performance,Haskell,Floating Point,Floating Accuracy,我的目标是运行一个模拟,在不同的机器上运行一个非整数的数字,这些机器可能具有不同的CPU架构和操作系统。主要的优先事项是,给定相同的初始状态,每台机器应完全相同地再现模拟。其次,我希望计算的性能和精度尽可能接近双精度浮点 据我所知,似乎没有任何方法可以影响浮动的决定论 从Haskell程序中的点计算,类似于 C.控制> >代码fPUESETCW 宏,所以,现在我认为我的选项是 使用 使用 从包装中使用 编写一个模块,通过FFI调用\uuControlFP(或每个平台的等效模块) 可能,还有别的

我的目标是运行一个模拟,在不同的机器上运行一个非整数的数字,这些机器可能具有不同的CPU架构和操作系统。主要的优先事项是,给定相同的初始状态,每台机器应完全相同地再现模拟。其次,我希望计算的性能和精度尽可能接近双精度浮点

据我所知,似乎没有任何方法可以影响浮动的决定论 从Haskell程序中的点计算,类似于<代码> C.控制> <代码> >代码fPUESETCW 宏,所以,现在我认为我的选项是

  • 使用
  • 使用
  • 从包装中使用
  • 编写一个模块,通过FFI调用
    \uuControlFP
    (或每个平台的等效模块)
  • 可能,还有别的吗
  • 定点算术库的一个问题是,它们没有定义三角函数或对数(因为它们没有实现
    浮点
    类型类),因此我想我需要为模拟种子数据中的所有函数提供查找表。还是有更好的办法

    这两个固定点库还隐藏了
    newtype
    构造函数,因此,据我所知,任何(反)序列化都需要通过rational/
    中的
    torional
    /
    来完成,这似乎会增加不必要的开销


    我的下一步是对不同的定点解决方案进行基准测试,以了解真实世界的性能,但与此同时,我很乐意听取您在这个问题上的任何建议。

    IEEE 754-2008标准第11条描述了可复制浮点结果所需的内容。除此之外,还需要明确的表达式求值规则。有些语言允许以额外的精度计算浮点表达式,或者允许对表达式进行某些更改(例如在单个指令中计算
    a*b+c
    ,而不是单独的乘法和加法指令)。我不知道哈斯克尔的语义学。如果Haskell不能精确地将表达式映射到确定的浮点运算,那么它就不能支持可复制的浮点结果

    此外,由于您提到了三角函数和对数函数,请注意,它们因实现而异。我不知道有哪一个数学库提供了每个标准数学函数的正确的四舍五入实现。(这是一个创建数学库的项目。)因此每个数学库都使用自己的近似值,它们的结果略有不同。也许您可以通过在模拟代码中包含一个数学库来解决这个问题,这样就可以使用它来代替每个Haskell实现的默认库


    在二进制浮点和十进制数字之间转换的例程也是实现之间差异的来源。这已不像过去那样成为一个问题,因为正确转换的算法是已知的。但是,这可能需要在每个实现中检查。

    平台的多样性如何?在所有合理的方面,您都可以在32位平台上使用
    Double
    ,使用
    -msse2
    (默认情况下在64位上启用)。丹尼尔·菲舍尔:我不需要支持任何深奥的平台,但在32位和64位上都支持不同(现代)风格的Windows、Linux和MacOSX。阅读让我产生了这样的想法:仅仅依靠sse2指令在现实世界(tm)中可能是不够的,而使用定点算法可能不会那么痛苦。