【问题标题】:Convert to long long, pros and cons in C转换成long long,C中的优缺点
【发布时间】:2013-02-05 06:26:57
【问题描述】:

我想使用 long long 而不是 double 数据类型来加速我的算法。我的算法是在定向acyclic graph (DAG) 中找到最短路径。简单地说,它增加了一条边"E: a->b" to b 的权重,如果b 的新权重低于之前的权重,它会连同其设置为a 的父项一起更新。

我的意思是,我的算法只是一些加法和比较操作。边的权重最初是"double",我是否可以将它们乘以一个大数并将它们转换为"long long"。如果此调整使我的程序更快并且值得考虑。我如何处理由于将big double 舍入到long long 而导致的不稳定问题。

谢谢

【问题讨论】:

  • 两者都试一下,然后比较您想要衡量的任何标准的结果。

标签: performance double type-conversion long-long


【解决方案1】:

在 i5 x64 上 even imul 似乎比双倍乘法快 40%。整数加法也应该以更少的周期/更好的吞吐量发生。关于“不精确”问题,您应该知道双精度数可能比整数更不精确。

Calculate which numbers cause problems when converting decimal to floating point?

如果您可以访问原始数据(例如权重的十进制表示形式,将它们乘以 10 的大幂应该会产生精确的整数,而不会产生任何舍入伪像。使用 long long 时,唯一需要担心的是溢出。

如何解决可能的舍入不稳定性取决于权重的动态范围以及最大迭代次数。例如。如果您的权重都小于 1.0 且大于 2^-52,则乘以 2^52 会得到精确的整数,没有舍入误差。那么“不稳定”是由溢出的可能性决定的。 (2^12 * 2^52) >= 2^64。

【讨论】:

  • 我有双打,但我想获得更多更快的代码。很可能它非常依赖于算法本身。
  • 继续 - 正如 J.P. 评论的那样,进行性能比较。 (我应该提到,在未公开的测试设置中,even imul 比双倍乘法要快一些——您可能主要使用加法。关键字“权重”是比较的可能原因乘法。)
  • 有什么想法可以在 GPU 上实现 DAG 的最短路径问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多