5.4 外部过程的例子 BACKWARD FORWARD


考虑:

  PROGRAM DUMPLING
    INTERFACE
     EXTRINSIC('HPF','LOCAL')SUBROUTINE GNOCCHI(P, L, X)
      INTERFACE
       SUBROUTINE P(Q)
        REAL Q
       END SUBROUTINE P
       EXTRINSIC('COBOL','LOCAL')SUBROUTINE L(R)
         REAL R(:,:)
       END SUBROUTINE L
       END INTERFACE
       REAL X(:)
      END SUBROUTINE GNOCCHI
      EXTRINSIC('HPF','LOCAL')SUBROUTINE POTSTICKER(Q)
       REAL Q
      END SUBROUTINE POTSTICKER
      EXTRINSIC('COBOL','LOCAL') SUBROUTINE LEBERKNOEDEL(R)
       REAL R(:,:)
      END SUBROUTINE LEBERKNOEDEL
      END INTERFACE
      ...
      CALL GNOCCHI(POTSTICKER,LEBERKNOEDEL,(/1.2,3.4,5.6/))
      ...
     END PROGRAM DUMPLING

HPF编译器在对主程序DUMPLING进行编译时,隐含认为它具有外部类HPF。接口被定义成三个外部子程序GNOCCHI,POTSTICKER,和LEBERKNOEDEL。头两个具有外部类HPF_LOCAL,第三个具有外部类COBOL_LOCAL。现在GNOCCHI接受两个哑过程参数,因此必须为它们定义接口。因为没有为哑参P给出外部前缀,因此它的外部类就是其宿主作用域单元的外部类,即子程序GNOCCHI所定义的外部类HPF_LOCAL。相应实参POTSTICKER需要具有一个显式外部前缀,这是因为它的宿主作用域单元是程序DUMPLING,且其外部类是HPF。

考虑下面的第二个例子:

  INTERFACE
   EXTRINSIC('HPF','LOCAL') FUNCTION BAGEL(X)
    REAL X(:)
    REAL BAGEL(100)
     !HPF$ DISTRIBUTE(CYCLIC) :: X,BAGEL
   END FUNCTION
  INTERFACE

  INTERFACE OPERATOR(+)
   EXTRINSIC('C','LOCAL') FUNCTION LATKES(X,Y) RESULT(Z)
    REAL, DIMENSION(:,:), INTENT(IN) :: X
    REAL, DIMENSION(:,:), INTENT(IN) :: Y
    REAL, DIMENSION(SIZE(X,1),SIZE(X,2)) :: Z
     !HPF$ ALIGN WITH X :: Y,Z
     !HPF$ DISTRIBUTE (BLOCK, BLOCK) X
   END FUNCTION
  END INTERFACE

  INTERFACE KNISH
   FUNCTION RKNISH(X)
    REAL X(:), RKNISH   !正常的HPF接口
   ENDRKNISH
   EXTRINSIC('SISAL') FUNCTION CKNISH(X)   !外部接口
    COMPLEX X(:), CKNISH
   END CKNISH
  END INTERFACE

在最后的接口模块中,两个外部过程一个是外部的而另一个不是,它们与同一普通的过程名建立关联且都返回一个具有相同类型的标量作为其数组参数。注意,将BAGEL的显式大小定义为100指的是它的全局大小而非其本地大小。还要注意,ALIGN语句声明X,Y,Z都具有相同的形状。


Copyright: NPACT BACKWARD FORWARD