为什么一个简单的商会导致如此多的开销?

时间:2014-02-05 21:02:44

标签: runtime division fortran90 determinants

我正在使用分析表达式对行列式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。

detWdetW = ga3/detW的值恰好为1.0时,只需要很长时间。为什么会这样?为什么除以1.0会导致程序运行时间长达3571%?

1 个答案:

答案 0 :(得分:0)

我发现减速的来源实际上是在Ng = (det1*detW)**pt5行 - 使用sqrt大大减少了时间。