14#include "../base/base_uses.f90"
26 CHARACTER(LEN=20) :: name =
""
28 REAL(KIND=
dp) :: msg_size = 0.0_dp
36 INTEGER :: ref_count = -1
37 TYPE(mp_perf_type),
DIMENSION(MAX_PERF) :: mp_perfs = mp_perf_type()
43 TYPE mp_perf_env_p_type
45 END TYPE mp_perf_env_p_type
49 INTEGER :: stack_pointer = 0
50 TYPE(mp_perf_env_p_type),
DIMENSION(max_stack_size),
SAVE :: mp_perf_stack
52 CHARACTER(LEN=20),
PARAMETER :: sname(
max_perf) = &
53 [
"MP_Group ",
"MP_Bcast ",
"MP_Allreduce ", &
54 "MP_Gather ",
"MP_Sync ",
"MP_Alltoall ", &
55 "MP_SendRecv ",
"MP_ISendRecv ",
"MP_Wait ", &
56 "MP_comm_split ",
"MP_ISend ",
"MP_IRecv ", &
57 "MP_Send ",
"MP_Recv ",
"MP_Memory ", &
58 "MP_Put ",
"MP_Get ",
"MP_Fence ", &
59 "MP_Win_Lock ",
"MP_Win_Create ",
"MP_Win_Free ", &
60 "MP_IBcast ",
"MP_IAllreduce ",
"MP_IScatter ", &
61 "MP_RGet ",
"MP_Isync ",
"MP_Read_All ", &
80 stack_pointer = stack_pointer + 1
82 cpabort(
"stack_pointer too large : message_passing @ add_mp_perf_env")
84 NULLIFY (mp_perf_stack(stack_pointer)%mp_perf_env)
85 IF (
PRESENT(perf_env))
THEN
86 mp_perf_stack(stack_pointer)%mp_perf_env => perf_env
89 IF (.NOT.
ASSOCIATED(mp_perf_stack(stack_pointer)%mp_perf_env))
THEN
90 CALL mp_perf_env_create(mp_perf_stack(stack_pointer)%mp_perf_env)
98 SUBROUTINE mp_perf_env_create(perf_env)
105 perf_env%ref_count = 1
107 perf_env%mp_perfs(i)%name = sname(i)
110 END SUBROUTINE mp_perf_env_create
119 IF (
ASSOCIATED(perf_env))
THEN
120 IF (perf_env%ref_count < 1)
THEN
121 cpabort(
"invalid ref_count: message_passing @ mp_perf_env_release")
123 perf_env%ref_count = perf_env%ref_count - 1
124 IF (perf_env%ref_count == 0)
THEN
125 DEALLOCATE (perf_env)
138 perf_env%ref_count = perf_env%ref_count + 1
147 SUBROUTINE mp_perf_env_describe(perf_env, iw)
149 INTEGER,
INTENT(IN) :: iw
151#if defined(__parallel)
156 IF (perf_env%ref_count < 1)
THEN
157 cpabort(
"invalid perf_env%ref_count : message_passing @ mp_perf_env_describe")
159#if defined(__parallel)
161 WRITE (iw,
'( /, 1X, 79("-") )')
162 WRITE (iw,
'( " -", 77X, "-" )')
163 WRITE (iw,
'( " -", 24X, A, 24X, "-" )')
' MESSAGE PASSING PERFORMANCE '
164 WRITE (iw,
'( " -", 77X, "-" )')
165 WRITE (iw,
'( 1X, 79("-"), / )')
166 WRITE (iw,
'( A, A, A )')
' ROUTINE',
' CALLS ', &
167 ' AVE VOLUME [Bytes]'
170 IF (perf_env%mp_perfs(i)%count > 0)
THEN
171 vol = perf_env%mp_perfs(i)%msg_size/real(perf_env%mp_perfs(i)%count, kind=
dp)
172 IF (vol < 1.0_dp)
THEN
173 WRITE (iw,
'(1X,A15,T17,I10)') &
174 adjustl(perf_env%mp_perfs(i)%name), perf_env%mp_perfs(i)%count
176 WRITE (iw,
'(1X,A15,T17,I10,T40,F11.0)') &
177 adjustl(perf_env%mp_perfs(i)%name), perf_env%mp_perfs(i)%count, &
183 WRITE (iw,
'( 1X, 79("-"), / )')
188 END SUBROUTINE mp_perf_env_describe
194 IF (stack_pointer < 1)
THEN
195 cpabort(
"no perf_env in the stack : message_passing @ rm_mp_perf_env")
198 stack_pointer = stack_pointer - 1
208 IF (stack_pointer < 1)
THEN
209 cpabort(
"no perf_env in the stack : message_passing @ get_mp_perf_env")
211 res => mp_perf_stack(stack_pointer)%mp_perf_env
219 INTEGER,
INTENT(in) :: scr
224 CALL mp_perf_env_describe(perf_env, scr)
235 INTEGER,
INTENT(in) :: perf_id
236 INTEGER,
INTENT(in),
OPTIONAL :: count
237 INTEGER,
INTENT(in),
OPTIONAL :: msg_size
239#if defined(__parallel)
240 TYPE(mp_perf_type),
POINTER :: mp_perf
242 IF (.NOT.
ASSOCIATED(mp_perf_stack(stack_pointer)%mp_perf_env))
RETURN
244 mp_perf => mp_perf_stack(stack_pointer)%mp_perf_env%mp_perfs(perf_id)
245 IF (
PRESENT(count))
THEN
246 mp_perf%count = mp_perf%count + count
248 IF (
PRESENT(msg_size))
THEN
249 mp_perf%msg_size = mp_perf%msg_size + real(msg_size,
dp)
Defines the basic variable types.
integer, parameter, public dp
Defines all routines to deal with the performance of MPI routines.
subroutine, public mp_perf_env_release(perf_env)
...
subroutine, public rm_mp_perf_env()
...
subroutine, public describe_mp_perf_env(scr)
...
integer, parameter max_perf
type(mp_perf_env_type) function, pointer, public get_mp_perf_env()
...
elemental subroutine, public mp_perf_env_retain(perf_env)
...
subroutine, public add_perf(perf_id, count, msg_size)
adds the performance informations of one call
subroutine, public add_mp_perf_env(perf_env)
start and stop the performance indicators for every call to start there has to be (exactly) one call ...
integer, parameter max_stack_size