27 #include "../base/base_uses.f90"
31 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'dbt_types'
50 TYPE(dbt_type),
INTENT(IN) ::
tensor
51 INTEGER,
INTENT(IN) :: unit_nr
52 LOGICAL,
OPTIONAL,
INTENT(IN) :: full_info
53 INTEGER,
DIMENSION(ndims_tensor(tensor)) :: nblks_total, nfull_total, pdims, my_ploc, nblks_local, nfull_local
55 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 1)) :: proc_dist_1
56 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 1)) :: blk_size_1
57 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 1)) :: blks_local_1
58 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 2)) :: proc_dist_2
59 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 2)) :: blk_size_2
60 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 2)) :: blks_local_2
61 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 3)) :: proc_dist_3
62 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 3)) :: blk_size_3
63 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 3)) :: blks_local_3
64 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 4)) :: proc_dist_4
65 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 4)) :: blk_size_4
66 INTEGER,
DIMENSION(dbt_nblks_total(tensor, 4)) :: blks_local_4
67 CHARACTER(len=default_string_length) :: name
70 INTEGER :: unit_nr_prv
73 IF (unit_nr_prv == 0)
RETURN
75 CALL dbt_get_info(
tensor, nblks_total, nfull_total, nblks_local, nfull_local, pdims, my_ploc, &
76 blks_local_1, blks_local_2, blks_local_3, blks_local_4, proc_dist_1, proc_dist_2, proc_dist_3,&
77 & proc_dist_4, blk_size_1, blk_size_2, blk_size_3, blk_size_4, &
80 IF (unit_nr_prv > 0)
THEN
81 WRITE (unit_nr_prv,
"(T2,A)") &
82 "GLOBAL INFO OF "//trim(name)
83 WRITE (unit_nr_prv,
"(T4,A,1X)", advance=
"no")
"block dimensions:"
85 WRITE (unit_nr_prv,
"(I6)", advance=
"no") nblks_total(idim)
87 WRITE (unit_nr_prv,
"(/T4,A,1X)", advance=
"no")
"full dimensions:"
89 WRITE (unit_nr_prv,
"(I8)", advance=
"no") nfull_total(idim)
91 WRITE (unit_nr_prv,
"(/T4,A,1X)", advance=
"no")
"process grid dimensions:"
93 WRITE (unit_nr_prv,
"(I6)", advance=
"no") pdims(idim)
95 WRITE (unit_nr_prv, *)
97 IF (
PRESENT(full_info))
THEN
99 WRITE (unit_nr_prv,
'(T4,A)', advance=
'no')
"Block sizes:"
101 WRITE (unit_nr_prv,
'(/T8,A,1X,I1,A,1X)', advance=
'no')
'Dim', 1,
':'
102 DO iblk = 1,
SIZE(blk_size_1)
103 WRITE (unit_nr_prv,
'(I2,1X)', advance=
'no') blk_size_1(iblk)
107 WRITE (unit_nr_prv,
'(/T8,A,1X,I1,A,1X)', advance=
'no')
'Dim', 2,
':'
108 DO iblk = 1,
SIZE(blk_size_2)
109 WRITE (unit_nr_prv,
'(I2,1X)', advance=
'no') blk_size_2(iblk)
113 WRITE (unit_nr_prv,
'(/T8,A,1X,I1,A,1X)', advance=
'no')
'Dim', 3,
':'
114 DO iblk = 1,
SIZE(blk_size_3)
115 WRITE (unit_nr_prv,
'(I2,1X)', advance=
'no') blk_size_3(iblk)
119 WRITE (unit_nr_prv,
'(/T8,A,1X,I1,A,1X)', advance=
'no')
'Dim', 4,
':'
120 DO iblk = 1,
SIZE(blk_size_4)
121 WRITE (unit_nr_prv,
'(I2,1X)', advance=
'no') blk_size_4(iblk)
124 WRITE (unit_nr_prv,
'(/T4,A)', advance=
'no')
"Block distribution:"
126 WRITE (unit_nr_prv,
'(/T8,A,1X,I1,A,1X)', advance=
'no')
'Dim', 1,
':'
127 DO iblk = 1,
SIZE(proc_dist_1)
128 WRITE (unit_nr_prv,
'(I3,1X)', advance=
'no') proc_dist_1(iblk)
132 WRITE (unit_nr_prv,
'(/T8,A,1X,I1,A,1X)', advance=
'no')
'Dim', 2,
':'
133 DO iblk = 1,
SIZE(proc_dist_2)
134 WRITE (unit_nr_prv,
'(I3,1X)', advance=
'no') proc_dist_2(iblk)
138 WRITE (unit_nr_prv,
'(/T8,A,1X,I1,A,1X)', advance=
'no')
'Dim', 3,
':'
139 DO iblk = 1,
SIZE(proc_dist_3)
140 WRITE (unit_nr_prv,
'(I3,1X)', advance=
'no') proc_dist_3(iblk)
144 WRITE (unit_nr_prv,
'(/T8,A,1X,I1,A,1X)', advance=
'no')
'Dim', 4,
':'
145 DO iblk = 1,
SIZE(proc_dist_4)
146 WRITE (unit_nr_prv,
'(I3,1X)', advance=
'no') proc_dist_4(iblk)
150 WRITE (unit_nr_prv, *)
161 TYPE(dbt_type),
INTENT(IN) ::
tensor
162 INTEGER,
INTENT(IN) :: unit_nr
163 INTEGER :: nproc, nblock_max, nelement_max
164 INTEGER(KIND=int_8) :: nblock_sum, nelement_sum, nblock_tot
165 INTEGER :: nblock, nelement, unit_nr_prv
166 INTEGER,
DIMENSION(2) :: tmp
167 INTEGER,
DIMENSION(ndims_tensor(tensor)) :: bdims
168 REAL(kind=
dp) :: occupation
171 IF (unit_nr_prv == 0)
RETURN
173 nproc =
tensor%pgrid%mp_comm_2d%num_pe
181 tmp = (/nblock, nelement/)
182 CALL tensor%pgrid%mp_comm_2d%max(tmp)
183 nblock_max = tmp(1); nelement_max = tmp(2)
186 nblock_tot = product(int(bdims, kind=
int_8))
189 IF (nblock_tot .NE. 0) occupation = 100.0_dp*real(nblock_sum,
dp)/real(nblock_tot,
dp)
191 IF (unit_nr_prv > 0)
THEN
192 WRITE (unit_nr_prv,
"(T2,A)") &
193 "DISTRIBUTION OF "//trim(
tensor%name)
194 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Number of non-zero blocks:", nblock_sum
195 WRITE (unit_nr_prv,
"(T15,A,T75,F6.2)")
"Percentage of non-zero blocks:", occupation
196 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Average number of blocks per CPU:", (nblock_sum + nproc - 1)/nproc
197 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Maximum number of blocks per CPU:", nblock_max
198 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Average number of matrix elements per CPU:", (nelement_sum + nproc - 1)/nproc
199 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Maximum number of matrix elements per CPU:", nelement_max
212 TYPE(dbt_type),
INTENT(INOUT) ::
tensor
213 INTEGER,
INTENT(IN) :: io_unit_master, io_unit_all
214 LOGICAL,
INTENT(IN),
OPTIONAL :: write_int
215 INTEGER,
DIMENSION(ndims_tensor(tensor)) :: blk_index, blk_size
216 REAL(kind=
dp),
ALLOCATABLE, &
217 DIMENSION(:,:) :: blk_values_2
218 REAL(kind=
dp),
ALLOCATABLE, &
219 DIMENSION(:,:,:) :: blk_values_3
220 REAL(kind=
dp),
ALLOCATABLE, &
221 DIMENSION(:,:,:,:) :: blk_values_4
222 TYPE(dbt_iterator_type) :: iterator
223 INTEGER :: proc, mynode
226 IF (io_unit_master > 0)
THEN
227 WRITE (io_unit_master,
'(T7,A)')
"(block index) @ process: (array index) value"
233 mynode =
tensor%pgrid%mp_comm_2d%mepos
234 cpassert(proc .EQ. mynode)
236 CALL dbt_get_block(
tensor, blk_index, blk_values_2, found)
239 blk_values_2=blk_values_2, write_int=write_int)
240 DEALLOCATE (blk_values_2)
243 CALL dbt_get_block(
tensor, blk_index, blk_values_3, found)
246 blk_values_3=blk_values_3, write_int=write_int)
247 DEALLOCATE (blk_values_3)
250 CALL dbt_get_block(
tensor, blk_index, blk_values_4, found)
253 blk_values_4=blk_values_4, write_int=write_int)
254 DEALLOCATE (blk_values_4)
272 blk_values_2, blk_values_3, blk_values_4, write_int)
273 CHARACTER(LEN=*),
INTENT(IN) :: name
274 INTEGER,
DIMENSION(:),
INTENT(IN) :: blk_size
275 INTEGER,
DIMENSION(:),
INTENT(IN) :: blk_index
277 DIMENSION(blk_size(1), blk_size(2)), &
278 INTENT(IN),
OPTIONAL :: blk_values_2
280 DIMENSION(blk_size(1), blk_size(2), blk_size(3)), &
281 INTENT(IN),
OPTIONAL :: blk_values_3
283 DIMENSION(blk_size(1), blk_size(2), blk_size(3), blk_size(4)), &
284 INTENT(IN),
OPTIONAL :: blk_values_4
285 LOGICAL,
INTENT(IN),
OPTIONAL :: write_int
286 LOGICAL :: write_int_prv
287 INTEGER,
INTENT(IN) :: unit_nr
288 INTEGER,
INTENT(IN) :: proc
289 INTEGER :: i_1, i_2, i_3, i_4
292 IF (
PRESENT(write_int))
THEN
293 write_int_prv = write_int
295 write_int_prv = .false.
298 ndim =
SIZE(blk_size)
300 IF (unit_nr > 0)
THEN
302 DO i_2 = 1, blk_size(2)
303 DO i_1 = 1, blk_size(1)
304 IF (write_int_prv)
THEN
305 WRITE (unit_nr,
'(T7,A,T16,A,2I3,1X,A,1X,I3,A,1X,A,2I3,1X,A,1X,I20)') &
306 trim(name),
"(", blk_index,
") @", proc,
':', &
307 "(", i_1, i_2,
")", &
308 int(blk_values_2(i_1, i_2), kind=
int_8)
310 WRITE (unit_nr,
'(T7,A,T16,A,2I3,1X,A,1X,I3,A,1X,A,2I3,1X,A,1X,F10.5)') &
311 trim(name),
"(", blk_index,
") @", proc,
':', &
312 "(", i_1, i_2,
")", &
313 blk_values_2(i_1, i_2)
319 DO i_3 = 1, blk_size(3)
320 DO i_2 = 1, blk_size(2)
321 DO i_1 = 1, blk_size(1)
322 IF (write_int_prv)
THEN
323 WRITE (unit_nr,
'(T7,A,T16,A,3I3,1X,A,1X,I3,A,1X,A,3I3,1X,A,1X,I20)') &
324 trim(name),
"(", blk_index,
") @", proc,
':', &
325 "(", i_1, i_2, i_3,
")", &
326 int(blk_values_3(i_1, i_2, i_3), kind=
int_8)
328 WRITE (unit_nr,
'(T7,A,T16,A,3I3,1X,A,1X,I3,A,1X,A,3I3,1X,A,1X,F10.5)') &
329 trim(name),
"(", blk_index,
") @", proc,
':', &
330 "(", i_1, i_2, i_3,
")", &
331 blk_values_3(i_1, i_2, i_3)
338 DO i_4 = 1, blk_size(4)
339 DO i_3 = 1, blk_size(3)
340 DO i_2 = 1, blk_size(2)
341 DO i_1 = 1, blk_size(1)
342 IF (write_int_prv)
THEN
343 WRITE (unit_nr,
'(T7,A,T16,A,4I3,1X,A,1X,I3,A,1X,A,4I3,1X,A,1X,I20)') &
344 trim(name),
"(", blk_index,
") @", proc,
':', &
345 "(", i_1, i_2, i_3, i_4,
")", &
346 int(blk_values_4(i_1, i_2, i_3, i_4), kind=
int_8)
348 WRITE (unit_nr,
'(T7,A,T16,A,4I3,1X,A,1X,I3,A,1X,A,4I3,1X,A,1X,F10.5)') &
349 trim(name),
"(", blk_index,
") @", proc,
':', &
350 "(", i_1, i_2, i_3, i_4,
")", &
351 blk_values_4(i_1, i_2, i_3, i_4)
365 TYPE(dbt_type),
INTENT(INOUT) ::
tensor
366 INTEGER,
INTENT(IN) :: io_unit_master, io_unit_all
367 TYPE(dbt_iterator_type) :: iterator
368 INTEGER,
DIMENSION(ndims_tensor(tensor)) :: blk_index, blk_size
369 INTEGER :: mynode, proc
371 IF (io_unit_master > 0)
THEN
372 WRITE (io_unit_master,
'(T7,A)')
"(block index) @ process: size"
379 mynode =
tensor%pgrid%mp_comm_2d%mepos
380 cpassert(proc .EQ. mynode)
382 WRITE (io_unit_all,
'(T7,A,T16,A,2I3,1X,A,1X,I3,A2,2I3)') &
383 trim(
tensor%name),
"blk index (", blk_index,
") @", proc,
":", blk_size
386 WRITE (io_unit_all,
'(T7,A,T16,A,3I3,1X,A,1X,I3,A2,3I3)') &
387 trim(
tensor%name),
"blk index (", blk_index,
") @", proc,
":", blk_size
390 WRITE (io_unit_all,
'(T7,A,T16,A,4I3,1X,A,1X,I3,A2,4I3)') &
391 trim(
tensor%name),
"blk index (", blk_index,
") @", proc,
":", blk_size
401 TYPE(dbt_pgrid_type),
INTENT(IN) :: pgrid
402 INTEGER,
INTENT(IN) :: unit_nr
404 IF (
ALLOCATED(pgrid%tas_split_info))
THEN
413 INTEGER,
INTENT(IN),
OPTIONAL :: unit_nr
414 INTEGER :: unit_nr_out
416 IF (
PRESENT(unit_nr))
THEN
417 unit_nr_out = unit_nr
Methods to operate on n-dimensional tensor blocks.
logical function, public dbt_iterator_blocks_left(iterator)
Generalization of block_iterator_blocks_left for tensors.
subroutine, public dbt_iterator_stop(iterator)
Generalization of block_iterator_stop for tensors.
subroutine, public dbt_iterator_start(iterator, tensor)
Generalization of block_iterator_start for tensors.
subroutine, public dbt_iterator_next_block(iterator, ind_nd, blk_size, blk_offset)
iterate over nd blocks of an nd rank tensor, index only (blocks must be retrieved by calling dbt_get_...
DBT tensor Input / Output.
subroutine, public dbt_write_block(name, blk_size, blk_index, proc, unit_nr, blk_values_2, blk_values_3, blk_values_4, write_int)
Write a tensor block.
subroutine, public dbt_write_blocks(tensor, io_unit_master, io_unit_all, write_int)
Write all tensor blocks.
subroutine, public dbt_write_block_indices(tensor, io_unit_master, io_unit_all)
subroutine, public dbt_write_tensor_info(tensor, unit_nr, full_info)
Write tensor global info: block dimensions, full dimensions and process grid dimensions.
subroutine, public dbt_write_tensor_dist(tensor, unit_nr)
Write info on tensor distribution & load balance.
subroutine, public dbt_write_split_info(pgrid, unit_nr)
integer function, public prep_output_unit(unit_nr)
tall-and-skinny matrices: Input / Output
subroutine, public dbt_tas_write_split_info(info, unit_nr, name)
Print info on how matrix is split.
DBT tensor framework for block-sparse tensor contraction: Types and create/destroy routines.
subroutine, public blk_dims_tensor(tensor, dims)
tensor block dimensions
subroutine, public dbt_get_info(tensor, nblks_total, nfull_total, nblks_local, nfull_local, pdims, my_ploc, blks_local_1, blks_local_2, blks_local_3, blks_local_4, proc_dist_1, proc_dist_2, proc_dist_3, proc_dist_4, blk_size_1, blk_size_2, blk_size_3, blk_size_4, blk_offset_1, blk_offset_2, blk_offset_3, blk_offset_4, distribution, name)
As block_get_info but for tensors.
pure integer function, public ndims_tensor(tensor)
tensor rank
pure integer function, public dbt_nblks_total(tensor, idim)
total numbers of blocks along dimension idim
pure integer function, public dbt_get_num_blocks(tensor)
As block_get_num_blocks: get number of local blocks.
integer(kind=int_8) function, public dbt_get_nze_total(tensor)
subroutine, public dbt_get_stored_coordinates(tensor, ind_nd, processor)
Generalization of block_get_stored_coordinates for tensors.
pure integer function, public dbt_get_nze(tensor)
integer(kind=int_8) function, public dbt_get_num_blocks_total(tensor)
Get total number of blocks.
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_string_length
Interface to the message passing library MPI.