(git:374b731)
Loading...
Searching...
No Matches
mp_perf_env.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Defines all routines to deal with the performance of MPI routines
10! **************************************************************************************************
12 ! performance gathering
13 USE kinds, ONLY: dp
14#include "../base/base_uses.f90"
15
16 PRIVATE
17
18 PUBLIC :: mp_perf_env_type
21 PUBLIC :: add_perf
22
23 TYPE mp_perf_type
24 CHARACTER(LEN=20) :: name = ""
25 INTEGER :: count = 0
26 REAL(KIND=dp) :: msg_size = 0.0_dp
27 END TYPE mp_perf_type
28
29 INTEGER, PARAMETER :: max_perf = 28
30
31! **************************************************************************************************
33 PRIVATE
34 INTEGER :: ref_count = -1
35 TYPE(mp_perf_type), DIMENSION(MAX_PERF) :: mp_perfs = mp_perf_type()
36 CONTAINS
37 PROCEDURE, PUBLIC, pass(perf_env), non_overridable :: retain => mp_perf_env_retain
38 END TYPE mp_perf_env_type
39
40! **************************************************************************************************
41 TYPE mp_perf_env_p_type
42 TYPE(mp_perf_env_type), POINTER :: mp_perf_env => null()
43 END TYPE mp_perf_env_p_type
44
45 ! introduce a stack of mp_perfs, first index is the stack pointer, for convenience is replacing
46 INTEGER, PARAMETER :: max_stack_size = 10
47 INTEGER :: stack_pointer = 0
48 TYPE(mp_perf_env_p_type), DIMENSION(max_stack_size), SAVE :: mp_perf_stack
49
50 CHARACTER(LEN=20), PARAMETER :: sname(max_perf) = &
51 (/"MP_Group ", "MP_Bcast ", "MP_Allreduce ", &
52 "MP_Gather ", "MP_Sync ", "MP_Alltoall ", &
53 "MP_SendRecv ", "MP_ISendRecv ", "MP_Wait ", &
54 "MP_comm_split ", "MP_ISend ", "MP_IRecv ", &
55 "MP_Send ", "MP_Recv ", "MP_Memory ", &
56 "MP_Put ", "MP_Get ", "MP_Fence ", &
57 "MP_Win_Lock ", "MP_Win_Create ", "MP_Win_Free ", &
58 "MP_IBcast ", "MP_IAllreduce ", "MP_IScatter ", &
59 "MP_RGet ", "MP_Isync ", "MP_Read_All ", &
60 "MP_Write_All "/)
61
62CONTAINS
63
64! **************************************************************************************************
65!> \brief start and stop the performance indicators
66!> for every call to start there has to be (exactly) one call to stop
67!> \param perf_env ...
68!> \par History
69!> 2.2004 created [Joost VandeVondele]
70!> \note
71!> can be used to measure performance of a sub-part of a program.
72!> timings measured here will not show up in the outer start/stops
73!> Doesn't need a fresh communicator
74! **************************************************************************************************
75 SUBROUTINE add_mp_perf_env(perf_env)
76 TYPE(mp_perf_env_type), OPTIONAL, POINTER :: perf_env
77
78 stack_pointer = stack_pointer + 1
79 IF (stack_pointer > max_stack_size) THEN
80 cpabort("stack_pointer too large : message_passing @ add_mp_perf_env")
81 END IF
82 NULLIFY (mp_perf_stack(stack_pointer)%mp_perf_env)
83 IF (PRESENT(perf_env)) THEN
84 mp_perf_stack(stack_pointer)%mp_perf_env => perf_env
85 IF (ASSOCIATED(perf_env)) CALL mp_perf_env_retain(perf_env)
86 END IF
87 IF (.NOT. ASSOCIATED(mp_perf_stack(stack_pointer)%mp_perf_env)) THEN
88 CALL mp_perf_env_create(mp_perf_stack(stack_pointer)%mp_perf_env)
89 END IF
90 END SUBROUTINE add_mp_perf_env
91
92! **************************************************************************************************
93!> \brief ...
94!> \param perf_env ...
95! **************************************************************************************************
96 SUBROUTINE mp_perf_env_create(perf_env)
97 TYPE(mp_perf_env_type), OPTIONAL, POINTER :: perf_env
98
99 INTEGER :: i
100
101 NULLIFY (perf_env)
102 ALLOCATE (perf_env)
103 perf_env%ref_count = 1
104 DO i = 1, max_perf
105 perf_env%mp_perfs(i)%name = sname(i)
106 END DO
107
108 END SUBROUTINE mp_perf_env_create
109
110! **************************************************************************************************
111!> \brief ...
112!> \param perf_env ...
113! **************************************************************************************************
114 SUBROUTINE mp_perf_env_release(perf_env)
115 TYPE(mp_perf_env_type), POINTER :: perf_env
116
117 IF (ASSOCIATED(perf_env)) THEN
118 IF (perf_env%ref_count < 1) THEN
119 cpabort("invalid ref_count: message_passing @ mp_perf_env_release")
120 END IF
121 perf_env%ref_count = perf_env%ref_count - 1
122 IF (perf_env%ref_count == 0) THEN
123 DEALLOCATE (perf_env)
124 END IF
125 END IF
126 NULLIFY (perf_env)
127 END SUBROUTINE mp_perf_env_release
128
129! **************************************************************************************************
130!> \brief ...
131!> \param perf_env ...
132! **************************************************************************************************
133 ELEMENTAL SUBROUTINE mp_perf_env_retain(perf_env)
134 CLASS(mp_perf_env_type), INTENT(INOUT) :: perf_env
135
136 perf_env%ref_count = perf_env%ref_count + 1
137 END SUBROUTINE mp_perf_env_retain
138
139!.. reports the performance counters for the MPI run
140! **************************************************************************************************
141!> \brief ...
142!> \param perf_env ...
143!> \param iw ...
144! **************************************************************************************************
145 SUBROUTINE mp_perf_env_describe(perf_env, iw)
146 TYPE(mp_perf_env_type), INTENT(IN) :: perf_env
147 INTEGER, INTENT(IN) :: iw
148
149#if defined(__parallel)
150 INTEGER :: i
151 REAL(kind=dp) :: vol
152#endif
153
154 IF (perf_env%ref_count < 1) THEN
155 cpabort("invalid perf_env%ref_count : message_passing @ mp_perf_env_describe")
156 END IF
157#if defined(__parallel)
158 IF (iw > 0) THEN
159 WRITE (iw, '( /, 1X, 79("-") )')
160 WRITE (iw, '( " -", 77X, "-" )')
161 WRITE (iw, '( " -", 24X, A, 24X, "-" )') ' MESSAGE PASSING PERFORMANCE '
162 WRITE (iw, '( " -", 77X, "-" )')
163 WRITE (iw, '( 1X, 79("-"), / )')
164 WRITE (iw, '( A, A, A )') ' ROUTINE', ' CALLS ', &
165 ' AVE VOLUME [Bytes]'
166 DO i = 1, max_perf
167
168 IF (perf_env%mp_perfs(i)%count > 0) THEN
169 vol = perf_env%mp_perfs(i)%msg_size/real(perf_env%mp_perfs(i)%count, kind=dp)
170 IF (vol < 1.0_dp) THEN
171 WRITE (iw, '(1X,A15,T17,I10)') &
172 adjustl(perf_env%mp_perfs(i)%name), perf_env%mp_perfs(i)%count
173 ELSE
174 WRITE (iw, '(1X,A15,T17,I10,T40,F11.0)') &
175 adjustl(perf_env%mp_perfs(i)%name), perf_env%mp_perfs(i)%count, &
176 vol
177 END IF
178 END IF
179
180 END DO
181 WRITE (iw, '( 1X, 79("-"), / )')
182 END IF
183#else
184 mark_used(iw)
185#endif
186 END SUBROUTINE mp_perf_env_describe
187
188! **************************************************************************************************
189!> \brief ...
190! **************************************************************************************************
191 SUBROUTINE rm_mp_perf_env()
192 IF (stack_pointer < 1) THEN
193 cpabort("no perf_env in the stack : message_passing @ rm_mp_perf_env")
194 END IF
195 CALL mp_perf_env_release(mp_perf_stack(stack_pointer)%mp_perf_env)
196 stack_pointer = stack_pointer - 1
197 END SUBROUTINE rm_mp_perf_env
198
199! **************************************************************************************************
200!> \brief ...
201!> \return ...
202! **************************************************************************************************
203 FUNCTION get_mp_perf_env() RESULT(res)
204 TYPE(mp_perf_env_type), POINTER :: res
205
206 IF (stack_pointer < 1) THEN
207 cpabort("no perf_env in the stack : message_passing @ get_mp_perf_env")
208 END IF
209 res => mp_perf_stack(stack_pointer)%mp_perf_env
210 END FUNCTION get_mp_perf_env
211
212! **************************************************************************************************
213!> \brief ...
214!> \param scr ...
215! **************************************************************************************************
216 SUBROUTINE describe_mp_perf_env(scr)
217 INTEGER, INTENT(in) :: scr
218
219 TYPE(mp_perf_env_type), POINTER :: perf_env
220
221 perf_env => get_mp_perf_env()
222 CALL mp_perf_env_describe(perf_env, scr)
223 END SUBROUTINE describe_mp_perf_env
224
225! **************************************************************************************************
226!> \brief adds the performance informations of one call
227!> \param perf_id ...
228!> \param count ...
229!> \param msg_size ...
230!> \author fawzi
231! **************************************************************************************************
232 SUBROUTINE add_perf(perf_id, count, msg_size)
233 INTEGER, INTENT(in) :: perf_id
234 INTEGER, INTENT(in), OPTIONAL :: count
235 INTEGER, INTENT(in), OPTIONAL :: msg_size
236
237#if defined(__parallel)
238 TYPE(mp_perf_type), POINTER :: mp_perf
239
240 IF (.NOT. ASSOCIATED(mp_perf_stack(stack_pointer)%mp_perf_env)) RETURN
241
242 mp_perf => mp_perf_stack(stack_pointer)%mp_perf_env%mp_perfs(perf_id)
243 IF (PRESENT(count)) THEN
244 mp_perf%count = mp_perf%count + count
245 END IF
246 IF (PRESENT(msg_size)) THEN
247 mp_perf%msg_size = mp_perf%msg_size + real(msg_size, dp)
248 END IF
249#else
250 mark_used(perf_id)
251 mark_used(count)
252 mark_used(msg_size)
253#endif
254
255 END SUBROUTINE add_perf
256
257END MODULE mp_perf_env
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Defines all routines to deal with the performance of MPI routines.
Definition mp_perf_env.F:11
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
Definition mp_perf_env.F:29
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 ...
Definition mp_perf_env.F:76
integer, parameter max_stack_size
Definition mp_perf_env.F:46