Double 或 float - 优化例程

Posted

技术标签:

【中文标题】Double 或 float - 优化例程【英文标题】:Double or float - optimization routines 【发布时间】:2012-03-14 20:10:22 【问题描述】:

我正在阅读优化例程的代码(Nelder Mead、SQP...)。语言是 C++、Python。我观察到通常会执行从 double 到 float 的转换,或者使用 double resp 复制方法。浮动参数。为什么它在优化例程代码中是有利可图的,它是否重要?在我自己的 C++ 代码中,我应该注意 double 和 float 类型吗?为什么?

亲切的问候。

【问题讨论】:

如果您用 C++ 编写自己的代码,为什么没有适当地标记问题?我错过了一些微妙的东西吗? @HighPerformanceMark 我正在浏览 python(特别是 scipy 源代码)和 c++ 中的代码,并结合几种方法编写我自己的例程。我也应该用 c++ 标记。 除了上面提到的,对于除法和平方根,float和double在性能上的差别还是挺大的。但无论如何,在性能代码中应该避免这些操作。 @harold 避免使用这些运算符并将 thm 替换为 ... 什么(例如,当它是用户给定的要优化的表单时)? @dlib 视情况而定,并没有真正的替代品。例如,不是比较向量的长度,而是比较它们长度的平方。或者当一个向量除以一个标量时,将它乘以它的倒数(所以除法只发生一次 - 但对于 SIMD 中的短向量它只发生一次,所以它是关于比这更长的向量)。在 SSE 中有快速倒数平方根和倒数指令,但精度较低。有时这已经足够精确了。 【参考方案1】:

通常在doublefloat 之间进行选择更多是出于空间需求而不是速度。现代处理器能够非常快地在double 上运行。

在使用 SIMD 指令(例如 SSE)时,浮点数可能比双精度数更快,因为 SIMD 指令可以一次对多个值进行操作。此外,如果操作比内存管道更快,float 的较小内存需求将整体加快速度。

【讨论】:

准确性也是一个重要问题。在某些情况下,更改数据类型的精度可能会影响结果的准确性。【参考方案2】:

我遇到过需要考虑在优化方面选择 double 和 float 类型的其他时间包括:

网络。通过套接字连接发送双精度数据 显然需要比发送一半的时间更多的时间 数据。 移动和嵌入式处理器可能只能处理高 在协处理器上高效地加速单精度计算。

正如另一个答案中提到的,现代桌面处理器可以非常快地处理双精度处理。但是,您必须问自己是否 确实需要双精度处理。我从事音频工作, 也是唯一一次我能想到我需要处理的地方 双精度数据将在使用高阶过滤器时 数值误差会累积。大多数时候这是可以避免的 通过更加仔细地关注算法设计。有, 当然,在其他科学或工程应用中加倍 需要精确的数据才能正确表示一个巨大的 动态范围。

即便如此,在考虑要使用的数据类型上花费多少精力的问题实际上取决于您的目标平台。如果平台可以以可忽略的开销通过双打,并且您有可用的内存,那么您无需担心。分析一小段测试代码以找出答案。

【讨论】:

【参考方案3】:

在某些优化算法中,doublefloat 之间的选择不是更多地考虑空间需求而不是速度。例如,对于非线性优化中用于内点法的惩罚或障碍法,floatdouble 相比精度不足,在算法中使用floats 将产生垃圾。出于这个原因,惩罚和障碍方法在 1960 年代没有使用,但后来随着双精度数据类型的出现被重新发现。 (有关这些方法的更多信息,请参阅 Fiacco 和 McCormick 的非线性规划:序列无约束最小化技术(应用数学经典)。)

另一个考虑因素是在许多优化算法中解决的基础线性系统的条件。如果您以牛顿迭代之类的方式求解的线性系统具有足够的病态条件,则您将无法获得这些系统的准确解。

只有在精度损失不会危及您的数字时,您才应考虑将doubles 替换为floats;即使空间限制迫使您这样做,您也应该确保数值结果的准确性不受影响。一旦确保您正在处理的问题有足够的准确性,您就可以担心空间和性能优化。您可以使用CUTEr test set 来验证您的优化例程。

【讨论】:

以上是关于Double 或 float - 优化例程的主要内容,如果未能解决你的问题,请参考以下文章

NumPy数组创建例程

如何将 C_FLOAT 数组传递给 Fortran 子例程

numpy 数组创建例程

[Python]闭包(Closeure)

JAVA必知必问问题-1

优化例程代码示例