fortran矩阵向量乘法优化

时间:2014-01-03 12:49:17

标签: optimization vector matrix fortran multiplication

我试图测量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提供了优化版本,但我只是出于好奇而对此进行测量。

先谢谢。

1 个答案:

答案 0 :(得分:2)

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

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中使用制表符 - 某些编译器不喜欢它 - 使用空格代替