【问题标题】:fortran matrix vector multiplication optimizationfortran 矩阵向量乘法优化
【发布时间】:2014-01-03 12:49:17
【问题描述】:

我试图测量 Fortran 中不同矩阵向量乘法方案的差异。我实际上已经写了以下代码:http://pastebin.com/dmKXdnX6

“优化版本”旨在尊重矩阵的内存布局,通过交换循环来访问矩阵元素。提供的代码应该使用 gfortran 编译,并且运行时会产生以下相当令人惊讶的结果:

Vectors match! Calculations are OK.
Optimized time:  0.34133333333333332     
Naive time:   1.4133333333333331E-002
Ratio (t_optimized/t_naive):   24.150943396226417 

我可能犯了一个令人尴尬的错误,但我无法发现它。 我希望其他人可以帮助我。

我知道 fortran 提供了优化的版本,但我只是出于好奇而对此进行衡量。

提前致谢。

【问题讨论】:

  • 你在子调用之外搞砸了时间计算...

标签: optimization vector matrix fortran multiplication


【解决方案1】:

嗯,这是一个简单的括号问题:

t_optimized = t2-t1/iterations

肯定是错的……你可能是说

t_optimized = (t2-t1)/iterations

这样我得到了约 2 的加速。

我需要纠正/调整的其他几件事:

  • 第一个循环是错误的,您试图将元素设置在边界之外。它应该是:
A(j,i) = (-1.0)**(i-j) 
  • 现代编译器非常智能。他们可能注意到您没有在循环体内改变函数调用的输入。然后他们可以优化你的整个循环!为了防止这种情况,我插入了以下行:
do i = 1,iterations
  call optimized(A, m, n, x, y1)  
  x(1:n) = y1
end do

y2 也是如此)。不要忘记在每个基准测试开始时重新初始化x

  • 不要使用太多; - 除非您想在一行中放置多个语句,否则不需要它
  • 不要在 Fortran 中使用制表符 - 一些编译器不喜欢它 - 改用空格

【讨论】:

  • 非常感谢。我花了这么多时间,却无法发现这个简单的错误。感谢您发现另一个错误,我只用二次矩阵对其进行了测试。
猜你喜欢
  • 2012-04-11
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多