Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief types for task lists
10 : !> \par History
11 : !> 01.2008 [Joost VandeVondele] refactered out of qs_collocate / qs_integrate
12 : !> \author Joost VandeVondele
13 : ! **************************************************************************************************
14 : MODULE task_list_types
15 : USE grid_api, ONLY: grid_basis_set_type,&
16 : grid_free_basis_set,&
17 : grid_free_task_list,&
18 : grid_task_list_type
19 : USE kinds, ONLY: dp,&
20 : int_8
21 : USE offload_api, ONLY: offload_buffer_type,&
22 : offload_free_buffer
23 : #include "./base/base_uses.f90"
24 :
25 : IMPLICIT NONE
26 :
27 : PRIVATE
28 :
29 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'task_list_types'
30 :
31 : TYPE task_type
32 : INTEGER :: destination = 0
33 : INTEGER :: source = 0
34 : INTEGER :: dist_type = 0
35 : INTEGER :: cost = 0
36 : INTEGER :: subpatch_pattern = 0
37 : INTEGER :: grid_level = 0
38 : INTEGER :: image = 0
39 : INTEGER :: iatom = 0
40 : INTEGER :: jatom = 0
41 : INTEGER :: iset = 0
42 : INTEGER :: jset = 0
43 : INTEGER :: ipgf = 0
44 : INTEGER :: jpgf = 0
45 : INTEGER :: pair_index = 0
46 :
47 : REAL(KIND=dp), DIMENSION(3) :: rab = 0.0_dp
48 : REAL(KIND=dp) :: radius = 0.0_dp
49 : END TYPE task_type
50 :
51 : TYPE atom_pair_type
52 : INTEGER :: rank = 0
53 : INTEGER :: row = 0
54 : INTEGER :: col = 0
55 : INTEGER :: image = 0
56 : END TYPE atom_pair_type
57 :
58 : TYPE task_list_type
59 : TYPE(task_type), DIMENSION(:), POINTER :: tasks => Null()
60 : INTEGER :: ntasks = 0
61 : INTEGER, DIMENSION(:, :), POINTER :: taskstart => Null(), taskstop => Null()
62 : INTEGER, DIMENSION(:), POINTER :: npairs => Null()
63 :
64 : TYPE(atom_pair_type), DIMENSION(:), POINTER :: atom_pair_send => Null()
65 : INTEGER, DIMENSION(:), POINTER :: pair_offsets_send => Null()
66 : INTEGER, DIMENSION(:), POINTER :: rank_offsets_send => Null()
67 : INTEGER, DIMENSION(:), POINTER :: rank_sizes_send => Null()
68 : INTEGER :: buffer_size_send = 0
69 :
70 : TYPE(atom_pair_type), DIMENSION(:), POINTER :: atom_pair_recv => Null()
71 : INTEGER, DIMENSION(:), POINTER :: pair_offsets_recv => Null()
72 : INTEGER, DIMENSION(:), POINTER :: rank_offsets_recv => Null()
73 : INTEGER, DIMENSION(:), POINTER :: rank_sizes_recv => Null()
74 : INTEGER :: buffer_size_recv = 0
75 :
76 : ! Owner-side contributions grouped by destination block for matrix unpacking.
77 : INTEGER, ALLOCATABLE :: unpack_block_starts(:), unpack_pair_indices(:)
78 :
79 : TYPE(grid_basis_set_type), DIMENSION(:), POINTER :: grid_basis_sets => Null()
80 : TYPE(grid_task_list_type) :: grid_task_list = grid_task_list_type()
81 : TYPE(offload_buffer_type) :: pab_buffer = offload_buffer_type()
82 : TYPE(offload_buffer_type) :: hab_buffer = offload_buffer_type()
83 : END TYPE task_list_type
84 :
85 : INTEGER, PARAMETER :: task_size_in_int8 = 17
86 :
87 : PUBLIC :: task_type, atom_pair_type, task_list_type
88 : PUBLIC :: task_size_in_int8, serialize_task, deserialize_task
89 : PUBLIC :: allocate_task_list, deallocate_task_list, reallocate_tasks
90 :
91 : CONTAINS
92 :
93 : ! **************************************************************************************************
94 : !> \brief allocates and initialised the components of the task_list_type
95 : !> \param task_list ...
96 : !> \par History
97 : !> 01.2008 created [Joost VandeVondele]
98 : ! **************************************************************************************************
99 10457 : SUBROUTINE allocate_task_list(task_list)
100 : TYPE(task_list_type), POINTER :: task_list
101 :
102 10457 : ALLOCATE (task_list)
103 :
104 : NULLIFY (task_list%tasks)
105 : NULLIFY (task_list%atom_pair_send)
106 : NULLIFY (task_list%atom_pair_recv)
107 : NULLIFY (task_list%taskstart)
108 : NULLIFY (task_list%taskstop)
109 : NULLIFY (task_list%npairs)
110 : task_list%ntasks = 0
111 10457 : END SUBROUTINE allocate_task_list
112 :
113 : ! **************************************************************************************************
114 : !> \brief Grow an array of tasks while preserving the existing entries.
115 : !> \param tasks ...
116 : !> \param new_size ...
117 : !> \author Ole Schuett
118 : ! **************************************************************************************************
119 14089 : SUBROUTINE reallocate_tasks(tasks, new_size)
120 : TYPE(task_type), DIMENSION(:), INTENT(inout), &
121 : POINTER :: tasks
122 : INTEGER, INTENT(in) :: new_size
123 :
124 14089 : TYPE(task_type), DIMENSION(:), POINTER :: old_tasks
125 :
126 14089 : IF (.NOT. ASSOCIATED(tasks)) THEN
127 25562458 : ALLOCATE (tasks(new_size))
128 12743 : RETURN
129 : END IF
130 :
131 1346 : IF (new_size <= SIZE(tasks)) RETURN
132 :
133 1346 : old_tasks => tasks
134 1346 : NULLIFY (tasks)
135 :
136 13158020 : ALLOCATE (tasks(new_size))
137 10459290 : tasks(1:SIZE(old_tasks)) = old_tasks(:)
138 1346 : DEALLOCATE (old_tasks)
139 14089 : END SUBROUTINE reallocate_tasks
140 :
141 : ! **************************************************************************************************
142 : !> \brief deallocates the components and the object itself
143 : !> \param task_list ...
144 : !> \par History
145 : !> 01.2008 created [Joost VandeVondele]
146 : ! **************************************************************************************************
147 10456 : SUBROUTINE deallocate_task_list(task_list)
148 : TYPE(task_list_type), POINTER :: task_list
149 :
150 : INTEGER :: i
151 :
152 10456 : IF (ASSOCIATED(task_list%tasks)) THEN
153 10456 : DEALLOCATE (task_list%tasks)
154 : END IF
155 10456 : IF (ASSOCIATED(task_list%taskstart)) THEN
156 10456 : DEALLOCATE (task_list%taskstart)
157 : END IF
158 10456 : IF (ASSOCIATED(task_list%taskstop)) THEN
159 10456 : DEALLOCATE (task_list%taskstop)
160 : END IF
161 10456 : IF (ASSOCIATED(task_list%npairs)) THEN
162 10456 : DEALLOCATE (task_list%npairs)
163 : END IF
164 :
165 10456 : IF (ASSOCIATED(task_list%atom_pair_send)) THEN
166 22 : DEALLOCATE (task_list%atom_pair_send)
167 : END IF
168 10456 : IF (ASSOCIATED(task_list%pair_offsets_send)) THEN
169 22 : DEALLOCATE (task_list%pair_offsets_send)
170 : END IF
171 10456 : IF (ASSOCIATED(task_list%rank_offsets_send)) THEN
172 22 : DEALLOCATE (task_list%rank_offsets_send)
173 : END IF
174 10456 : IF (ASSOCIATED(task_list%rank_sizes_send)) THEN
175 22 : DEALLOCATE (task_list%rank_sizes_send)
176 : END IF
177 :
178 10456 : IF (ASSOCIATED(task_list%atom_pair_recv)) THEN
179 10456 : DEALLOCATE (task_list%atom_pair_recv)
180 : END IF
181 10456 : IF (ASSOCIATED(task_list%pair_offsets_recv)) THEN
182 10456 : DEALLOCATE (task_list%pair_offsets_recv)
183 : END IF
184 10456 : IF (ASSOCIATED(task_list%rank_offsets_recv)) THEN
185 10456 : DEALLOCATE (task_list%rank_offsets_recv)
186 : END IF
187 10456 : IF (ASSOCIATED(task_list%rank_sizes_recv)) THEN
188 10456 : DEALLOCATE (task_list%rank_sizes_recv)
189 : END IF
190 10456 : CALL grid_free_task_list(task_list%grid_task_list)
191 10456 : CALL offload_free_buffer(task_list%pab_buffer)
192 10456 : CALL offload_free_buffer(task_list%hab_buffer)
193 10456 : IF (ASSOCIATED(task_list%grid_basis_sets)) THEN
194 28615 : DO i = 1, SIZE(task_list%grid_basis_sets)
195 28615 : CALL grid_free_basis_set(task_list%grid_basis_sets(i))
196 : END DO
197 10456 : DEALLOCATE (task_list%grid_basis_sets)
198 : END IF
199 :
200 10456 : DEALLOCATE (task_list)
201 10456 : END SUBROUTINE deallocate_task_list
202 :
203 : ! **************************************************************************************************
204 : !> \brief Serialize a task into an integer array. Used for MPI communication.
205 : !> \param task ...
206 : !> \param serialized_task ...
207 : !> \author Ole Schuett
208 : ! **************************************************************************************************
209 3846 : SUBROUTINE serialize_task(task, serialized_task)
210 : TYPE(task_type), INTENT(IN) :: task
211 : INTEGER(KIND=int_8), &
212 : DIMENSION(task_size_in_int8), INTENT(OUT) :: serialized_task
213 :
214 3846 : serialized_task(1) = task%destination
215 3846 : serialized_task(2) = task%source
216 3846 : serialized_task(3) = task%dist_type
217 3846 : serialized_task(4) = task%cost
218 3846 : serialized_task(5) = task%subpatch_pattern
219 :
220 3846 : serialized_task(6) = task%grid_level
221 3846 : serialized_task(7) = task%image
222 3846 : serialized_task(8) = task%iatom
223 3846 : serialized_task(9) = task%jatom
224 3846 : serialized_task(10) = task%iset
225 3846 : serialized_task(11) = task%jset
226 3846 : serialized_task(12) = task%ipgf
227 3846 : serialized_task(13) = task%jpgf
228 :
229 3846 : serialized_task(14) = TRANSFER(task%rab(1), mold=1_int_8)
230 3846 : serialized_task(15) = TRANSFER(task%rab(2), mold=1_int_8)
231 3846 : serialized_task(16) = TRANSFER(task%rab(3), mold=1_int_8)
232 3846 : serialized_task(17) = TRANSFER(task%radius, mold=1_int_8)
233 3846 : END SUBROUTINE serialize_task
234 :
235 : ! **************************************************************************************************
236 : !> \brief De-serialize a task from an integer array. Used for MPI communication.
237 : !> \param task ...
238 : !> \param serialized_task ...
239 : !> \author Ole Schuett
240 : ! **************************************************************************************************
241 15384 : SUBROUTINE deserialize_task(task, serialized_task)
242 : TYPE(task_type), INTENT(OUT) :: task
243 : INTEGER(KIND=int_8), &
244 : DIMENSION(task_size_in_int8), INTENT(IN) :: serialized_task
245 :
246 3846 : task%destination = INT(serialized_task(1))
247 3846 : task%source = INT(serialized_task(2))
248 3846 : task%dist_type = INT(serialized_task(3))
249 3846 : task%cost = INT(serialized_task(4))
250 3846 : task%subpatch_pattern = INT(serialized_task(5))
251 :
252 3846 : task%grid_level = INT(serialized_task(6))
253 3846 : task%image = INT(serialized_task(7))
254 3846 : task%iatom = INT(serialized_task(8))
255 3846 : task%jatom = INT(serialized_task(9))
256 3846 : task%iset = INT(serialized_task(10))
257 3846 : task%jset = INT(serialized_task(11))
258 3846 : task%ipgf = INT(serialized_task(12))
259 3846 : task%jpgf = INT(serialized_task(13))
260 :
261 3846 : task%rab(1) = TRANSFER(serialized_task(14), mold=1.0_dp)
262 3846 : task%rab(2) = TRANSFER(serialized_task(15), mold=1.0_dp)
263 3846 : task%rab(3) = TRANSFER(serialized_task(16), mold=1.0_dp)
264 3846 : task%radius = TRANSFER(serialized_task(17), mold=1.0_dp)
265 3846 : END SUBROUTINE deserialize_task
266 :
267 0 : END MODULE task_list_types
|