Skip to content

Commit f7b87ff

Browse files
reuterbalecossevin
authored andcommitted
Add dr_hook wrapping of pragma region
1 parent 8e85867 commit f7b87ff

File tree

3 files changed

+59
-9
lines changed

3 files changed

+59
-9
lines changed

transformations/tests/sources/projParallelRoutineDispatch/dispatch_routine.F90

+4-2
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,16 @@ SUBROUTINE DISPATCH_ROUTINE(YDGEOMETRY, YDCPG_BNDS, YDCPG_OPTS, &
4040

4141
INSTEP_DEB=1
4242
INSTEP_FIN=1
43-
!$ACDC PARALLEL,TARGET=OpenMP/OpenMPSingleColumn/OpenACCSingleColumn,NAME=CPPHINP {
43+
!!!$ACDC PARALLEL,TARGET=OpenMP/OpenMPSingleColumn/OpenACCSingleColumn,NAME=CPPHINP {
44+
!$loki parallel PARALLEL,TARGET=OpenMP/OpenMPSingleColumn/OpenACCSingleColumn,NAME=CPPHINP
4445

4546
CALL CPPHINP(YDGEOMETRY, YDMODEL, YDCPG_BNDS%KIDIA, YDCPG_BNDS%KFDIA, YDVARS%GEOMETRY%GEMU%T0, &
4647
& YDVARS%GEOMETRY%GELAM%T0, YDVARS%U%T0, YDVARS%V%T0, YDVARS%Q%T0, YDVARS%Q%DL, YDVARS%Q%DM, YDVARS%CVGQ%DL, &
4748
& YDVARS%CVGQ%DM, YDCPG_PHY0%XYB%RDELP, YDCPG_DYN0%CTY%EVEL, YDVARS%CVGQ%T0, ZRDG_MU0, ZRDG_MU0LU, ZRDG_MU0M, &
4849
& ZRDG_MU0N, ZRDG_CVGQ, YDMF_PHYS_SURF%GSD_VF%PZ0F)
4950

50-
!$ACDC }
51+
!$loki end parallel
52+
!!!$ACDC }
5153

5254
IF (LHOOK) CALL DR_HOOK('DISPATCH_ROUTINE',1,ZHOOK_HANDLE)
5355

transformations/tests/test_parallel_routine_dispatch.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import pytest
1212

1313
from loki.frontend import available_frontends, OMNI
14-
from loki import Sourcefile
14+
from loki import Sourcefile, FindNodes, CallStatement
1515

1616
from transformations.parallel_routine_dispatch import ParallelRoutineDispatchTransformation
1717

@@ -22,10 +22,19 @@ def fixture_here():
2222

2323

2424
@pytest.mark.parametrize('frontend', available_frontends(skip=[OMNI]))
25-
def test_parallel_routine_dispatch_parallel_regions(here, frontend):
25+
def test_parallel_routine_dispatch_dr_hook(here, frontend):
2626

2727
source = Sourcefile.from_file(here/'sources/projParallelRoutineDispatch/dispatch_routine.F90', frontend=frontend)
28+
routine = source['dispatch_routine']
29+
30+
calls = FindNodes(CallStatement).visit(routine.body)
31+
assert len(calls) == 3
32+
2833
transformation = ParallelRoutineDispatchTransformation()
2934
transformation.apply(source['dispatch_routine'])
3035

31-
assert transformation.dummy_return_value == ['dispatch_routine']
36+
calls = FindNodes(CallStatement).visit(routine.body)
37+
assert len(calls) == 5
38+
assert [str(call.name).lower() for call in calls] == [
39+
'dr_hook', 'dr_hook', 'cpphinp', 'dr_hook', 'dr_hook'
40+
]

transformations/transformations/parallel_routine_dispatch.py

+43-4
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,54 @@
55
# granted to it by virtue of its status as an intergovernmental organisation
66
# nor does it submit to any jurisdiction.
77

8+
from loki.expression import symbols as sym
9+
from loki.ir import (
10+
is_loki_pragma, get_pragma_parameters, pragma_regions_attached,
11+
FindNodes, nodes as ir
12+
)
813
from loki.transform import Transformation
914

1015
__all__ = ['ParallelRoutineDispatchTransformation']
1116

1217

1318
class ParallelRoutineDispatchTransformation(Transformation):
1419

15-
def __init__(self):
16-
self.dummy_return_value = []
17-
1820
def transform_subroutine(self, routine, **kwargs):
19-
self.dummy_return_value += [routine.name.lower()]
21+
with pragma_regions_attached(routine):
22+
for region in FindNodes(ir.PragmaRegion).visit(routine.body):
23+
if is_loki_pragma(region.pragma):
24+
self.process_parallel_region(routine, region)
25+
26+
def process_parallel_region(self, routine, region):
27+
pragma_content = region.pragma.content.split(maxsplit=1)
28+
pragma_content = [entry.split('=', maxsplit=1) for entry in pragma_content[1].split(',')]
29+
pragma_attrs = {
30+
entry[0].lower(): entry[1] if len(entry) == 2 else None
31+
for entry in pragma_content
32+
}
33+
if 'parallel' not in pragma_attrs:
34+
return
35+
36+
dr_hook_calls = self.create_dr_hook_calls(
37+
routine, pragma_attrs['name'],
38+
sym.Variable(name='ZHOOK_HANDLE_FIELD_API', scope=routine)
39+
)
40+
41+
region.prepend(dr_hook_calls[0])
42+
region.append(dr_hook_calls[1])
43+
44+
@staticmethod
45+
def create_dr_hook_calls(scope, cdname, pkey):
46+
dr_hook_calls = []
47+
for kswitch in (0, 1):
48+
call_stmt = ir.CallStatement(
49+
name=sym.Variable(name='DR_HOOK', scope=scope),
50+
arguments=(sym.StringLiteral(cdname), sym.IntLiteral(kswitch), pkey)
51+
)
52+
dr_hook_calls += [
53+
ir.Conditional(
54+
condition=sym.Variable(name='LHOOK', scope=scope),
55+
inline=True, body=(call_stmt,)
56+
)
57+
]
58+
return dr_hook_calls

0 commit comments

Comments
 (0)