7.9 派生类型部件的映射 |
ALIGN,DISTRIBUTE或DYNAMIC指令可出现在部件定义语句(component-def-stmt)的派生类型定义(derived-type-def)中。在这种指令中的每个对准子或分配子必须是派生类型定义中所定义的部件名。为允许结构部件的映射,必须将规则扩展为如下形式:
H707 distributee-extended is object-name or template-name or component-name or structure-component
如果一个派生类型的任何部件被显式映射或者如果它的任何一个部件是显式映射类型,则该派生类型被认为是显式映射类型。
约束:派生类型的一个部件可被显式分配仅当该部件的类型不是显式映射类型。
约束:一个派生类型的变量或数组可被显式分配仅当该派生类型不是显式映射类型。
约束:DISTRIBUTE指令中的分配子不能是结构部件。
约束:出现在派生类型定义中的DISTRIBUTE指令的分配子必须是派生类型部件的部件名。
约束:仅对于出现在派生类型定义中的DISTRIBUTE指令,部件名才可以作为分配子出现。
约束:一个结构部件的分配子仅能出现在REDISTRIBUTE指令中并且除最右端外的每个引用部分(part-ref)必须是标量(0维)。结构部件中最右的名字部分(part-name)必须具有DYNAMIC属性。
H708 alignee-extended is object-name or component-name or structure-component
约束:派生类型的一个部件可被显式对准仅当该部件的类型不是显式映射类型。
约束:一个派生类型的变量或数组可被显式对准仅当该派生类型不是显式映射类型。
约束:ALIGN指令中的对准子不能是一个结构部件。
约束:出现在派生类型定义中的ALIGN指令的对准子必须是派生类型部件的部件名。
约束:仅对于出现在派生类型定义中的ALIGN指令,部件名才可以作为对准子出现。
约束:一个结构部件的对准子仅能出现在REALIGN指令中并且除最右端外的每个引用部分(part-ref)必须是标量(0维)。结构部件中最右的名字部分(part-name)必须具有DYNAMIC属性。
H709 align-target-extended is object-name or template-name or component-name or structure-component
约束:一个部件名可以作为一个对准目标出现仅当ALIGN指令出现在派生类型定义中。
约束:仅对于出现在派生类型定义中的ALIGN指令,部件名才可以作为对准目标出现。
约束:在一个结构部件的对准目标中,除最右端外每个引用部分都必须是标量(0维)。
上面的约束表明派生类型定义中的部件可在派生类型定义中被映射,这样当创建该类型的任意一个对象时,具有指定映射的部件同时被创建。
派生类型定义中的一个对准指令可将一个派生类型的部件与另外一个相同派生类型的部件相对准或者与其它的对象相对准。可将结构部件用作一个目标来对准包括派生类型部件在内的其它对象。
如果一个派生类型的部件已被定义为DYNAMIC,则可使用REDISTRIBUTE或REALIGN指令对该类型一个对象的这一部件进行重映射。
例子:
TYPE SIMPLE REAL S(100) !HPF$ DISTRIBUTE S(BLOCK) END TYPE SIMPLE
!HPF$ TEMPLATE, DISTRIBUTE(BLOCK, *) :: HAIRY_TEMPLATE(47,73)
TYPE COMPLICATED INTEGER SIZE REAL RV(100,100), KV(100,100), QV(47,73) ! 可对数组RV, KV, and QV 进行映射 !HPF$ DISTRIBUTE (BLOCK, BLOCK):: RV, KV !HPF$ ALIGN WITH HAIRY_TEMPLATE :: QV TYPE(SIMPLE) SV(100) ! 下列指令是无效的,因为SIMPLE ! 是一个显式映射类型。 !HPF$ DISTRIBUTE SV(BLOCK) END TYPE COMPLICATED
TYPE(COMPLICATED) LOTSOF(20)
! 下列指令是无效的,因为COMPLICATED ! 是一个显式映射类型。 !HPF$ DISTRIBUTE LOTSOF(BLOCK)
在这里,已对派生类型的一个部件进行了映射;这样此类型的对象,例如COMPLICATED类型中的SV,不能被分配。同样原因,数组LOTSOF也不能被分配。
如果结构的部件被定义成DYNAMIC,则可使用REDISTRIBUTE或REALIGN指令对它们进行重映射。例如,可使用下列代码段对一个多块网格的多个块(在这里称之为SUBGRID)进行分配空间和映射:
!HPF$ PROCESSORS P( number_of_processors() )
TYPE SUBGRID INTEGER SIZE INTEGER LO, HI ! 处理器的目标子集 REAL, POINTER BL(:) !HPF$ DYNAMIC BL END TYPE SUBGRID
TYPE (SUBGRID), ALLOCATABLE :: GRID(:)
READ (*,*) SUBGRID_COUNT ALLOCATE GRID(SUBGRID_COUNT) DO I = 1, SUBGRID_COUNT READ(*,*) GRID(I)%SIZE END DO
!计算每个子网格的处理器子集, 并为LO和HI赋值 CALL FIGURE_THE_PROCS ( GRID, number_of_processors()) ! 分配每个子网格的空间并向计算出的处理器子集进行分配 DO I = 1, SUBGRID_COUNT ALLOCATE( GRID(I)%BL( GRID(I)%SIZE ) ) !HPF$ REDISTRIBUTE GRID(I)%BL(BLOCK) ONTO P( GRID(I)%LO : GRID(I)%HI) END DO
Copyright: NPACT |