Paralelize混合f77 f90 Fortran代码?

时间:2016-02-04 14:26:25

标签: multithreading fortran fortran90 gfortran fortran77

我有一个主要在f77编写的代码,但是也有用f90语法编写的例程。

我一直在阅读如何在每种情况下使用openMP,但现在我怀疑如果我在同一代码中同时使用两种语法,我应该怎么做?

更具体地说,我应该使用

  use omp_lib

  include 'omp_lib.h'

但是在同一个.f文件中,我有两个sintaxys。如果我同时使用两者怎么办?

我正在使用gfortran 4.8.4进行编译。

如果我使用let's say

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?

来识别

同样的问题恰恰相反。

1 个答案:

答案 0 :(得分:2)

首先,只有在调用OpenMP过程时才需要useinclude。如果您只有几个!$omp指令,则不需要它。

当你调用类似的程序时,你只需要这个:

   call omp_set_num_threads(1)

   tid = omp_get_thread_num()

但不适用于指令。

对于Fortran 90及更高版本的代码(即使是固定形式,看起来像Fortran 77)使用

use omp_lib

因为编译器能够更好地检查你是否正确调用了函数(它有一个明确的接口)。

如果代码是真的Fortran 77(而不仅仅是它看起来像),你必须使用include,尽管技术上Fortran 77甚至都不知道。这是Fortran 77的常见非标准扩展。