(git:ccc2433)
dbt_tas_unittest.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 Unit testing for tall-and-skinny matrices
10 !> \author Patrick Seewald
11 ! **************************************************************************************************
13  USE dbcsr_api, ONLY: dbcsr_finalize_lib,&
14  dbcsr_init_lib
15  USE dbm_api, ONLY: dbm_get_name,&
19  USE dbt_tas_base, ONLY: dbt_tas_create,&
21  dbt_tas_info,&
29  USE dbt_tas_types, ONLY: dbt_tas_type
30  USE kinds, ONLY: dp,&
31  int_8
32  USE machine, ONLY: default_output_unit
33  USE message_passing, ONLY: mp_cart_type,&
34  mp_comm_type,&
39 #include "../../base/base_uses.f90"
40 
41  IMPLICIT NONE
42 
43  INTEGER(KIND=int_8), PARAMETER :: m = 100, k = 20, n = 10
44  TYPE(dbt_tas_type) :: a, b, c, at, bt, ct, a_out, b_out, c_out, at_out, bt_out, ct_out
45  INTEGER, DIMENSION(m) :: bsize_m
46  INTEGER, DIMENSION(n) :: bsize_n
47  INTEGER, DIMENSION(k) :: bsize_k
48  REAL(kind=dp), PARAMETER :: sparsity = 0.1
49  INTEGER :: mynode, io_unit
50  TYPE(mp_comm_type) :: mp_comm
51  TYPE(mp_cart_type) :: mp_comm_a, mp_comm_at, mp_comm_b, mp_comm_bt, mp_comm_c, mp_comm_ct
52  REAL(kind=dp), PARAMETER :: filter_eps = 1.0e-08
53 
54  CALL mp_world_init(mp_comm)
55 
56  mynode = mp_comm%mepos
57 
58  ! Select active offload device when available.
59  IF (offload_get_device_count() > 0) THEN
61  END IF
62 
63  io_unit = -1
64  IF (mynode .EQ. 0) io_unit = default_output_unit
65 
66  CALL dbcsr_init_lib(mp_comm%get_handle(), io_unit) ! Needed for DBM_VALIDATE_AGAINST_DBCSR.
67  CALL dbm_library_init()
68 
70 
71  CALL dbt_tas_random_bsizes([13, 8, 5, 25, 12], 2, bsize_m)
72  CALL dbt_tas_random_bsizes([3, 78, 33, 12, 3, 15], 1, bsize_n)
73  CALL dbt_tas_random_bsizes([9, 64, 23, 2], 3, bsize_k)
74 
75  CALL dbt_tas_setup_test_matrix(a, mp_comm_a, mp_comm, m, k, bsize_m, bsize_k, [5, 1], "A", sparsity)
76  CALL dbt_tas_setup_test_matrix(at, mp_comm_at, mp_comm, k, m, bsize_k, bsize_m, [3, 8], "A^t", sparsity)
77  CALL dbt_tas_setup_test_matrix(b, mp_comm_b, mp_comm, n, m, bsize_n, bsize_m, [3, 2], "B", sparsity)
78  CALL dbt_tas_setup_test_matrix(bt, mp_comm_bt, mp_comm, m, n, bsize_m, bsize_n, [1, 3], "B^t", sparsity)
79  CALL dbt_tas_setup_test_matrix(c, mp_comm_c, mp_comm, k, n, bsize_k, bsize_n, [5, 7], "C", sparsity)
80  CALL dbt_tas_setup_test_matrix(ct, mp_comm_ct, mp_comm, n, k, bsize_n, bsize_k, [1, 1], "C^t", sparsity)
81 
82  CALL dbt_tas_create(a, a_out)
83  CALL dbt_tas_create(at, at_out)
84  CALL dbt_tas_create(b, b_out)
85  CALL dbt_tas_create(bt, bt_out)
86  CALL dbt_tas_create(c, c_out)
87  CALL dbt_tas_create(ct, ct_out)
88 
89  IF (mynode == 0) WRITE (io_unit, '(A)') "DBM TALL-AND-SKINNY MATRICES"
90  IF (mynode == 0) WRITE (io_unit, '(1X, A, 1X, A, I10, 1X, A, 1X, I10)') "Split info for matrix", &
91  trim(dbm_get_name(a%matrix)), &
93  CALL dbt_tas_write_split_info(dbt_tas_info(a), io_unit, name="A")
94  IF (mynode == 0) WRITE (io_unit, '(1X, A, 1X, A, I10, 1X, A, 1X, I10)') "Split info for matrix", &
95  trim(dbm_get_name(at%matrix)), &
97  CALL dbt_tas_write_split_info(dbt_tas_info(at), io_unit, name="At")
98  IF (mynode == 0) WRITE (io_unit, '(1X, A, 1X, A, I10, 1X, A, 1X, I10)') "Split info for matrix", &
99  trim(dbm_get_name(b%matrix)), &
101  CALL dbt_tas_write_split_info(dbt_tas_info(b), io_unit, name="B")
102  IF (mynode == 0) WRITE (io_unit, '(1X, A, 1X, A, I10, 1X, A, 1X, I10)') "Split info for matrix", &
103  trim(dbm_get_name(bt%matrix)), &
105  CALL dbt_tas_write_split_info(dbt_tas_info(bt), io_unit, name="Bt")
106  IF (mynode == 0) WRITE (io_unit, '(1X, A, 1X, A, I10, 1X, A, 1X, I10)') "Split info for matrix", &
107  trim(dbm_get_name(c%matrix)), &
109  CALL dbt_tas_write_split_info(dbt_tas_info(c), io_unit, name="C")
110  IF (mynode == 0) WRITE (io_unit, '(1X, A, 1X, A, I10, 1X, A, 1X, I10)') "Split info for matrix", &
111  trim(dbm_get_name(ct%matrix)), &
113  CALL dbt_tas_write_split_info(dbt_tas_info(ct), io_unit, name="Ct")
114 
115  CALL dbt_tas_test_mm(.false., .false., .false., b, a, ct_out, unit_nr=io_unit, filter_eps=filter_eps)
116  CALL dbt_tas_test_mm(.true., .false., .false., bt, a, ct_out, unit_nr=io_unit, filter_eps=filter_eps)
117  CALL dbt_tas_test_mm(.false., .true., .false., b, at, ct_out, unit_nr=io_unit, filter_eps=filter_eps)
118  CALL dbt_tas_test_mm(.true., .true., .false., bt, at, ct_out, unit_nr=io_unit, filter_eps=filter_eps)
119  CALL dbt_tas_test_mm(.false., .false., .true., b, a, c_out, unit_nr=io_unit, filter_eps=filter_eps)
120  CALL dbt_tas_test_mm(.true., .false., .true., bt, a, c_out, unit_nr=io_unit, filter_eps=filter_eps)
121  CALL dbt_tas_test_mm(.false., .true., .true., b, at, c_out, unit_nr=io_unit, filter_eps=filter_eps)
122  CALL dbt_tas_test_mm(.true., .true., .true., bt, at, c_out, unit_nr=io_unit, filter_eps=filter_eps)
123 
124  CALL dbt_tas_test_mm(.false., .false., .false., a, c, bt_out, unit_nr=io_unit, filter_eps=filter_eps)
125  CALL dbt_tas_test_mm(.true., .false., .false., at, c, bt_out, unit_nr=io_unit, filter_eps=filter_eps)
126  CALL dbt_tas_test_mm(.false., .true., .false., a, ct, bt_out, unit_nr=io_unit, filter_eps=filter_eps)
127  CALL dbt_tas_test_mm(.true., .true., .false., at, ct, bt_out, unit_nr=io_unit, filter_eps=filter_eps)
128 
129  CALL dbt_tas_test_mm(.false., .false., .true., a, c, b_out, unit_nr=io_unit, filter_eps=filter_eps)
130  CALL dbt_tas_test_mm(.true., .false., .true., at, c, b_out, unit_nr=io_unit, filter_eps=filter_eps)
131  CALL dbt_tas_test_mm(.false., .true., .true., a, ct, b_out, unit_nr=io_unit, filter_eps=filter_eps)
132  CALL dbt_tas_test_mm(.true., .true., .true., at, ct, b_out, unit_nr=io_unit, filter_eps=filter_eps)
133 
134  CALL dbt_tas_test_mm(.false., .false., .false., c, b, at_out, unit_nr=io_unit, filter_eps=filter_eps)
135  CALL dbt_tas_test_mm(.true., .false., .false., ct, b, at_out, unit_nr=io_unit, filter_eps=filter_eps)
136  CALL dbt_tas_test_mm(.false., .true., .false., c, bt, at_out, unit_nr=io_unit, filter_eps=filter_eps)
137  CALL dbt_tas_test_mm(.true., .true., .false., ct, bt, at_out, unit_nr=io_unit, filter_eps=filter_eps)
138 
139  CALL dbt_tas_test_mm(.false., .false., .true., c, b, a_out, unit_nr=io_unit, filter_eps=filter_eps)
140  CALL dbt_tas_test_mm(.true., .false., .true., ct, b, a_out, unit_nr=io_unit, filter_eps=filter_eps)
141  CALL dbt_tas_test_mm(.false., .true., .true., c, bt, a_out, unit_nr=io_unit, filter_eps=filter_eps)
142  CALL dbt_tas_test_mm(.true., .true., .true., ct, bt, a_out, unit_nr=io_unit, filter_eps=filter_eps)
143 
144  CALL dbt_tas_destroy(a)
145  CALL dbt_tas_destroy(at)
146  CALL dbt_tas_destroy(b)
147  CALL dbt_tas_destroy(bt)
148  CALL dbt_tas_destroy(c)
149  CALL dbt_tas_destroy(ct)
150  CALL dbt_tas_destroy(a_out)
151  CALL dbt_tas_destroy(at_out)
152  CALL dbt_tas_destroy(b_out)
153  CALL dbt_tas_destroy(bt_out)
154  CALL dbt_tas_destroy(c_out)
155  CALL dbt_tas_destroy(ct_out)
156 
157  CALL mp_comm_a%free()
158  CALL mp_comm_at%free()
159  CALL mp_comm_b%free()
160  CALL mp_comm_bt%free()
161  CALL mp_comm_c%free()
162  CALL mp_comm_ct%free()
163 
164  CALL dbm_library_print_stats(mp_comm, io_unit)
165  CALL dbm_library_finalize()
166  CALL dbcsr_finalize_lib() ! Needed for DBM_VALIDATE_AGAINST_DBCSR.
167  CALL mp_world_finalize()
168 
169 END PROGRAM
program dbt_tas_unittest
Unit testing for tall-and-skinny matrices.
Definition: dbm_api.F:8
subroutine, public dbm_library_init()
Initialize DBM library.
Definition: dbm_api.F:1483
subroutine, public dbm_library_finalize()
Finalize DBM library.
Definition: dbm_api.F:1497
character(len=default_string_length) function, public dbm_get_name(matrix)
Returns the name of the matrix of the given matrix.
Definition: dbm_api.F:1023
subroutine, public dbm_library_print_stats(mpi_comm, output_unit)
Print DBM library statistics.
Definition: dbm_api.F:1513
Tall-and-skinny matrices: base routines similar to DBM API, mostly wrappers around existing DBM routi...
Definition: dbt_tas_base.F:13
integer(kind=int_8) function, public dbt_tas_nblkrows_total(matrix)
...
Definition: dbt_tas_base.F:835
type(dbt_tas_split_info) function, public dbt_tas_info(matrix)
get info on mpi grid splitting
Definition: dbt_tas_base.F:822
integer(kind=int_8) function, public dbt_tas_nblkcols_total(matrix)
...
Definition: dbt_tas_base.F:861
subroutine, public dbt_tas_destroy(matrix)
...
Definition: dbt_tas_base.F:233
tall-and-skinny matrices: Input / Output
Definition: dbt_tas_io.F:12
subroutine, public dbt_tas_write_split_info(info, unit_nr, name)
Print info on how matrix is split.
Definition: dbt_tas_io.F:214
testing infrastructure for tall-and-skinny matrices
Definition: dbt_tas_test.F:12
subroutine, public dbt_tas_test_mm(transa, transb, transc, matrix_a, matrix_b, matrix_c, filter_eps, unit_nr, log_verbose)
Test tall-and-skinny matrix multiplication for accuracy.
Definition: dbt_tas_test.F:320
subroutine, public dbt_tas_reset_randmat_seed()
Reset the seed used for generating random matrices to default value.
Definition: dbt_tas_test.F:510
subroutine, public dbt_tas_setup_test_matrix(matrix, mp_comm_out, mp_comm, nrows, ncols, rbsizes, cbsizes, dist_splitsize, name, sparsity, reuse_comm)
Setup tall-and-skinny matrix for testing.
Definition: dbt_tas_test.F:70
subroutine, public dbt_tas_random_bsizes(sizes, repeat, dbt_sizes)
Create random block sizes.
Definition: dbt_tas_test.F:493
DBT tall-and-skinny base types. Mostly wrappers around existing DBM routines.
Definition: dbt_tas_types.F:13
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public int_8
Definition: kinds.F:54
integer, parameter, public dp
Definition: kinds.F:34
Machine interface based on Fortran 2003 and POSIX.
Definition: machine.F:17
integer, parameter, public default_output_unit
Definition: machine.F:45
Interface to the message passing library MPI.
subroutine, public mp_world_init(mp_comm)
initializes the system default communicator
subroutine, public mp_world_finalize()
finalizes the system default communicator
Fortran API for the offload package, which is written in C.
Definition: offload_api.F:12
subroutine, public offload_set_chosen_device(device_id)
Selects the chosen device to be used.
Definition: offload_api.F:132
integer function, public offload_get_device_count()
Returns the number of available devices.
Definition: offload_api.F:112