Optimization fortran矩阵向量乘法优化

Optimization fortran矩阵向量乘法优化,optimization,vector,matrix,fortran,multiplication,Optimization,Vector,Matrix,Fortran,Multiplication,我试图在Fortran中测量不同矩阵向量乘法方案的差异。我实际上编写了以下代码: “优化版本”旨在通过交换循环来访问矩阵元素,从而尊重矩阵的内存布局。所提供的代码应使用gfortran进行编译,并以以下相当令人惊讶的结果运行: Vectors match! Calculations are OK. Optimized time: 0.34133333333333332 Naive time: 1.4133333333333331E-002 Ratio (t_optimized/t

我试图在Fortran中测量不同矩阵向量乘法方案的差异。我实际上编写了以下代码:

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

Vectors match! Calculations are OK.
Optimized time:  0.34133333333333332     
Naive time:   1.4133333333333331E-002
Ratio (t_optimized/t_naive):   24.150943396226417 
我可能犯了一个令人尴尬的错误,但我无法发现。 我希望其他人能帮助我

我知道fortran提供了一些优化版本,但我只是出于好奇才对其进行测量


提前谢谢。

好吧,这只是一个简单的妄想问题:

t_optimized = t2-t1/iterations
这肯定是错的。。。你可能是说

t_optimized = (t2-t1)/iterations
这样,我的速度提高了~2

我还需要纠正/调整一些其他事项:

  • 第一个循环是错误的,您试图将元素设置为超出这些边界。应改为:
  • 现代编译器相当智能。他们可能会注意到,您不会在循环体中更改函数调用的输入。然后他们可以优化你的整个循环!为了防止出现这种情况,我插入了以下行:
(对于
y2
)也是如此。不要忘记在每个基准测试开始时重新初始化
x

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

您在sub call之外修改了时间计算……非常感谢。我花了太多时间,没能发现这个简单的错误。谢谢你发现了另一个错误,我只用二次矩阵测试过。
A(j,i) = (-1.0)**(i-j) 
do i = 1,iterations
  call optimized(A, m, n, x, y1)  
  x(1:n) = y1
end do