99#include "./base/base_uses.f90"
106 INTEGER :: runtest(100)
107 REAL(KIND=
dp) :: max_memory
109 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'library_tests'
122 SUBROUTINE lib_test(root_section, para_env, globenv)
128 CHARACTER(LEN=*),
PARAMETER :: routinen =
'lib_test'
130 INTEGER :: handle, iw
133 TYPE(
section_vals_type),
POINTER :: cp_dbcsr_test_section, cp_fm_gemm_test_section, &
134 dbm_test_section, eigensolver_section, eri_mme_test_section, pw_transfer_section, &
135 rs_pw_transfer_section, shg_integrals_test_section
137 CALL timeset(routinen, handle)
143 WRITE (iw,
'(T2,79("*"))')
144 WRITE (iw,
'(A,T31,A,T80,A)')
' *',
' PERFORMANCE TESTS ',
'*'
145 WRITE (iw,
'(T2,79("*"))')
148 CALL test_input(root_section, para_env)
150 IF (runtest(1) /= 0)
CALL copy_test(para_env, iw)
152 IF (runtest(2) /= 0)
CALL matmul_test(para_env, test_matmul=.true., test_dgemm=.false., iw=iw)
153 IF (runtest(5) /= 0)
CALL matmul_test(para_env, test_matmul=.false., test_dgemm=.true., iw=iw)
155 IF (runtest(3) /= 0)
CALL fft_test(para_env, iw, globenv%fftw_plan_type, &
156 globenv%fftw_wisdom_file_name)
158 IF (runtest(4) /= 0)
CALL eri_test(iw)
164 IF (runtest(8) /= 0)
CALL mpi_perf_test(para_env, runtest(8), iw)
174 CALL rs_pw_transfer_test(para_env, iw, globenv, rs_pw_transfer_section)
180 CALL pw_fft_test(para_env, iw, globenv, pw_transfer_section)
186 CALL cp_fm_gemm_test(para_env, iw, cp_fm_gemm_test_section)
192 CALL eigensolver_test(para_env, iw, eigensolver_section)
211 CALL cp_dbcsr_tests(para_env, iw, cp_dbcsr_test_section)
218 CALL run_dbm_tests(para_env, iw, dbm_test_section)
223 CALL timestop(handle)
248 SUBROUTINE test_input(root_section, para_env)
272 END SUBROUTINE test_input
286 SUBROUTINE copy_test(para_env, iw)
290 INTEGER :: i, j, len, ntim, siz
291 REAL(kind=
dp) :: perf, t, tend, tstart
292 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ca, cb
296 siz = abs(runtest(1))
297 IF (para_env%is_source())
WRITE (iw,
'(//,A,/)')
" Test of copy ( F95 ) "
300 IF (8.0_dp*real(len, kind=
dp) > max_memory*0.5_dp)
EXIT
304 CALL random_number(ca)
305 ntim = nint(1.e7_dp/real(len, kind=
dp))
307 ntim = min(ntim, siz*10000)
312 ca(1) = real(j, kind=
dp)
317 perf = real(ntim, kind=
dp)*real(len, kind=
dp)*1.e-6_dp/t
322 IF (para_env%is_source())
THEN
323 WRITE (iw,
'(A,i2,i10,A,T59,F14.4,A)')
" Copy test: Size = 2^", i, &
324 len/1024,
" Kwords", perf,
" Mcopy/s"
331 END SUBROUTINE copy_test
344 SUBROUTINE matmul_test(para_env, test_matmul, test_dgemm, iw)
346 LOGICAL :: test_matmul, test_dgemm
349 INTEGER :: i, j, len, ntim, siz
350 REAL(kind=
dp) :: perf, t, tend, tstart, xdum
351 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ma, mb, mc
355 IF (test_matmul)
THEN
356 siz = abs(runtest(2))
357 IF (para_env%is_source())
WRITE (iw,
'(//,A,/)')
" Test of matmul ( F95 ) "
360 IF (8.0_dp*real(len*len, kind=
dp) > max_memory*0.3_dp)
EXIT
361 ALLOCATE (ma(len, len))
362 ALLOCATE (mb(len, len))
363 ALLOCATE (mc(len, len))
366 CALL random_number(xdum)
368 CALL random_number(xdum)
370 ntim = nint(1.e8_dp/(2.0_dp*real(len, kind=
dp)**3))
372 ntim = min(ntim, siz*200)
375 mc(:, :) = matmul(ma, mb)
376 ma(1, 1) = real(j, kind=
dp)
380 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
381 IF (para_env%is_source())
THEN
382 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
383 " Matrix multiply test: c = a * b Size = ", len, perf,
" Mflop/s"
387 mc(:, :) = mc + matmul(ma, mb)
388 ma(1, 1) = real(j, kind=
dp)
393 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
398 IF (para_env%is_source())
THEN
399 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
400 " Matrix multiply test: a = a * b Size = ", len, perf,
" Mflop/s"
405 mc(:, :) = mc + matmul(ma, transpose(mb))
406 ma(1, 1) = real(j, kind=
dp)
411 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
416 IF (para_env%is_source())
THEN
417 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
418 " Matrix multiply test: c = a * b(T) Size = ", len, perf,
" Mflop/s"
423 mc(:, :) = mc + matmul(transpose(ma), mb)
424 ma(1, 1) = real(j, kind=
dp)
429 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
434 IF (para_env%is_source())
THEN
435 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
436 " Matrix multiply test: c = a(T) * b Size = ", len, perf,
" Mflop/s"
447 siz = abs(runtest(5))
448 IF (para_env%is_source())
WRITE (iw,
'(//,A,/)')
" Test of matmul ( BLAS ) "
451 IF (8.0_dp*real(len*len, kind=
dp) > max_memory*0.3_dp)
EXIT
452 ALLOCATE (ma(len, len))
453 ALLOCATE (mb(len, len))
454 ALLOCATE (mc(len, len))
457 CALL random_number(xdum)
459 CALL random_number(xdum)
461 ntim = nint(1.e8_dp/(2.0_dp*real(len, kind=
dp)**3))
463 ntim = min(ntim, 1000)
467 CALL dgemm(
"N",
"N", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
472 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
477 IF (para_env%is_source())
THEN
478 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
479 " Matrix multiply test: c = a * b Size = ", len, perf,
" Mflop/s"
484 CALL dgemm(
"N",
"N", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
489 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
494 IF (para_env%is_source())
THEN
495 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
496 " Matrix multiply test: a = a * b Size = ", len, perf,
" Mflop/s"
501 CALL dgemm(
"N",
"T", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
506 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
511 IF (para_env%is_source())
THEN
512 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
513 " Matrix multiply test: c = a * b(T) Size = ", len, perf,
" Mflop/s"
518 CALL dgemm(
"T",
"N", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
523 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
528 IF (para_env%is_source())
THEN
529 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
530 " Matrix multiply test: c = a(T) * b Size = ", len, perf,
" Mflop/s"
541 END SUBROUTINE matmul_test
553 SUBROUTINE fft_test(para_env, iw, fftw_plan_type, wisdom_file)
556 INTEGER :: iw, fftw_plan_type
557 CHARACTER(LEN=*),
INTENT(IN) :: wisdom_file
559 INTEGER,
PARAMETER :: ndate(3) = [12, 48, 96]
561 INTEGER :: iall, it, j, len, n(3), ntim, radix_in, &
563 COMPLEX(KIND=dp),
DIMENSION(4, 4, 4) :: zz
564 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ca, cb, cc
565 CHARACTER(LEN=7) :: method
566 REAL(kind=
dp) :: flops, perf, scale, t, tdiff, tend, &
568 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ra
572 IF (para_env%is_source())
WRITE (iw,
'(//,A,/)')
" Test of 3D-FFT "
573 siz = abs(runtest(3))
580 CALL init_fft(
"FFTSG", alltoall=.false., fftsg_sizes=.true., wisdom_file=wisdom_file, &
581 pool_limit=10, plan_style=fftw_plan_type)
586 CALL init_fft(
"FFTW3", alltoall=.false., fftsg_sizes=.true., wisdom_file=wisdom_file, &
587 pool_limit=10, plan_style=fftw_plan_type)
599 IF (16.0_dp*real(len*len*len, kind=
dp) > max_memory*0.5_dp)
EXIT
600 ALLOCATE (ra(len, len, len))
601 ALLOCATE (ca(len, len, len))
602 CALL random_number(ra)
604 CALL random_number(ra)
605 ca(:, :, :) = ca +
gaussi*ra
606 flops = real(len**3, kind=
dp)*15.0_dp*log(real(len, kind=
dp))
607 ntim = nint(siz*1.e7_dp/flops)
609 ntim = min(ntim, 200)
610 scale = 1.0_dp/real(len**3, kind=
dp)
619 perf = real(ntim, kind=
dp)*2.0_dp*flops*1.e-6_dp/t
624 IF (para_env%is_source())
THEN
625 WRITE (iw,
'(T2,A,A,i6,T59,F14.4,A)') &
626 adjustr(method),
" test (in-place) Size = ", len, perf,
" Mflop/s"
631 IF (para_env%is_source())
WRITE (iw, *)
635 ALLOCATE (ra(len, len, len))
636 ALLOCATE (ca(len, len, len))
637 ALLOCATE (cb(len, len, len))
638 ALLOCATE (cc(len, len, len))
639 CALL random_number(ra)
641 CALL random_number(ra)
642 ca(:, :, :) = ca +
gaussi*ra
645 tdiff = maxval(abs(ca - cc))
646 IF (tdiff > 1.0e-12_dp)
THEN
647 IF (para_env%is_source())
THEN
648 WRITE (iw,
'(T2,A,A,A)') adjustr(method),
" FWFFT ", &
649 " Input array is changed in out-of-place FFT !"
652 IF (para_env%is_source())
THEN
653 WRITE (iw,
'(T2,A,A,A)') adjustr(method),
" FWFFT ", &
654 " Input array is not changed in out-of-place FFT !"
659 tdiff = maxval(abs(ca - cc))
660 IF (tdiff > 1.0e-12_dp)
THEN
661 IF (para_env%is_source())
THEN
662 WRITE (iw,
'(T2,A,A,A)') adjustr(method),
" BWFFT ", &
663 " Input array is changed in out-of-place FFT !"
666 IF (para_env%is_source())
THEN
667 WRITE (iw,
'(T2,A,A,A)') adjustr(method),
" BWFFT ", &
668 " Input array is not changed in out-of-place FFT !"
671 IF (para_env%is_source())
WRITE (iw, *)
681 END SUBROUTINE fft_test
693 SUBROUTINE rs_pw_transfer_test(para_env, iw, globenv, rs_pw_transfer_section)
700 CHARACTER(LEN=*),
PARAMETER :: routinen =
'rs_pw_transfer_test'
702 INTEGER :: halo_size, handle, i_loop, n_loop, ns_max
703 INTEGER,
DIMENSION(3) :: no, np
704 INTEGER,
DIMENSION(:),
POINTER :: i_vals
706 REAL(kind=
dp) :: tend, tstart
715 CALL timeset(routinen, handle)
718 CALL init_fft(globenv%default_fft_library, alltoall=.false., fftsg_sizes=.true., &
719 pool_limit=globenv%fft_pool_scratch_limit, &
720 wisdom_file=globenv%fftw_wisdom_file_name, &
721 plan_style=globenv%fftw_plan_type)
726 box%hmat = reshape([20.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 20.0_dp, 0.0_dp, &
727 0.0_dp, 0.0_dp, 20.0_dp], [3, 3])
743 ns_max = 2*halo_size + 1
744 CALL init_input_type(input_settings, ns_max, rs_grid_section, 1, [-1, -1, -1])
754 CALL random_number(rs_grid%r)
760 IF (para_env%is_source())
THEN
761 WRITE (iw,
'(T2,A)')
""
762 WRITE (iw,
'(T2,A)')
"Timing rs_pw_transfer routine"
763 WRITE (iw,
'(T2,A)')
""
764 WRITE (iw,
'(T2,A)')
"iteration time[s]"
766 DO i_loop = 1, n_loop
776 IF (para_env%is_source())
THEN
777 WRITE (iw,
'(T2,I9,1X,F12.6)') i_loop, tend - tstart
787 CALL finalize_fft(para_env, wisdom_file=globenv%fftw_wisdom_file_name)
789 CALL timestop(handle)
791 END SUBROUTINE rs_pw_transfer_test
804 SUBROUTINE pw_fft_test(para_env, iw, globenv, pw_transfer_section)
811 REAL(kind=
dp),
PARAMETER :: toler = 1.e-11_dp
813 INTEGER :: blocked_id, grid_span, i_layout, i_rep, &
814 ig, ip, itmp, n_loop, n_rep, nn, p, q
815 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: layouts
816 INTEGER,
DIMENSION(2) :: distribution_layout
817 INTEGER,
DIMENSION(3) :: no, np
818 INTEGER,
DIMENSION(:),
POINTER :: i_vals
819 LOGICAL :: debug, is_fullspace, odd, &
820 pw_grid_layout_all, spherical
821 REAL(kind=
dp) :: em, et, flops, gsq, perf, t, t_max, &
823 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: t_end, t_start
831 CALL init_fft(globenv%default_fft_library, alltoall=.false., fftsg_sizes=.true., &
832 pool_limit=globenv%fft_pool_scratch_limit, &
833 wisdom_file=globenv%fftw_wisdom_file_name, &
834 plan_style=globenv%fftw_plan_type)
839 box%hmat = reshape([10.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 8.0_dp, 0.0_dp, &
840 0.0_dp, 0.0_dp, 7.0_dp], [3, 3])
848 ALLOCATE (t_start(n_loop))
849 ALLOCATE (t_end(n_loop))
855 CALL section_vals_val_get(pw_transfer_section,
"PW_GRID_BLOCKED", i_rep_section=i_rep, i_val=blocked_id)
859 l_val=pw_grid_layout_all)
862 IF (pw_grid_layout_all)
THEN
866 DO p = 2, para_env%num_pe
867 q = para_env%num_pe/p
868 IF (p*q == para_env%num_pe)
THEN
873 ALLOCATE (layouts(2, itmp))
875 DO p = 2, para_env%num_pe
876 q = para_env%num_pe/p
877 IF (p*q == para_env%num_pe)
THEN
879 layouts(:, itmp) = [p, q]
883 CALL section_vals_val_get(pw_transfer_section,
"PW_GRID_LAYOUT", i_rep_section=i_rep, i_vals=i_vals)
884 ALLOCATE (layouts(2, 1))
885 layouts(:, 1) = i_vals
888 DO i_layout = 1,
SIZE(layouts, 2)
890 distribution_layout = layouts(:, i_layout)
898 is_fullspace = .false.
901 is_fullspace = .true.
904 is_fullspace = .false.
912 ELSE IF (is_fullspace)
THEN
923 CALL pw_grid_create(grid, para_env, box%hmat, grid_span=grid_span, odd=odd, spherical=spherical, &
924 blocked=blocked_id, npts=np, fft_usage=.true., &
925 rs_dims=distribution_layout, iounit=iw)
943 ca%array(ig) = exp(-gsq)
946 flops = product(no)*30.0_dp*log(real(maxval(no), kind=
dp))
959 perf = real(n_loop, kind=
dp)*2.0_dp*flops*1.e-6_dp/t
964 em = maxval(abs(ca%array(:) - cc%array(:)))
965 CALL para_env%max(em)
966 et = sum(abs(ca%array(:) - cc%array(:)))
967 CALL para_env%sum(et)
968 t_min = minval(t_end - t_start)
969 t_max = maxval(t_end - t_start)
971 IF (para_env%is_source())
THEN
973 WRITE (iw,
'(A,T67,E14.6)')
" Parallel FFT Tests: Maximal Error ", em
974 WRITE (iw,
'(A,T67,E14.6)')
" Parallel FFT Tests: Total Error ", et
975 WRITE (iw,
'(A,T67,F14.0)') &
976 " Parallel FFT Tests: Performance [Mflops] ", perf
977 WRITE (iw,
'(A,T67,F14.6)')
" Best time : ", t_min
978 WRITE (iw,
'(A,T67,F14.6)')
" Worst time: ", t_max
983 IF (em > toler .OR. et > toler)
THEN
984 cpwarn(
"The FFT results are not accurate ... starting debug pw_transfer")
1006 CALL finalize_fft(para_env, wisdom_file=globenv%fftw_wisdom_file_name)
1008 END SUBROUTINE pw_fft_test
1019 SUBROUTINE eigensolver_test(para_env, iw, eigensolver_section)
1025 INTEGER :: diag_method, i, i_loop, i_rep, &
1026 init_method, j, n, n_loop, n_rep, &
1028 REAL(kind=
dp) :: t1, t2
1029 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
1030 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: buffer
1033 TYPE(
cp_fm_type) :: eigenvectors, matrix, work
1037 WRITE (unit=iw, fmt=
"(/,/,T2,A,/)")
"EIGENSOLVER TEST"
1052 CALL section_vals_val_get(eigensolver_section,
"DIAG_METHOD", i_rep_section=i_rep, i_val=diag_method)
1053 CALL section_vals_val_get(eigensolver_section,
"INIT_METHOD", i_rep_section=i_rep, i_val=init_method)
1057 IF (neig < 0) neig = n
1062 WRITE (iw, *)
"Matrix size", n
1063 WRITE (iw, *)
"Number of eigenvalues", neig
1064 WRITE (iw, *)
"Timing loops", n_loop
1065 SELECT CASE (diag_method)
1067 WRITE (iw, *)
"Diag using syevd"
1069 WRITE (iw, *)
"Diag using syevx"
1074 SELECT CASE (init_method)
1076 WRITE (iw, *)
"using random matrix"
1078 WRITE (iw, *)
"reading from file"
1087 para_env=para_env, &
1088 context=blacs_env, &
1094 matrix_struct=fmstruct, &
1099 matrix_struct=fmstruct, &
1100 name=
"EIGENVECTORS")
1104 matrix_struct=fmstruct, &
1108 ALLOCATE (eigenvalues(n))
1109 eigenvalues = 0.0_dp
1110 ALLOCATE (buffer(1, n))
1113 IF (para_env%is_source())
THEN
1114 SELECT CASE (init_method)
1117 name=
"rng_stream", &
1119 extended_precision=.true.)
1122 file_action=
"READ", &
1123 file_form=
"FORMATTED", &
1124 file_status=
"OLD", &
1125 unit_number=unit_number)
1130 IF (para_env%is_source())
THEN
1131 SELECT CASE (init_method)
1134 buffer(1, j) = rng_stream%next() - 0.5_dp
1139 READ (unit=unit_number, fmt=*) buffer(1, 1:n)
1142 CALL para_env%bcast(buffer)
1143 SELECT CASE (init_method)
1146 new_values=buffer, &
1155 new_values=buffer, &
1165 new_values=buffer, &
1178 IF (para_env%is_source())
THEN
1179 SELECT CASE (init_method)
1185 DO i_loop = 1, n_loop
1186 eigenvalues = 0.0_dp
1193 SELECT CASE (diag_method)
1196 eigenvectors=eigenvectors, &
1197 eigenvalues=eigenvalues)
1200 eigenvectors=eigenvectors, &
1201 eigenvalues=eigenvalues, &
1206 IF (iw > 0)
WRITE (iw, *)
"Timing for loop ", i_loop,
" : ", t2 - t1
1210 WRITE (iw, *)
"Eigenvalues: "
1211 WRITE (unit=iw, fmt=
"(T3,5F14.6)") eigenvalues(1:neig)
1212 WRITE (unit=iw, fmt=
"(T3,A4,F16.6)")
"Sum:", sum(eigenvalues(1:neig))
1217 DEALLOCATE (eigenvalues)
1227 END SUBROUTINE eigensolver_test
1235 SUBROUTINE cp_fm_gemm_test(para_env, iw, cp_fm_gemm_test_section)
1241 CHARACTER(LEN=1) :: transa, transb
1242 INTEGER :: i_loop, i_rep, k, m, n, n_loop, n_rep, ncol_block, ncol_block_actual, &
1243 ncol_global, np, nrow_block, nrow_block_actual, nrow_global
1244 INTEGER,
DIMENSION(:),
POINTER :: grid_2d
1245 LOGICAL :: force_blocksize, row_major, transa_p, &
1247 REAL(kind=
dp) :: t1, t2, t3, t4
1250 TYPE(
cp_fm_type) :: matrix_a, matrix_b, matrix_c
1256 CALL section_vals_val_get(cp_fm_gemm_test_section,
"N_loop", i_rep_section=i_rep, i_val=n_loop)
1262 CALL section_vals_val_get(cp_fm_gemm_test_section,
"transa", i_rep_section=i_rep, l_val=transa_p)
1263 CALL section_vals_val_get(cp_fm_gemm_test_section,
"transb", i_rep_section=i_rep, l_val=transb_p)
1264 CALL section_vals_val_get(cp_fm_gemm_test_section,
"nrow_block", i_rep_section=i_rep, i_val=nrow_block)
1265 CALL section_vals_val_get(cp_fm_gemm_test_section,
"ncol_block", i_rep_section=i_rep, i_val=ncol_block)
1266 CALL section_vals_val_get(cp_fm_gemm_test_section,
"ROW_MAJOR", i_rep_section=i_rep, l_val=row_major)
1267 CALL section_vals_val_get(cp_fm_gemm_test_section,
"GRID_2D", i_rep_section=i_rep, i_vals=grid_2d)
1268 CALL section_vals_val_get(cp_fm_gemm_test_section,
"FORCE_BLOCKSIZE", i_rep_section=i_rep, l_val=force_blocksize)
1271 IF (transa_p) transa =
"T"
1272 IF (transb_p) transb =
"T"
1275 WRITE (iw,
'(T2,A)')
"----------- TESTING PARALLEL MATRIX MULTIPLY -------------"
1276 WRITE (iw,
'(T2,A)',
advance=
"NO")
"C = "
1278 WRITE (iw,
'(A)',
advance=
"NO")
"TRANSPOSE(A) x"
1280 WRITE (iw,
'(A)',
advance=
"NO")
"A x "
1283 WRITE (iw,
'(A)')
"TRANSPOSE(B) "
1285 WRITE (iw,
'(A)')
"B "
1287 WRITE (iw,
'(T2,A,T50,I5,A,I5)')
'requested block size', nrow_block,
' by ', ncol_block
1288 WRITE (iw,
'(T2,A,T50,I5)')
'number of repetitions of cp_fm_gemm ', n_loop
1289 WRITE (iw,
'(T2,A,T50,L5)')
'Row Major', row_major
1290 WRITE (iw,
'(T2,A,T50,2I7)')
'GRID_2D ', grid_2d
1291 WRITE (iw,
'(T2,A,T50,L5)')
'Force blocksize ', force_blocksize
1295 WRITE (iw,
'(T2,A,T50,I5)')
'PILAENV blocksize', np
1301 para_env=para_env, &
1302 row_major=row_major, &
1305 NULLIFY (fmstruct_a)
1307 nrow_global = m; ncol_global = k
1309 nrow_global = k; ncol_global = m
1312 nrow_global=nrow_global, ncol_global=ncol_global, &
1313 nrow_block=nrow_block, ncol_block=ncol_block, force_block=force_blocksize)
1314 CALL cp_fm_struct_get(fmstruct_a, nrow_block=nrow_block_actual, ncol_block=ncol_block_actual)
1315 IF (iw > 0)
WRITE (iw,
'(T2,A,I9,A,I9,A,I5,A,I5)')
'matrix A ', nrow_global,
" by ", ncol_global, &
1316 ' using blocks of ', nrow_block_actual,
' by ', ncol_block_actual
1319 nrow_global = n; ncol_global = m
1321 nrow_global = m; ncol_global = n
1323 NULLIFY (fmstruct_b)
1325 nrow_global=nrow_global, ncol_global=ncol_global, &
1326 nrow_block=nrow_block, ncol_block=ncol_block, force_block=force_blocksize)
1327 CALL cp_fm_struct_get(fmstruct_b, nrow_block=nrow_block_actual, ncol_block=ncol_block_actual)
1328 IF (iw > 0)
WRITE (iw,
'(T2,A,I9,A,I9,A,I5,A,I5)')
'matrix B ', nrow_global,
" by ", ncol_global, &
1329 ' using blocks of ', nrow_block_actual,
' by ', ncol_block_actual
1331 NULLIFY (fmstruct_c)
1335 nrow_global=nrow_global, ncol_global=ncol_global, &
1336 nrow_block=nrow_block, ncol_block=ncol_block, force_block=force_blocksize)
1337 CALL cp_fm_struct_get(fmstruct_c, nrow_block=nrow_block_actual, ncol_block=ncol_block_actual)
1338 IF (iw > 0)
WRITE (iw,
'(T2,A,I9,A,I9,A,I5,A,I5)')
'matrix C ', nrow_global,
" by ", ncol_global, &
1339 ' using blocks of ', nrow_block_actual,
' by ', ncol_block_actual
1341 CALL cp_fm_create(matrix=matrix_a, matrix_struct=fmstruct_a, name=
"MATRIX A")
1342 CALL cp_fm_create(matrix=matrix_b, matrix_struct=fmstruct_b, name=
"MATRIX B")
1343 CALL cp_fm_create(matrix=matrix_c, matrix_struct=fmstruct_c, name=
"MATRIX C")
1345 CALL random_number(matrix_a%local_data)
1346 CALL random_number(matrix_b%local_data)
1347 CALL random_number(matrix_c%local_data)
1352 DO i_loop = 1, n_loop
1354 CALL parallel_gemm(transa, transb, k, n, m, 1.0_dp, matrix_a, matrix_b, 0.0_dp, matrix_c)
1357 WRITE (iw,
'(T2,A,T50,F12.6)')
"cp_fm_gemm timing: ", (t4 - t3)
1364 WRITE (iw,
'(T2,A,T50,F12.6)')
"average cp_fm_gemm timing: ", (t2 - t1)/n_loop
1366 WRITE (iw,
'(T2,A,T50,F12.6)')
"cp_fm_gemm Gflops per MPI task: ", &
1367 2*real(m, kind=
dp)*real(n, kind=
dp)*real(k, kind=
dp)*n_loop/max(0.001_dp, t2 - t1)/1.0e9_dp/para_env%num_pe
1381 END SUBROUTINE cp_fm_gemm_test
1389 SUBROUTINE cp_dbcsr_tests(para_env, iw, input_section)
1395 CHARACTER,
DIMENSION(3) :: types
1396 INTEGER :: data_type, i_rep, k, m, n, n_loop, &
1398 INTEGER,
DIMENSION(:),
POINTER :: bs_k, bs_m, bs_n, nproc
1399 LOGICAL :: always_checksum, retain_sparsity, &
1401 REAL(kind=
dp) :: alpha, beta, filter_eps, s_a, s_b, s_c
1405 NULLIFY (bs_m, bs_n, bs_k)
1407 CALL dbcsr_reset_randmat_seed()
1426 CALL section_vals_val_get(input_section,
"keepsparse", i_rep_section=i_rep, l_val=retain_sparsity)
1441 i_rep_section=i_rep, r_val=filter_eps)
1442 CALL section_vals_val_get(input_section,
"ALWAYS_CHECKSUM", i_rep_section=i_rep, l_val=always_checksum)
1444 CALL dbcsr_run_tests(para_env%get_handle(), iw, nproc, &
1446 [transa_p, transb_p], &
1450 data_type=data_type, &
1451 test_type=test_type, &
1452 n_loops=n_loop, eps=filter_eps, retain_sparsity=retain_sparsity, &
1453 always_checksum=always_checksum)
1455 END SUBROUTINE cp_dbcsr_tests
1463 SUBROUTINE run_dbm_tests(para_env, iw, input_section)
1469 INTEGER :: i_rep, k, m, n, n_loop, n_rep
1470 INTEGER,
DIMENSION(:),
POINTER :: bs_k, bs_m, bs_n
1471 LOGICAL :: always_checksum, retain_sparsity, &
1473 REAL(kind=
dp) :: alpha, beta, filter_eps, s_a, s_b, s_c
1477 NULLIFY (bs_m, bs_n, bs_k)
1479 CALL dbcsr_reset_randmat_seed()
1490 CALL section_vals_val_get(input_section,
"keepsparse", i_rep_section=i_rep, l_val=retain_sparsity)
1497 CALL section_vals_val_get(input_section,
"ALWAYS_CHECKSUM", i_rep_section=i_rep, l_val=always_checksum)
1501 matrix_sizes=[m, n, k], &
1502 trs=[transa_p, transb_p], &
1506 sparsities=[s_a, s_b, s_c], &
1511 retain_sparsity=retain_sparsity, &
1512 always_checksum=always_checksum)
1514 END SUBROUTINE run_dbm_tests
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
Test of Electron Repulsion Routines (ERI)
real(kind=dp), parameter threshold
subroutine, public eri_test(iw)
...
Handles all functions related to the CELL.
subroutine, public init_cell(cell, hmat, periodic)
Initialise/readjust a simulation cell after hmat has been changed.
subroutine, public cell_create(cell, hmat, periodic, tag)
allocates and initializes a cell
Handles all functions related to the CELL.
subroutine, public cell_release(cell)
releases the given cell (see doc/ReferenceCounting.html)
Test of Clebsch-Gordon Coefficients.
subroutine, public clebsch_gordon_test()
...
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Interface to Minimax-Ewald method for periodic ERI's to be used in CP2K.
subroutine, public cp_eri_mme_perf_acc_test(para_env, iw, eri_mme_test_section)
...
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, c_first_col, c_first_row)
computes matrix_c = beta * matrix_c + alpha * ( matrix_a ** transa ) * ( matrix_b ** transb )
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_syevd(matrix, eigenvectors, eigenvalues, info)
Computes all eigenvalues and vectors of a real symmetric matrix significantly faster than syevx,...
subroutine, public cp_fm_syevx(matrix, eigenvectors, eigenvalues, neig, work_syevx)
compute eigenvalues and optionally eigenvectors of a real symmetric matrix using scalapack....
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_get(fmstruct, para_env, context, descriptor, ncol_block, nrow_block, nrow_global, ncol_global, first_p_pos, row_indices, col_indices, nrow_local, ncol_local, nrow_locals, ncol_locals, local_leading_dimension)
returns the values of various attributes of the matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_set_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
integer function, public cp_fm_pilaenv(ictxt, prec)
...
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
subroutine, public init_input_type(input_settings, nsmax, rs_grid_section, ilevel, higher_grid_layout)
parses an input section to assign the proper values to the input type
subroutine, public dbm_run_tests(mp_group, io_unit, matrix_sizes, trs, bs_m, bs_n, bs_k, sparsities, alpha, beta, n_loops, eps, retain_sparsity, always_checksum)
Tests the DBM library.
Define type storing the global information of a run. Keep the amount of stored data small....
Defines the basic variable types.
integer, parameter, public dp
Performance tests for basic tasks like matrix multiplies, copy, fft.
subroutine, public lib_test(root_section, para_env, globenv)
Master routine for tests.
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public gaussi
Interface to the message passing library MPI.
Routines to calculate the minimax coefficients in order to approximate 1/x as a sum over exponential ...
subroutine, public validate_exp_minimax(n_r, iw)
Unit test checking that numerical error of minimax approximations generated using any k15 or k53 coef...
Routines to calculate frequency and time grids (integration points and weights) for correlation metho...
subroutine, public test_least_square_ft(nr, iw)
test the singular value decomposition for the computation of integration weights for the Fourier tran...
Interface to the message passing library MPI.
subroutine, public mpi_perf_test(comm, npow, output_unit)
Tests the MPI library.
basic linear algebra operations for full matrixes
Parallel (pseudo)random number generator (RNG) for multiple streams and substreams of random numbers.
subroutine advance(self, e, c)
Advance the state by n steps, i.e. jump n steps forward, if n > 0, or backward if n < 0.
integer, parameter, public uniform
integer, parameter, public halfspace
integer, parameter, public fullspace
This module defines the grid data type and some basic operations on it.
subroutine, public pw_grid_release(pw_grid)
releases the given pw grid
subroutine, public rs_grid_print(rs, iounit)
Print information on grids to output.
subroutine, public rs_grid_create(rs, desc)
...
subroutine, public rs_grid_create_descriptor(desc, pw_grid, input_settings, border_points)
Determine the setup of real space grids - this is divided up into the creation of a descriptor and th...
subroutine, public transfer_pw2rs(rs, pw)
...
subroutine, public rs_grid_release_descriptor(rs_desc)
releases the given rs grid descriptor (see doc/ReferenceCounting.html)
subroutine, public transfer_rs2pw(rs, pw)
...
subroutine, public rs_grid_release(rs_grid)
releases the given rs grid (see doc/ReferenceCounting.html)
subroutine, public rs_grid_zero(rs)
Initialize grid to zero.
Calculates 2-center integrals for different r12 operators comparing the Solid harmonic Gaussian integ...
subroutine, public shg_integrals_perf_acc_test(iw, shg_integrals_test_section)
Unit test for performance and accuracy of the SHG integrals.
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains the initially parsed file and the initial parallel environment
stores all the informations relevant to an mpi environment