提高Fortran代码运行效率以及速度

最近一直在研究自己的Fortran程序的运行效率,查阅了一些资料和做了大量的程序测试,总结如下:

 

程序编写方面:

1.Module的使用:尽可能多使用

某些数组以及变量值要重复用到,比如有多个子程序需要调用,存在两种情况:

(1)值已知,这种情况下单个变量值较常见,比如圆周率π,就用parameter声明在Module中;

real,parameter::pi=3.1415926

(2)值未知,这种情况下数组较常见,比如定义一个数组,用Module声明变量,封装在主程序前,然后在主程序中use Module,然后计算变量或者数组元素的值,这些值就会作为全局变量一直存在该数组或者变量中。要注意:在Module中不能实现分配动态数组功能。

Module Model1
integer::n1(8),n2(8),n3(8),Tn1(8)
end Module

program main
use Model1
n1(0)=0
call grid(L, D, n1, n2, n3)
forall(i=0:7)
    Tn1(i+1)=sum(n1(0:i+1))
end forall

实践证明,使用Module模块真的大大提高了程序的运行效率。

2.数组方面:高效访问数组

(1)连续地访问整个数组或是大部分数组时, 其访问速度是最快的。尽量在最少的数组操作下访问全部数组或其主要部分, 而避免在不同数组单元上分散地多次操作。当读或写一个数组时, 尽量使用数组名, 而避免使用指定每个单元的do 循环。Fortran 90 的数组语法允许在表达式中使用其名字以引用整个数组,使用效率最高。例如:

REAL::A (100 ,100)
A = 0.0
A=A+1 ! 以1 递增所有数组单元

(2)尽量正确引用多维数组并使其按以列为主自然升序排列以提高数组使用效率。在以列为主的自然升序排列下, 最左边的下标变化最快。多维数组在内存中按列排列,先列后行,先低维再高维。

如循环:

do i=1,3
   do j=1,5
       sum=sum+a(i,j)
   end do
end do

该数组是按以行为主的顺序访问,访问效率较低,修改一下效率就会大大提高:

do j=1,5
   do i=1,3
       sum=sum+a(i,j)
   end do
end do

3.循环:减少无效循环以及嵌套循环,减少循环次数,能用数组索引代替循环就用索引变化,也就是将do循环向量化;尽可能的使用Forall循环代替do循环。

do i=2,100:
    a(i)=b(i)*0.5
    c(i)=d(i-2)+e(i)+f(i)
    d(i)=c(i-1)+a(i)+f(i)
    f(i)=d(i)*2
end do

可以向量化为:

a(2:100)=b(2:100)*0.5
do i=2,100:
    c(i)=d(i-2)+e(i)+f(i)
    d(i)=c(i-1)+a(i)+e(i)
end do
f(2:100)=d(2:100)*2

进一步还可以向量化为:

a(2:100)=b(2:100)*0.5
f(2:100)=e(2:100)+f(2:100)
a(2:100)=a(2:100)+e(2:100)
do i=2,100:
    c(i)=d(i-2)+f(i)
    d(i)=c(i-1)+a(i)
end do
f(2:100)=d(2:100)*2

这样做的好处就是提高了循环的效率。 

 

后续更新,以上是基于自己的实践和查阅资料所得,希望有所帮助!有问题欢迎交流!

 

参考资料:

1.王国鸣. FORTRAN DO循环中某些赋值语句表达式的向量化[J]. 哈尔滨工业大学学报, 1982(4):33-41.

2.向毅斌, 陈敦军. Visual Fortran程序运行速度的优化方法[J]. 微型机与应用, 2000, 19(8):9-10.

3.高效使用Fortran数组https://blog.csdn.net/Fortran/article/details/340294

  • 12
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Fortran(Formula Translation)是一种编程语言,广泛用于科学计算和数值分析领域。它是世界上最早的高级程序设计语言之一,于1957年首次发布。Fortran在数值计算方面具有许多特点和优势。 首先,Fortran具有丰富的数值计算函数和库,可以轻松处理复杂的数学运算和科学计算任务。例如,Fortran提供了各种数值积分、微分、线性代数、傅立叶变换等函数,简化了数值计算的编程过程。 其次,Fortran是一种编译型语言,可以将源代码转换为机器语言,从而实现高效的数值计算。相比解释型语言,编译型语言能够更好地利用计算机硬件资源,提高程序的运行速度效率。 此外,Fortran具有良好的数组处理能力。它支持多维数组和矩阵运算,使得处理大规模数值数据的计算任务更加简洁和高效。这对于科学计算、模拟和仿真等领域来说非常重要。 Fortran还支持并行计算,可以利用多核处理器和并行计算机集群来加速数值计算。通过使用并行编程技术,可以将任务分解为多个并行子任务,从而实现更快的计算速度。 最后,Fortran是一种可移植的语言,能够在不同的操作系统和计算机平台上运行。这使得Fortran成为广泛使用的数值计算语言,广泛应用于物理学、天文学、工程学、气象学等领域的科学研究和工程计算。 总之,Fortran是一种功能强大且成熟的数值计算语言,具有丰富的函数库、高效的编译执行和良好的可移植性。它在科学计算和数值分析领域有着广泛的应用价值,为科学家和工程师提供了一个强大的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值