39#include "../../base/base_uses.f90"
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
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
56 mynode = mp_comm%mepos
66 CALL dbcsr_init_lib(mp_comm%get_handle(), io_unit)
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)
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", &
94 IF (mynode == 0)
WRITE (io_unit,
'(1X, A, 1X, A, I10, 1X, A, 1X, I10)')
"Split info for matrix", &
98 IF (mynode == 0)
WRITE (io_unit,
'(1X, A, 1X, A, I10, 1X, A, 1X, I10)')
"Split info for matrix", &
102 IF (mynode == 0)
WRITE (io_unit,
'(1X, A, 1X, A, I10, 1X, A, 1X, I10)')
"Split info for matrix", &
106 IF (mynode == 0)
WRITE (io_unit,
'(1X, A, 1X, A, I10, 1X, A, 1X, I10)')
"Split info for matrix", &
110 IF (mynode == 0)
WRITE (io_unit,
'(1X, A, 1X, A, I10, 1X, A, 1X, I10)')
"Split info for matrix", &
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)
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)
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)
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)
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)
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()
166 CALL dbcsr_finalize_lib()
program dbt_tas_unittest
Unit testing for tall-and-skinny matrices.
subroutine, public dbm_library_init()
Initialize DBM library.
subroutine, public dbm_library_finalize()
Finalize DBM library.
character(len=default_string_length) function, public dbm_get_name(matrix)
Returns the name of the matrix of the given matrix.
subroutine, public dbm_library_print_stats(mpi_comm, output_unit)
Print DBM library statistics.
Tall-and-skinny matrices: base routines similar to DBM API, mostly wrappers around existing DBM routi...
pure integer(kind=int_8) function, public dbt_tas_nblkrows_total(matrix)
...
pure integer(kind=int_8) function, public dbt_tas_nblkcols_total(matrix)
...
type(dbt_tas_split_info) function, pointer, public dbt_tas_info(matrix)
get info on mpi grid splitting
subroutine, public dbt_tas_destroy(matrix)
...
tall-and-skinny matrices: Input / Output
subroutine, public dbt_tas_write_split_info(info, unit_nr, name)
Print info on how matrix is split.
testing infrastructure for tall-and-skinny matrices
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.
subroutine, public dbt_tas_reset_randmat_seed()
Reset the seed used for generating random matrices to default value.
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.
subroutine, public dbt_tas_random_bsizes(sizes, repeat, dbt_sizes)
Create random block sizes.
DBT tall-and-skinny base types. Mostly wrappers around existing DBM routines.
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
integer, parameter, public default_output_unit
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.
subroutine, public offload_set_chosen_device(device_id)
Selects the chosen device to be used.
integer function, public offload_get_device_count()
Returns the number of available devices.