Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 并行化混合F77F90Fortran代码?_Multithreading_Fortran_Fortran90_Gfortran_Fortran77 - Fatal编程技术网

Multithreading 并行化混合F77F90Fortran代码?

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

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

我一直在阅读如何在每种情况下使用openMP,但现在我有一个疑问,如果我在同一代码中使用了这两种语法,我该怎么做

更具体地说,我应该使用

  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