Multithreading 并行化混合F77F90Fortran代码?
我有一个主要用f77编写的代码,但是也有用f90语法编写的例程 我一直在阅读如何在每种情况下使用openMP,但现在我有一个疑问,如果我在同一代码中使用了这两种语法,我该怎么做 更具体地说,我应该使用Multithreading 并行化混合F77F90Fortran代码?,multithreading,fortran,fortran90,gfortran,fortran77,Multithreading,Fortran,Fortran90,Gfortran,Fortran77,我有一个主要用f77编写的代码,但是也有用f90语法编写的例程 我一直在阅读如何在每种情况下使用openMP,但现在我有一个疑问,如果我在同一代码中使用了这两种语法,我该怎么做 更具体地说,我应该使用 use omp_lib 或 但在同一个.f文件中,我有两个sintaxys。如果我两者都用呢 我正在使用gfortran 4.8.4进行编译 如果我使用,让我们说 use omp_lib (meaning f90 syntax) 然后我必须使用相应的语法 !$omp parallel sh
use omp_lib
或
但在同一个.f文件中,我有两个sintaxys。如果我两者都用呢
我正在使用gfortran 4.8.4进行编译
如果我使用,让我们说
use omp_lib (meaning f90 syntax)
然后我必须使用相应的语法
!$omp parallel shared ( var1, var2 ) private ( i, j )
!$omp do
do j = 1, n
do i = 1, m
var1(i,j) = var2
end do
end do
!$omp end do
然而,在接下来的几行中,我将用f77编写一个do循环
c$omp parallel shared ( w ) private ( i, j )
c$omp do
do 20 i = 10, 1, -2
write(*,*) 'i =', i
20 continue
c$omp end do
但是这种调用并行循环的方式可以通过使用omp_lib来识别
同样的问题是相反的。首先,只有在调用OpenMP过程时,才需要
使用或包含。如果你只有两个$omp
指令不需要它
您只需要在调用以下过程时使用此选项:
call omp_set_num_threads(1)
或
tid = omp_get_thread_num()
但不是为了指令
对于Fortran 90和更高版本的代码(即使是看起来像Fortran 77的固定格式)使用
因为编译器可以更好地检查您是否正确调用了函数(它有一个显式接口)
如果代码是真实的Fortran 77(而不仅仅是看起来像),则必须使用include
,尽管从技术上讲Fortran 77甚至不知道这一点。这是Fortran 77的一个常见的非标准扩展。我一个字也不懂,但对于Fortran的问题+1:-)使用tag,因为人们通常都会使用它。顺便说一句,你的c$omp
不一定是Fortran 77,也不一定是Fortran 77。它是固定格式的,但即使是Fortran 2008也可以固定格式。你可以在那里使用Fortran 90和更高版本的功能。很好!,我在问题中添加了一些额外的疑问,你能再检查一遍吗?@Nikko,正如我在第一段中所写的,在这种情况下你根本不需要它!但是如果需要,use omp_lib
可以在这两种情况下使用。但不仅仅是指令需要它。好吧,如果我理解正确的话。我将只使用omp_lib,我将添加$omp并行共享(var1,var2)私有(i,j)$omp do$omp end对循环不起作用,即使它们是用f77语法编写的。这将使代码使用其他可用的内核,对吗?(有没有一种方法可以通用地定义内核的数量?)。这没什么害处,但最好知道什么时候你真的需要它。指令必须采用正确的格式(固定格式或自由格式,而不是您所称的Fortran 77或90)。另一件让我担心的事情是,整个文件必须始终采用自由格式或固定格式,您不能将其混合在一个文件中!自由格式文件通常为.f90
,固定格式文件通常为.f
。
tid = omp_get_thread_num()
use omp_lib