如何使用 OpenMP 使用 SAVE 和 ENTRY 语句重写代码?

问题描述 投票:0回答:0

我正在为 OpenMP 使用重写一个大型 Fortran-77 程序,其中一个文件包含一个子例程,其中标记为 SAVE 的重要变量在第一次调用主程序时被初始化,然后在同一个子例程中调用时使用它们通过入口点。 我决定用一个包含多个子程序的模块(其功能通过 ENTRY 点调用)用一个长子程序替换这个文件,并在 CONTAINS 语句之前列出源程序中标记为 SAVE 的那些重要变量,以便它们在所有模块子程序调用中都可用。

但是,我无法使用该功能。我还能如何在子例程中重写 SAVE-ENTRY 结构? 我的最小主程序示例:

c     elementary program to add two numbers, using 
c     a module containing important variables and 
c     two addition functions, one for the case where 
c     one number is zero and the second for the case
c     of non-zero terms

      PROGRAM sum0
      USE SUMM
      INTEGER i,j
      WRITE (6,*) 'Enter two numbers: '
      READ (5,*) i,j

      IF (i .EQ. 0) THEN
          CALL sum1(j)
      ELSE IF (j .EQ. 0) THEN
          CALL sum1(i)
      ELSE
          CALL sum2(i,j)
      ENDIF

      END PROGRAM sum0

和模块:

      MODULE SUMM
            IMPLICIT NONE
c           "important" variables that had the status SAVE: 
            REAL B(2,2), K
c           initialization via DATA works similarly to SAVE (I think so): 
            DATA B/1.0,-3.7,4.3,0.0/, K/33.0/

        CONTAINS
            SUBROUTINE sum2(i1,j1)
                INTEGER i1,j1
                i1 = i1 + j1
                WRITE (6,*) 'The first element of B is', B(1,1), '.'
                WRITE (6,*) 'The K is', K, '.'
                WRITE (6,*) 'The sum of the numbers is', i1, '.'
            END SUBROUTINE sum2

            SUBROUTINE sum1(i1)
                INTEGER i1
                WRITE (6,*) 'The first element of B is', B(1,1), '.'
                WRITE (6,*) 'The K is', K, '.'
                WRITE (6,*) 'The sum of the numbers is', i1, '.'
            END SUBROUTINE sum1
      END MODULE SUMM

原文件:

      SUBROUTINE SUMM
      IMPLICIT NONE
      REAL B(2,2), K
      DATA B/1.0,-3.7,4.3,0.0/
      SAVE
      K = 33.0
      
      RETURN

      ENTRY sum2(i,j)
      i = i + j
      WRITE (6,*) 'The first element of B is', B(1,1), '.'
      WRITE (6,*) 'The K is', K, '.'
      WRITE (6,*) 'The sum of the numbers is', i, '.'
      RETURN

      ENTRY sum1(i)
      WRITE (6,*) 'The first element of B is', B(1,1), '.'
      WRITE (6,*) 'The K is', K, '.'
      WRITE (6,*) 'The sum of the numbers is', i, '.'
      RETURN

      END

欢迎任何帮助!

multithreading fortran refactoring openmp fortran77
© www.soinside.com 2019 - 2024. All rights reserved.