Skip to content

Commit

Permalink
Add GET_DATA, SYNCHOST and NULLIFY
Browse files Browse the repository at this point in the history
  • Loading branch information
ecossevin committed Apr 27, 2024
1 parent 348e1bb commit d1cf092
Show file tree
Hide file tree
Showing 2 changed files with 287 additions and 18 deletions.
217 changes: 204 additions & 13 deletions transformations/tests/test_parallel_routine_dispatch.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,19 +138,6 @@ def test_parallel_routine_dispatch_derived_var(here, frontend):
transformation.apply(source['dispatch_routine'])


## test_dcls=["REAL(KIND=JPRB), POINTER :: Z_YDVARS_U_T0(:, :, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDVARS_Q_DM(:, :, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDVARS_GEOMETRY_GELAM_T0(:, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDVARS_CVGQ_T0(:, :, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDVARS_Q_DL(:, :, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDVARS_V_T0(:, :, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDVARS_GEOMETRY_GEMU_T0(:, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDVARS_Q_T0(:, :, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDCPG_PHY0_XYB_RDELP(:, :, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDVARS_CVGQ_DM(:, :, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDCPG_DYN0_CTY_EVEL(:, :, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDMF_PHYS_SURF_GSD_VF_PZ0F(:, :)",
##"REAL(KIND=JPRB), POINTER :: Z_YDVARS_CVGQ_DL(:, :, :)"]
test_map = {
"YDVARS%GEOMETRY%GEMU%T0" : ["YDVARS%GEOMETRY%GEMU%FT0", "Z_YDVARS_GEOMETRY_GEMU_T0"],
"YDVARS%GEOMETRY%GELAM%T0" : ["YDVARS%GEOMETRY%GELAM%FT0", "Z_YDVARS_GEOMETRY_GELAM_T0"],
Expand All @@ -173,3 +160,207 @@ def test_parallel_routine_dispatch_derived_var(here, frontend):

assert test_map[var_name][0] == field_ptr.name
assert test_map[var_name][1] == ptr.name

@pytest.mark.parametrize('frontend', available_frontends(skip=[OMNI]))
def test_parallel_routine_dispatch_get_data(here, frontend):

source = Sourcefile.from_file(here/'sources/projParallelRoutineDispatch/dispatch_routine.F90', frontend=frontend)
routine = source['dispatch_routine']

transformation = ParallelRoutineDispatchTransformation()
transformation.apply(source['dispatch_routine'])

get_data = transformation.get_data

test_get_data = {}
# test_get_data["OpenMP"] = """
#IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:GET_DATA', 0, ZHOOK_HANDLE_FIELD_API)
#ZRDG_CVGQ => GET_HOST_DATA_RDWR(YL_ZRDG_CVGQ)
#ZRDG_MU0 => GET_HOST_DATA_RDWR(YL_ZRDG_MU0)
#ZRDG_MU0LU => GET_HOST_DATA_RDWR(YL_ZRDG_MU0LU)
#ZRDG_MU0M => GET_HOST_DATA_RDWR(YL_ZRDG_MU0M)
#ZRDG_MU0N => GET_HOST_DATA_RDWR(YL_ZRDG_MU0N)
#Z_YDCPG_DYN0_CTY_EVEL => GET_HOST_DATA_RDONLY(YDCPG_DYN0%CTY%F_EVEL)
#Z_YDCPG_PHY0_XYB_RDELP => GET_HOST_DATA_RDONLY(YDCPG_PHY0%XYB%F_RDELP)
#Z_YDVARS_CVGQ_DL => GET_HOST_DATA_RDONLY(YDVARS%CVGQ%FDL)
#Z_YDVARS_CVGQ_DM => GET_HOST_DATA_RDONLY(YDVARS%CVGQ%FDM)
#Z_YDVARS_CVGQ_T0 => GET_HOST_DATA_RDONLY(YDVARS%CVGQ%FT0)
#Z_YDVARS_GEOMETRY_GELAM_T0 => GET_HOST_DATA_RDONLY(YDVARS%GEOMETRY%GELAM%FT0)
#Z_YDVARS_GEOMETRY_GEMU_T0 => GET_HOST_DATA_RDONLY(YDVARS%GEOMETRY%GEMU%FT0)
#Z_YDVARS_Q_DL => GET_HOST_DATA_RDONLY(YDVARS%Q%FDL)
#Z_YDVARS_Q_DM => GET_HOST_DATA_RDONLY(YDVARS%Q%FDM)
#Z_YDVARS_Q_T0 => GET_HOST_DATA_RDONLY(YDVARS%Q%FT0)
#Z_YDVARS_U_T0 => GET_HOST_DATA_RDONLY(YDVARS%U%FT0)
#Z_YDVARS_V_T0 => GET_HOST_DATA_RDONLY(YDVARS%V%FT0)
#Z_YDMF_PHYS_SURF_GSD_VF_PZ0F => GET_HOST_DATA_RDONLY(YDMF_PHYS_SURF%GSD_VF%F_Z0F)
#IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:GET_DATA', 1, ZHOOK_HANDLE_FIELD_API)
#"""
test_get_data["OpenMP"] = """
IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:GET_DATA', 0, ZHOOK_HANDLE_FIELD_API)
ZRDG_CVGQ => GET_HOST_DATA_RDWR(YL_ZRDG_CVGQ)
ZRDG_MU0 => GET_HOST_DATA_RDWR(YL_ZRDG_MU0)
ZRDG_MU0LU => GET_HOST_DATA_RDWR(YL_ZRDG_MU0LU)
ZRDG_MU0M => GET_HOST_DATA_RDWR(YL_ZRDG_MU0M)
ZRDG_MU0N => GET_HOST_DATA_RDWR(YL_ZRDG_MU0N)
Z_YDCPG_DYN0_CTY_EVEL => GET_HOST_DATA_RDWR(YDCPG_DYN0%CTY%F_EVEL)
Z_YDCPG_PHY0_XYB_RDELP => GET_HOST_DATA_RDWR(YDCPG_PHY0%XYB%F_RDELP)
Z_YDVARS_CVGQ_DL => GET_HOST_DATA_RDWR(YDVARS%CVGQ%FDL)
Z_YDVARS_CVGQ_DM => GET_HOST_DATA_RDWR(YDVARS%CVGQ%FDM)
Z_YDVARS_CVGQ_T0 => GET_HOST_DATA_RDWR(YDVARS%CVGQ%FT0)
Z_YDVARS_GEOMETRY_GELAM_T0 => GET_HOST_DATA_RDWR(YDVARS%GEOMETRY%GELAM%FT0)
Z_YDVARS_GEOMETRY_GEMU_T0 => GET_HOST_DATA_RDWR(YDVARS%GEOMETRY%GEMU%FT0)
Z_YDVARS_Q_DL => GET_HOST_DATA_RDWR(YDVARS%Q%FDL)
Z_YDVARS_Q_DM => GET_HOST_DATA_RDWR(YDVARS%Q%FDM)
Z_YDVARS_Q_T0 => GET_HOST_DATA_RDWR(YDVARS%Q%FT0)
Z_YDVARS_U_T0 => GET_HOST_DATA_RDWR(YDVARS%U%FT0)
Z_YDVARS_V_T0 => GET_HOST_DATA_RDWR(YDVARS%V%FT0)
Z_YDMF_PHYS_SURF_GSD_VF_PZ0F => GET_HOST_DATA_RDWR(YDMF_PHYS_SURF%GSD_VF%F_Z0F)
IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:GET_DATA', 1, ZHOOK_HANDLE_FIELD_API)
"""
test_get_data["OpenMPSingleColumn"] = test_get_data["OpenMP"]

# test_get_data["OpenACCSingleColumn"] = """
#IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:GET_DATA', 0, ZHOOK_HANDLE_FIELD_API)
#ZRDG_CVGQ => GET_DEVICE_DATA_RDWR(YL_ZRDG_CVGQ)
#ZRDG_MU0 => GET_DEVICE_DATA_RDWR(YL_ZRDG_MU0)
#ZRDG_MU0LU => GET_DEVICE_DATA_RDWR(YL_ZRDG_MU0LU)
#ZRDG_MU0M => GET_DEVICE_DATA_RDWR(YL_ZRDG_MU0M)
#ZRDG_MU0N => GET_DEVICE_DATA_RDWR(YL_ZRDG_MU0N)
#Z_YDCPG_DYN0_CTY_EVEL => GET_DEVICE_DATA_RDONLY(YDCPG_DYN0%CTY%F_EVEL)
#Z_YDCPG_PHY0_XYB_RDELP => GET_DEVICE_DATA_RDONLY(YDCPG_PHY0%XYB%F_RDELP)
#Z_YDVARS_CVGQ_DL => GET_DEVICE_DATA_RDONLY(YDVARS%CVGQ%FDL)
#Z_YDVARS_CVGQ_DM => GET_DEVICE_DATA_RDONLY(YDVARS%CVGQ%FDM)
#Z_YDVARS_CVGQ_T0 => GET_DEVICE_DATA_RDONLY(YDVARS%CVGQ%FT0)
#Z_YDVARS_GEOMETRY_GELAM_T0 => GET_DEVICE_DATA_RDONLY(YDVARS%GEOMETRY%GELAM%FT0)
#Z_YDVARS_GEOMETRY_GEMU_T0 => GET_DEVICE_DATA_RDONLY(YDVARS%GEOMETRY%GEMU%FT0)
#Z_YDVARS_Q_DL => GET_DEVICE_DATA_RDONLY(YDVARS%Q%FDL)
#Z_YDVARS_Q_DM => GET_DEVICE_DATA_RDONLY(YDVARS%Q%FDM)
#Z_YDVARS_Q_T0 => GET_DEVICE_DATA_RDONLY(YDVARS%Q%FT0)
#Z_YDVARS_U_T0 => GET_DEVICE_DATA_RDONLY(YDVARS%U%FT0)
#Z_YDVARS_V_T0 => GET_DEVICE_DATA_RDONLY (YDVARS%V%FT0)
#Z_YDMF_PHYS_SURF_GSD_VF_PZ0F => GET_DEVICE_DATA_RDONLY(YDMF_PHYS_SURF%GSD_VF%F_Z0F) |276 REAL(KIND=JPRB) :: ZPFL_FPLSH (YDCPG_OPTS%KLON, 0:YDCPG_OPTS%KFLEVG)
#IF(LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:GET_DATA', 1, ZHOOK_HANDLE_FIELD_API)
#"""

test_get_data["OpenACCSingleColumn"] = """
IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:GET_DATA', 0, ZHOOK_HANDLE_FIELD_API)
ZRDG_CVGQ => GET_DEVICE_DATA_RDWR(YL_ZRDG_CVGQ)
ZRDG_MU0 => GET_DEVICE_DATA_RDWR(YL_ZRDG_MU0)
ZRDG_MU0LU => GET_DEVICE_DATA_RDWR(YL_ZRDG_MU0LU)
ZRDG_MU0M => GET_DEVICE_DATA_RDWR(YL_ZRDG_MU0M)
ZRDG_MU0N => GET_DEVICE_DATA_RDWR(YL_ZRDG_MU0N)
Z_YDCPG_DYN0_CTY_EVEL => GET_DEVICE_DATA_RDWR(YDCPG_DYN0%CTY%F_EVEL)
Z_YDCPG_PHY0_XYB_RDELP => GET_DEVICE_DATA_RDWR(YDCPG_PHY0%XYB%F_RDELP)
Z_YDVARS_CVGQ_DL => GET_DEVICE_DATA_RDWR(YDVARS%CVGQ%FDL)
Z_YDVARS_CVGQ_DM => GET_DEVICE_DATA_RDWR(YDVARS%CVGQ%FDM)
Z_YDVARS_CVGQ_T0 => GET_DEVICE_DATA_RDWR(YDVARS%CVGQ%FT0)
Z_YDVARS_GEOMETRY_GELAM_T0 => GET_DEVICE_DATA_RDWR(YDVARS%GEOMETRY%GELAM%FT0)
Z_YDVARS_GEOMETRY_GEMU_T0 => GET_DEVICE_DATA_RDWR(YDVARS%GEOMETRY%GEMU%FT0)
Z_YDVARS_Q_DL => GET_DEVICE_DATA_RDWR(YDVARS%Q%FDL)
Z_YDVARS_Q_DM => GET_DEVICE_DATA_RDWR(YDVARS%Q%FDM)
Z_YDVARS_Q_T0 => GET_DEVICE_DATA_RDWR(YDVARS%Q%FT0)
Z_YDVARS_U_T0 => GET_DEVICE_DATA_RDWR(YDVARS%U%FT0)
Z_YDVARS_V_T0 => GET_DEVICE_DATA_RDWR(YDVARS%V%FT0)
Z_YDMF_PHYS_SURF_GSD_VF_PZ0F => GET_DEVICE_DATA_RDWR(YDMF_PHYS_SURF%GSD_VF%F_Z0F) |276 REAL(KIND=JPRB) :: ZPFL_FPLSH (YDCPG_OPTS%KLON, 0:YDCPG_OPTS%KFLEVG)
IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:GET_DATA', 1, ZHOOK_HANDLE_FIELD_API)
"""

for target in get_data:
for node in get_data[target]:
assert fgen(node) in test_get_data[target]

###@pytest.mark.parametrize('frontend', available_frontends(skip=[OMNI]))
###def test_parallel_routine_dispatch_synchost(here, frontend):
###
### source = Sourcefile.from_file(here/'sources/projParallelRoutineDispatch/dispatch_routine.F90', frontend=frontend)
### routine = source['dispatch_routine']
###
### transformation = ParallelRoutineDispatchTransformation()
### transformation.apply(source['dispatch_routine'])
###
### get_data = transformation.get_data
###
### test_get_data = """
###IF (LHOOK) CALL DR_HOOK ('DISPATCH_ROUTINE:CPPHINP:GET_DATA',0,ZHOOK_HANDLE_FIELD_API)
###Z_YDMF_PHYS_SURF_GSD_VV_PZ0H => GET_HOST_DATA_RDWR (YDMF_PHYS_SURF%GSD_VV%F_Z0H)
###IF (LHOOK) CALL DR_HOOK ('DISPATCH_ROUTINE:CPPHINP:GET_DATA',1,ZHOOK_HANDLE_FIELD_API)
###"""
###
### for node in get_data:
### assert fgen(node) in test_get_data
###

@pytest.mark.parametrize('frontend', available_frontends(skip=[OMNI]))
def test_parallel_routine_dispatch_synchost(here, frontend):

source = Sourcefile.from_file(here/'sources/projParallelRoutineDispatch/dispatch_routine.F90', frontend=frontend)
routine = source['dispatch_routine']

transformation = ParallelRoutineDispatchTransformation()
transformation.apply(source['dispatch_routine'])

synchost = transformation.synchost[0]

test_synchost = """IF (LSYNCHOST('DISPATCH_ROUTINE:CPPHINP')) THEN
IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:SYNCHOST', 0, ZHOOK_HANDLE_FIELD_API)
ZRDG_CVGQ => GET_HOST_DATA_RDWR(YL_ZRDG_CVGQ)
ZRDG_MU0 => GET_HOST_DATA_RDWR(YL_ZRDG_MU0)
ZRDG_MU0LU => GET_HOST_DATA_RDWR(YL_ZRDG_MU0LU)
ZRDG_MU0M => GET_HOST_DATA_RDWR(YL_ZRDG_MU0M)
ZRDG_MU0N => GET_HOST_DATA_RDWR(YL_ZRDG_MU0N)
Z_YDCPG_DYN0_CTY_EVEL => GET_HOST_DATA_RDWR(YDCPG_DYN0%CTY%F_EVEL)
Z_YDCPG_PHY0_XYB_RDELP => GET_HOST_DATA_RDWR(YDCPG_PHY0%XYB%F_RDELP)
Z_YDVARS_CVGQ_DL => GET_HOST_DATA_RDWR(YDVARS%CVGQ%FDL)
Z_YDVARS_CVGQ_DM => GET_HOST_DATA_RDWR(YDVARS%CVGQ%FDM)
Z_YDVARS_CVGQ_T0 => GET_HOST_DATA_RDWR(YDVARS%CVGQ%FT0)
Z_YDVARS_GEOMETRY_GELAM_T0 => GET_HOST_DATA_RDWR(YDVARS%GEOMETRY%GELAM%FT0)
Z_YDVARS_GEOMETRY_GEMU_T0 => GET_HOST_DATA_RDWR(YDVARS%GEOMETRY%GEMU%FT0)
Z_YDVARS_Q_DL => GET_HOST_DATA_RDWR(YDVARS%Q%FDL)
Z_YDVARS_Q_DM => GET_HOST_DATA_RDWR(YDVARS%Q%FDM)
Z_YDVARS_Q_T0 => GET_HOST_DATA_RDWR(YDVARS%Q%FT0)
Z_YDVARS_U_T0 => GET_HOST_DATA_RDWR(YDVARS%U%FT0)
Z_YDVARS_V_T0 => GET_HOST_DATA_RDWR(YDVARS%V%FT0)
Z_YDMF_PHYS_SURF_GSD_VF_PZ0F => GET_HOST_DATA_RDWR(YDMF_PHYS_SURF%GSD_VF%F_Z0F)
IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:SYNCHOST', 1, ZHOOK_HANDLE_FIELD_API)
ENDIF
"""
assert fgen(synchost.condition) in test_synchost
for node in synchost.body:
assert fgen(node) in test_synchost

@pytest.mark.parametrize('frontend', available_frontends(skip=[OMNI]))
def test_parallel_routine_dispatch_nullify(here, frontend):

source = Sourcefile.from_file(here/'sources/projParallelRoutineDispatch/dispatch_routine.F90', frontend=frontend)
routine = source['dispatch_routine']

transformation = ParallelRoutineDispatchTransformation()
transformation.apply(source['dispatch_routine'])

nullify = transformation.nullify

test_nullify = """
IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:NULLIFY', 0, ZHOOK_HANDLE_FIELD_API)
ZRDG_CVGQ => NULL ()
ZRDG_MU0 => NULL ()
ZRDG_MU0LU => NULL ()
ZRDG_MU0M => NULL ()
ZRDG_MU0N => NULL ()
Z_YDCPG_DYN0_CTY_EVEL => NULL ()
Z_YDCPG_PHY0_XYB_RDELP => NULL ()
Z_YDVARS_CVGQ_DL => NULL ()
Z_YDVARS_CVGQ_DM => NULL ()
Z_YDVARS_CVGQ_T0 => NULL ()
Z_YDVARS_GEOMETRY_GELAM_T0 => NULL ()
Z_YDVARS_GEOMETRY_GEMU_T0 => NULL ()
Z_YDVARS_Q_DL => NULL ()
Z_YDVARS_Q_DM => NULL ()
Z_YDVARS_Q_T0 => NULL ()
Z_YDVARS_U_T0 => NULL ()
Z_YDVARS_V_T0 => NULL ()
Z_YDMF_PHYS_SURF_GSD_VF_PZ0F => GET_HOST_DATA_RDONLY (YDMF_PHYS_SURF%GSD_VF%F_Z0F)
IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE:CPPHINP:NULLIFY', 1, ZHOOK_HANDLE_FIELD_API)
"""

for node in nullify:
assert fgen(node) in test_nullify
Loading

0 comments on commit d1cf092

Please sign in to comment.