fortran 语言使用

! fortran 统计时间
 REAL time_begin,time_end
 CALL CPU_TIME (time_begin)


 CALL CPU_TIME (time_end)
 PRINT *, 'Time of operation was ', time_end - time_begin, ' seconds'

fortran openmp使用

4、常用到的两个函数:
OMP_SET_NUM_THREADS(NUMBER) 用于设置你所需要的线程数NUMBER
OMP_GET_THREAD_NUM()
5、另外两个常用的指令:
  !$OMP DO 和!$OMP END DO表明接下来的循环将被并行执行;
 !$OMP SECTION和!$OMP END SECTION表明指定段中的代码被分配到线程组的线程中执行。
这两个指令对应着一些参数设置,在此就不赘述了。
获取当前程序运行的线程号
 TID = OMP_GET_THREAD_NUM()



并行do时  
最外面需要使用 !$OMP PARALLEL


!$OMP PARALLEL DO



区域并行

!$OMP PARALLEL
  代码区
!$OMP END PARALLEL


循环do并行
!$OMP DO [clause ...] 
         SCHEDULE (type [,chunk]) 
         ORDERED 
         PRIVATE (list) 
         FIRSTPRIVATE (list) 
         LASTPRIVATE (list) 
         SHARED (list) 
         REDUCTION (operator | intrinsic : list) 
         COLLAPSE (n) 
   do循环
!$OMP END DO  [ NOWAIT ]



fortran 特有的方式WORKSHARE,在不能多线程计算的程序代码块,可以用这种方式声明只能有一个thread进行计算

$OMP WORKSHARE
  FORALL statements
  FORALL constructs
  WHERE statements
  WHERE constructs等等 
!$OMP END WORKSHARE [ NOWAIT ]



在不能多线程计算的程序代码块,可以用这种方式声明只能有一个thread进行计算
!$OMP SINGLE [clause ...] 
             PRIVATE (list) 
             FIRSTPRIVATE (list) 

   代码区
!$OMP END SINGLE [ NOWAIT ]



代码编译的时候,需要加上-openmp(ifort)或者-fopenmp(gfortran),并且需要通过OMP_NUM_THREADS控制线程数目,对于存在大数组的程序,需要ulimit -s unlimited;export OMP_STACKSIZE=200000调大栈大小来消除segment fault (gfortran是GOMP_STACKSIZE,intel fortran是KMP_STACKSIZE)要彻底消除这个问题,可以通过将所有数组改成allocatable放到堆上来解决。
 PROGRAM HELLO
      use omp_lib
      integer tid
!$OMP PARALLEL PRIVATE(TID)
      TID = OMP_GET_THREAD_NUM()
      PRINT *, 'Hello World from thread = ', TID
!$OMP END PARALLEL
      END
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解决这个问题。 首先,你需要安装LAPACK库,然后在你的Fortran程序中引入它。LAPACK中的DGGEV函数可以计算一对广义实对称矩阵的特征值和特征向量。下面是一个简单的示例程序,可以用于计算两个3x3矩阵的特征值和特征向量: ``` program dggev_example implicit none integer, parameter :: n = 3 real*8 :: a(n,n), b(n,n), alpha(n), beta(n) real*8 :: vl(n,n), vr(n,n) integer :: lda, ldb, ldvl, ldvr, lwork, info real*8, allocatable :: work(:) ! Initialize input matrices a and b a = reshape((/1.0, 2.0, 3.0, & 2.0, 4.0, 5.0, & 3.0, 5.0, 6.0/), [n,n]) b = reshape((/1.0, 0.0, 0.0, & 0.0, 2.0, 0.0, & 0.0, 0.0, 3.0/), [n,n]) ! Set leading dimensions for input matrices lda = n ldb = n ! Allocate workspace lwork = 3*n allocate(work(lwork)) ! Call DGGEV to compute eigenvalues and eigenvectors call dggev('V', 'V', n, a, lda, b, ldb, alpha, beta, & vl, ldvl, vr, ldvr, work, lwork, info) ! Print results if (info .eq. 0) then write(*,*) 'Eigenvalues:' write(*,'(3f10.6)') alpha write(*,*) 'Eigenvectors:' write(*,'(3f10.6)') vl(:,1), vl(:,2), vl(:,3) else write(*,*) 'Error in DGGEV:', info end if ! Deallocate workspace deallocate(work) end program dggev_example ``` 在这个示例程序中,我们初始化了两个3x3矩阵a和b,并将它们作为输入传递给DGGEV函数。我们还为a和b指定了它们的主要维度,并为工作空间分配了内存。最后,我们调用DGGEV函数来计算特征值和特征向量,并将结果打印出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值