Optimization fortran矩阵向量乘法优化
我试图在Fortran中测量不同矩阵向量乘法方案的差异。我实际上编写了以下代码: “优化版本”旨在通过交换循环来访问矩阵元素,从而尊重矩阵的内存布局。所提供的代码应使用gfortran进行编译,并以以下相当令人惊讶的结果运行: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
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中使用制表符-有些编译器不喜欢它-而是使用空格
A(j,i) = (-1.0)**(i-j)
do i = 1,iterations
call optimized(A, m, n, x, y1)
x(1:n) = y1
end do