5.4 外部过程的例子 |
考虑:
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 |