【问题标题】:Why would a simply quotient cause so much overhead?为什么一个简单的商会导致这么多开销?
【发布时间】:2014-02-05 21:02:44
【问题描述】:

我正在为行列式 a 编写解析表达式:

  detW = &
  (one+be*(u11+u22+u33)-&
  be2*(u12sq+u13sq-u11*u22+u23sq-u11*u33-u22*u33)-&
  al2*(-(u11*u22)+u13sq*(one+three*be*u22)-six*be*u12*u13*u23+u23sq+three*be*u11*u23sq-&
  u11*u33-u22*u33-three*be*u11*u22*u33+u12sq*(one+three*be*u33))-&
  al3*(u13sq*u22-two*u12*u13*u23+u12sq*u33+u11*(u23sq-u22*u33))-&
  be3*(u13sq*u22-two*u12*u13*u23+u12sq*u33+u11*(u23sq-u22*u33))+&
  al*(u22+u33-three*be2*(u13sq*u22-two*u12*u13*u23+u12sq*u33)-&
  two*be*(u12sq+u13sq+u23sq-u22*u33)+&
  u11*(one+two*be*(u22+u33)-three*be2*(u23sq-u22*u33))))
  print*, 'detW = ', detW
  print*, 'ga3 = ', ga3
  detW = ga3/detW
  Ng = (det1*detW)**pt5

行列式的真值是以第一大部分为分母,以ga3为分子。我发现当我不计算这个行列式时,我的代码(总共约 176,000 行代码)大约需要 0.07 秒,而计算这个行列式会使整个程序花费大约 2.5 秒。此外,我发现罪魁祸首是detW = ga3/detW 行。当我将此行注释掉时,运行时间会回落到 0.07。

仅当detW = ga3/detW 行上的detW 的值恰好为1.0 时,才需要这么长时间。为什么会出现这种情况?为什么除以 1.0 会导致程序运行 3571% 的时间?

【问题讨论】:

  • 不知道为什么,但是如果 detW 为 1,您可以在其中添加一个 if 语句来简单地使 detW 等于 ga3,然后继续生活。
  • 谢谢,我知道解决方法 - 我主要好奇为什么会发生这种情况,因为此代码的任何现实世界实现几乎肯定首先不会有一个单一的行列式。

标签: runtime division fortran90 determinants


【解决方案1】:

我发现速度变慢的原因实际上是在 Ng = (det1*detW)**pt5 行中 - 使用 sqrt 可以大大减少时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多