next up previous contents
Next: Intrinsic and Library Procedures Up: Extrinsic Program Units Previous: The Effect of a

Examples of Extrinsic Procedures

Consider:

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

The main program, DUMPLING, when compiled by an HPF compiler, is implicitly of extrinsic kind HPF. Interfaces are declared to three external subroutines GNOCCHI, POTSTICKER, and LEBERKNOEDEL. The first two are of extrinsic kind HPF_LOCAL and the third is of an extrinsic kind specified by the language COBOL and the local model. Now, GNOCCHI accepts two dummy procedure arguments and so interfaces must be declared for those. Because no extrinsic-prefix is given for dummy argument P, its extrinsic kind is that of its host scoping unit, the declaration of subroutine GNOCCHI, which has extrinsic kind HPF_LOCAL. The declaration of the corresponding actual argument POTSTICKER needs to have an explicit extrinsic-prefix because its host scoping unit is program DUMPLING, of extrinsic kind HPF.

Here are some more examples. In the first example, note that the declaration of the explicit size of BAGEL as 100 refers to its global size and not its local size:

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

In the next example, note that the ALIGN statement asserts that X, Y, and Z all have the same shape:

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

In the interface block in this final example, two external procedures, one of them extrinsic and one not, are associated with the same generic procedure name, which returns a scalar of the same type as its array argument:

INTERFACE KNISH
  FUNCTION RKNISH(X)                      !normal HPF interface
    REAL X(:), RKNISH
  END RKNISH
  EXTRINSIC('SISAL') FUNCTION CKNISH(X)   !extrinsic interface
    COMPLEX X(:), CKNISH
  END CKNISH
END INTERFACE


next up previous contents
Next: Intrinsic and Library Procedures Up: Extrinsic Program Units Previous: The Effect of a