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, &
157 globenv%fftw_wisdom_file_explicit)
159 IF (runtest(4) /= 0)
CALL eri_test(iw)
165 IF (runtest(8) /= 0)
CALL mpi_perf_test(para_env, runtest(8), iw)
175 CALL rs_pw_transfer_test(para_env, iw, globenv, rs_pw_transfer_section)
181 CALL pw_fft_test(para_env, iw, globenv, pw_transfer_section)
187 CALL cp_fm_gemm_test(para_env, iw, cp_fm_gemm_test_section)
193 CALL eigensolver_test(para_env, iw, eigensolver_section)
212 CALL cp_dbcsr_tests(para_env, iw, cp_dbcsr_test_section)
219 CALL run_dbm_tests(para_env, iw, dbm_test_section)
224 CALL timestop(handle)
249 SUBROUTINE test_input(root_section, para_env)
273 END SUBROUTINE test_input
287 SUBROUTINE copy_test(para_env, iw)
291 INTEGER :: i, j, len, ntim, siz
292 REAL(kind=
dp) :: perf, t, tend, tstart
293 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ca, cb
297 siz = abs(runtest(1))
298 IF (para_env%is_source())
WRITE (iw,
'(//,A,/)')
" Test of copy ( F95 ) "
301 IF (8.0_dp*real(len, kind=
dp) > max_memory*0.5_dp)
EXIT
305 CALL random_number(ca)
306 ntim = nint(1.e7_dp/real(len, kind=
dp))
308 ntim = min(ntim, siz*10000)
313 ca(1) = real(j, kind=
dp)
318 perf = real(ntim, kind=
dp)*real(len, kind=
dp)*1.e-6_dp/t
323 IF (para_env%is_source())
THEN
324 WRITE (iw,
'(A,i2,i10,A,T59,F14.4,A)')
" Copy test: Size = 2^", i, &
325 len/1024,
" Kwords", perf,
" Mcopy/s"
332 END SUBROUTINE copy_test
345 SUBROUTINE matmul_test(para_env, test_matmul, test_dgemm, iw)
347 LOGICAL :: test_matmul, test_dgemm
350 INTEGER :: i, j, len, ntim, siz
351 REAL(kind=
dp) :: perf, t, tend, tstart, xdum
352 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ma, mb, mc
356 IF (test_matmul)
THEN
357 siz = abs(runtest(2))
358 IF (para_env%is_source())
WRITE (iw,
'(//,A,/)')
" Test of matmul ( F95 ) "
361 IF (8.0_dp*real(len*len, kind=
dp) > max_memory*0.3_dp)
EXIT
362 ALLOCATE (ma(len, len))
363 ALLOCATE (mb(len, len))
364 ALLOCATE (mc(len, len))
367 CALL random_number(xdum)
369 CALL random_number(xdum)
371 ntim = nint(1.e8_dp/(2.0_dp*real(len, kind=
dp)**3))
373 ntim = min(ntim, siz*200)
376 mc(:, :) = matmul(ma, mb)
377 ma(1, 1) = real(j, kind=
dp)
381 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
382 IF (para_env%is_source())
THEN
383 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
384 " Matrix multiply test: c = a * b Size = ", len, perf,
" Mflop/s"
388 mc(:, :) = mc + matmul(ma, mb)
389 ma(1, 1) = real(j, kind=
dp)
394 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
399 IF (para_env%is_source())
THEN
400 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
401 " Matrix multiply test: a = a * b Size = ", len, perf,
" Mflop/s"
406 mc(:, :) = mc + matmul(ma, transpose(mb))
407 ma(1, 1) = real(j, kind=
dp)
412 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
417 IF (para_env%is_source())
THEN
418 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
419 " Matrix multiply test: c = a * b(T) Size = ", len, perf,
" Mflop/s"
424 mc(:, :) = mc + matmul(transpose(ma), mb)
425 ma(1, 1) = real(j, kind=
dp)
430 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
435 IF (para_env%is_source())
THEN
436 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
437 " Matrix multiply test: c = a(T) * b Size = ", len, perf,
" Mflop/s"
448 siz = abs(runtest(5))
449 IF (para_env%is_source())
WRITE (iw,
'(//,A,/)')
" Test of matmul ( BLAS ) "
452 IF (8.0_dp*real(len*len, kind=
dp) > max_memory*0.3_dp)
EXIT
453 ALLOCATE (ma(len, len))
454 ALLOCATE (mb(len, len))
455 ALLOCATE (mc(len, len))
458 CALL random_number(xdum)
460 CALL random_number(xdum)
462 ntim = nint(1.e8_dp/(2.0_dp*real(len, kind=
dp)**3))
464 ntim = min(ntim, 1000)
468 CALL dgemm(
"N",
"N", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
473 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
478 IF (para_env%is_source())
THEN
479 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
480 " Matrix multiply test: c = a * b Size = ", len, perf,
" Mflop/s"
485 CALL dgemm(
"N",
"N", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
490 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
495 IF (para_env%is_source())
THEN
496 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
497 " Matrix multiply test: a = a * b Size = ", len, perf,
" Mflop/s"
502 CALL dgemm(
"N",
"T", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
507 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
512 IF (para_env%is_source())
THEN
513 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
514 " Matrix multiply test: c = a * b(T) Size = ", len, perf,
" Mflop/s"
519 CALL dgemm(
"T",
"N", len, len, len, 1.0_dp, ma, len, mb, len, 1.0_dp, mc, len)
524 perf = real(ntim, kind=
dp)*2.0_dp*real(len, kind=
dp)**3*1.e-6_dp/t
529 IF (para_env%is_source())
THEN
530 WRITE (iw,
'(A,i6,T59,F14.4,A)') &
531 " Matrix multiply test: c = a(T) * b Size = ", len, perf,
" Mflop/s"
542 END SUBROUTINE matmul_test
555 SUBROUTINE fft_test(para_env, iw, fftw_plan_type, wisdom_file, export_wisdom)
558 INTEGER :: iw, fftw_plan_type
559 CHARACTER(LEN=*),
INTENT(IN) :: wisdom_file
560 LOGICAL,
INTENT(IN) :: export_wisdom
562 INTEGER,
PARAMETER :: ndate(3) = [12, 48, 96]
564 INTEGER :: iall, it, j, len, n(3), ntim, radix_in, &
566 COMPLEX(KIND=dp),
DIMENSION(4, 4, 4) :: zz
567 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ca, cb, cc
568 CHARACTER(LEN=7) :: method
569 REAL(kind=
dp) :: flops, perf, scale, t, tdiff, tend, &
571 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: ra
575 IF (para_env%is_source())
WRITE (iw,
'(//,A,/)')
" Test of 3D-FFT "
576 siz = abs(runtest(3))
583 CALL init_fft(
"FFTSG", alltoall=.false., wisdom_file=wisdom_file, &
584 pool_limit=10, plan_style=fftw_plan_type)
589 CALL init_fft(
"FFTW3", alltoall=.false., wisdom_file=wisdom_file, &
590 pool_limit=10, plan_style=fftw_plan_type)
602 IF (16.0_dp*real(len*len*len, kind=
dp) > max_memory*0.5_dp)
EXIT
603 ALLOCATE (ra(len, len, len))
604 ALLOCATE (ca(len, len, len))
605 CALL random_number(ra)
607 CALL random_number(ra)
608 ca(:, :, :) = ca +
gaussi*ra
609 flops = real(len**3, kind=
dp)*15.0_dp*log(real(len, kind=
dp))
610 ntim = nint(siz*1.e7_dp/flops)
612 ntim = min(ntim, 200)
613 scale = 1.0_dp/real(len**3, kind=
dp)
622 perf = real(ntim, kind=
dp)*2.0_dp*flops*1.e-6_dp/t
627 IF (para_env%is_source())
THEN
628 WRITE (iw,
'(T2,A,A,i6,T59,F14.4,A)') &
629 adjustr(method),
" test (in-place) Size = ", len, perf,
" Mflop/s"
634 IF (para_env%is_source())
WRITE (iw, *)
638 ALLOCATE (ra(len, len, len))
639 ALLOCATE (ca(len, len, len))
640 ALLOCATE (cb(len, len, len))
641 ALLOCATE (cc(len, len, len))
642 CALL random_number(ra)
644 CALL random_number(ra)
645 ca(:, :, :) = ca +
gaussi*ra
648 tdiff = maxval(abs(ca - cc))
649 IF (tdiff > 1.0e-12_dp)
THEN
650 IF (para_env%is_source())
THEN
651 WRITE (iw,
'(T2,A,A,A)') adjustr(method),
" FWFFT ", &
652 " Input array is changed in out-of-place FFT !"
655 IF (para_env%is_source())
THEN
656 WRITE (iw,
'(T2,A,A,A)') adjustr(method),
" FWFFT ", &
657 " Input array is not changed in out-of-place FFT !"
662 tdiff = maxval(abs(ca - cc))
663 IF (tdiff > 1.0e-12_dp)
THEN
664 IF (para_env%is_source())
THEN
665 WRITE (iw,
'(T2,A,A,A)') adjustr(method),
" BWFFT ", &
666 " Input array is changed in out-of-place FFT !"
669 IF (para_env%is_source())
THEN
670 WRITE (iw,
'(T2,A,A,A)') adjustr(method),
" BWFFT ", &
671 " Input array is not changed in out-of-place FFT !"
674 IF (para_env%is_source())
WRITE (iw, *)
681 CALL finalize_fft(para_env, wisdom_file=wisdom_file, export_wisdom=export_wisdom)
684 END SUBROUTINE fft_test
696 SUBROUTINE rs_pw_transfer_test(para_env, iw, globenv, rs_pw_transfer_section)
703 CHARACTER(LEN=*),
PARAMETER :: routinen =
'rs_pw_transfer_test'
705 INTEGER :: halo_size, handle, i_loop, n_loop, ns_max
706 INTEGER,
DIMENSION(3) :: no, np
707 INTEGER,
DIMENSION(:),
POINTER :: i_vals
709 REAL(kind=
dp) :: tend, tstart
718 CALL timeset(routinen, handle)
721 CALL init_fft(globenv%default_fft_library, alltoall=.false., &
722 pool_limit=globenv%fft_pool_scratch_limit, &
723 wisdom_file=globenv%fftw_wisdom_file_name, &
724 plan_style=globenv%fftw_plan_type)
729 box%hmat = reshape([20.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 20.0_dp, 0.0_dp, &
730 0.0_dp, 0.0_dp, 20.0_dp], [3, 3])
746 ns_max = 2*halo_size + 1
747 CALL init_input_type(input_settings, ns_max, rs_grid_section, 1, [-1, -1, -1])
757 CALL random_number(rs_grid%r)
763 IF (para_env%is_source())
THEN
764 WRITE (iw,
'(T2,A)')
""
765 WRITE (iw,
'(T2,A)')
"Timing rs_pw_transfer routine"
766 WRITE (iw,
'(T2,A)')
""
767 WRITE (iw,
'(T2,A)')
"iteration time[s]"
769 DO i_loop = 1, n_loop
779 IF (para_env%is_source())
THEN
780 WRITE (iw,
'(T2,I9,1X,F12.6)') i_loop, tend - tstart
790 CALL finalize_fft(para_env, wisdom_file=globenv%fftw_wisdom_file_name, &
791 export_wisdom=globenv%fftw_wisdom_file_explicit)
793 CALL timestop(handle)
795 END SUBROUTINE rs_pw_transfer_test
808 SUBROUTINE pw_fft_test(para_env, iw, globenv, pw_transfer_section)
815 REAL(kind=
dp),
PARAMETER :: toler = 1.e-11_dp
817 INTEGER :: blocked_id, grid_span, i_layout, i_rep, &
818 ig, ip, itmp, n_loop, n_rep, nn, p, q
819 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: layouts
820 INTEGER,
DIMENSION(2) :: distribution_layout
821 INTEGER,
DIMENSION(3) :: no, np
822 INTEGER,
DIMENSION(:),
POINTER :: i_vals
823 LOGICAL :: debug, is_fullspace, odd, &
824 pw_grid_layout_all, spherical
825 REAL(kind=
dp) :: em, et, flops, gsq, perf, t, t_max, &
827 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: t_end, t_start
835 CALL init_fft(globenv%default_fft_library, alltoall=.false., &
836 pool_limit=globenv%fft_pool_scratch_limit, &
837 wisdom_file=globenv%fftw_wisdom_file_name, &
838 plan_style=globenv%fftw_plan_type)
843 box%hmat = reshape([10.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 8.0_dp, 0.0_dp, &
844 0.0_dp, 0.0_dp, 7.0_dp], [3, 3])
852 ALLOCATE (t_start(n_loop))
853 ALLOCATE (t_end(n_loop))
859 CALL section_vals_val_get(pw_transfer_section,
"PW_GRID_BLOCKED", i_rep_section=i_rep, i_val=blocked_id)
863 l_val=pw_grid_layout_all)
866 IF (pw_grid_layout_all)
THEN
870 DO p = 2, para_env%num_pe
871 q = para_env%num_pe/p
872 IF (p*q == para_env%num_pe)
THEN
877 ALLOCATE (layouts(2, itmp))
879 DO p = 2, para_env%num_pe
880 q = para_env%num_pe/p
881 IF (p*q == para_env%num_pe)
THEN
883 layouts(:, itmp) = [p, q]
887 CALL section_vals_val_get(pw_transfer_section,
"PW_GRID_LAYOUT", i_rep_section=i_rep, i_vals=i_vals)
888 ALLOCATE (layouts(2, 1))
889 layouts(:, 1) = i_vals
892 DO i_layout = 1,
SIZE(layouts, 2)
894 distribution_layout = layouts(:, i_layout)
902 is_fullspace = .false.
905 is_fullspace = .true.
908 is_fullspace = .false.
916 ELSE IF (is_fullspace)
THEN
927 CALL pw_grid_create(grid, para_env, box%hmat, grid_span=grid_span, odd=odd, spherical=spherical, &
928 blocked=blocked_id, npts=np, fft_usage=.true., &
929 rs_dims=distribution_layout, iounit=iw)
947 ca%array(ig) = exp(-gsq)
950 flops = product(no)*30.0_dp*log(real(maxval(no), kind=
dp))
963 perf = real(n_loop, kind=
dp)*2.0_dp*flops*1.e-6_dp/t
968 em = maxval(abs(ca%array(:) - cc%array(:)))
969 CALL para_env%max(em)
970 et = sum(abs(ca%array(:) - cc%array(:)))
971 CALL para_env%sum(et)
972 t_min = minval(t_end - t_start)
973 t_max = maxval(t_end - t_start)
975 IF (para_env%is_source())
THEN
977 WRITE (iw,
'(A,T67,E14.6)')
" Parallel FFT Tests: Maximal Error ", em
978 WRITE (iw,
'(A,T67,E14.6)')
" Parallel FFT Tests: Total Error ", et
979 WRITE (iw,
'(A,T67,F14.0)') &
980 " Parallel FFT Tests: Performance [Mflops] ", perf
981 WRITE (iw,
'(A,T67,F14.6)')
" Best time : ", t_min
982 WRITE (iw,
'(A,T67,F14.6)')
" Worst time: ", t_max
987 IF (em > toler .OR. et > toler)
THEN
988 cpwarn(
"The FFT results are not accurate ... starting debug pw_transfer")
1002 DEALLOCATE (layouts)
1003 DEALLOCATE (t_start)
1010 CALL finalize_fft(para_env, wisdom_file=globenv%fftw_wisdom_file_name, &
1011 export_wisdom=globenv%fftw_wisdom_file_explicit)
1013 END SUBROUTINE pw_fft_test
1024 SUBROUTINE eigensolver_test(para_env, iw, eigensolver_section)
1030 INTEGER :: diag_method, i, i_loop, i_rep, &
1031 init_method, j, n, n_loop, n_rep, &
1033 REAL(kind=
dp) :: t1, t2
1034 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
1035 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: buffer
1038 TYPE(
cp_fm_type) :: eigenvectors, matrix, work
1042 WRITE (unit=iw, fmt=
"(/,/,T2,A,/)")
"EIGENSOLVER TEST"
1057 CALL section_vals_val_get(eigensolver_section,
"DIAG_METHOD", i_rep_section=i_rep, i_val=diag_method)
1058 CALL section_vals_val_get(eigensolver_section,
"INIT_METHOD", i_rep_section=i_rep, i_val=init_method)
1062 IF (neig < 0) neig = n
1067 WRITE (iw, *)
"Matrix size", n
1068 WRITE (iw, *)
"Number of eigenvalues", neig
1069 WRITE (iw, *)
"Timing loops", n_loop
1070 SELECT CASE (diag_method)
1072 WRITE (iw, *)
"Diag using syevd"
1074 WRITE (iw, *)
"Diag using syevx"
1079 SELECT CASE (init_method)
1081 WRITE (iw, *)
"using random matrix"
1083 WRITE (iw, *)
"reading from file"
1092 para_env=para_env, &
1093 context=blacs_env, &
1099 matrix_struct=fmstruct, &
1104 matrix_struct=fmstruct, &
1105 name=
"EIGENVECTORS")
1109 matrix_struct=fmstruct, &
1113 ALLOCATE (eigenvalues(n))
1114 eigenvalues = 0.0_dp
1115 ALLOCATE (buffer(1, n))
1118 IF (para_env%is_source())
THEN
1119 SELECT CASE (init_method)
1122 name=
"rng_stream", &
1124 extended_precision=.true.)
1127 file_action=
"READ", &
1128 file_form=
"FORMATTED", &
1129 file_status=
"OLD", &
1130 unit_number=unit_number)
1135 IF (para_env%is_source())
THEN
1136 SELECT CASE (init_method)
1139 buffer(1, j) = rng_stream%next() - 0.5_dp
1144 READ (unit=unit_number, fmt=*) buffer(1, 1:n)
1147 CALL para_env%bcast(buffer)
1148 SELECT CASE (init_method)
1151 new_values=buffer, &
1160 new_values=buffer, &
1170 new_values=buffer, &
1183 IF (para_env%is_source())
THEN
1184 SELECT CASE (init_method)
1190 DO i_loop = 1, n_loop
1191 eigenvalues = 0.0_dp
1198 SELECT CASE (diag_method)
1201 eigenvectors=eigenvectors, &
1202 eigenvalues=eigenvalues)
1205 eigenvectors=eigenvectors, &
1206 eigenvalues=eigenvalues, &
1211 IF (iw > 0)
WRITE (iw, *)
"Timing for loop ", i_loop,
" : ", t2 - t1
1215 WRITE (iw, *)
"Eigenvalues: "
1216 WRITE (unit=iw, fmt=
"(T3,5F14.6)") eigenvalues(1:neig)
1217 WRITE (unit=iw, fmt=
"(T3,A4,F16.6)")
"Sum:", sum(eigenvalues(1:neig))
1222 DEALLOCATE (eigenvalues)
1232 END SUBROUTINE eigensolver_test
1240 SUBROUTINE cp_fm_gemm_test(para_env, iw, cp_fm_gemm_test_section)
1246 CHARACTER(LEN=1) :: transa, transb
1247 INTEGER :: i_loop, i_rep, k, m, n, n_loop, n_rep, ncol_block, ncol_block_actual, &
1248 ncol_global, np, nrow_block, nrow_block_actual, nrow_global
1249 INTEGER,
DIMENSION(:),
POINTER :: grid_2d
1250 LOGICAL :: force_blocksize, row_major, transa_p, &
1252 REAL(kind=
dp) :: t1, t2, t3, t4
1255 TYPE(
cp_fm_type) :: matrix_a, matrix_b, matrix_c
1261 CALL section_vals_val_get(cp_fm_gemm_test_section,
"N_loop", i_rep_section=i_rep, i_val=n_loop)
1267 CALL section_vals_val_get(cp_fm_gemm_test_section,
"transa", i_rep_section=i_rep, l_val=transa_p)
1268 CALL section_vals_val_get(cp_fm_gemm_test_section,
"transb", i_rep_section=i_rep, l_val=transb_p)
1269 CALL section_vals_val_get(cp_fm_gemm_test_section,
"nrow_block", i_rep_section=i_rep, i_val=nrow_block)
1270 CALL section_vals_val_get(cp_fm_gemm_test_section,
"ncol_block", i_rep_section=i_rep, i_val=ncol_block)
1271 CALL section_vals_val_get(cp_fm_gemm_test_section,
"ROW_MAJOR", i_rep_section=i_rep, l_val=row_major)
1272 CALL section_vals_val_get(cp_fm_gemm_test_section,
"GRID_2D", i_rep_section=i_rep, i_vals=grid_2d)
1273 CALL section_vals_val_get(cp_fm_gemm_test_section,
"FORCE_BLOCKSIZE", i_rep_section=i_rep, l_val=force_blocksize)
1276 IF (transa_p) transa =
"T"
1277 IF (transb_p) transb =
"T"
1280 WRITE (iw,
'(T2,A)')
"----------- TESTING PARALLEL MATRIX MULTIPLY -------------"
1281 WRITE (iw,
'(T2,A)',
advance=
"NO")
"C = "
1283 WRITE (iw,
'(A)',
advance=
"NO")
"TRANSPOSE(A) x"
1285 WRITE (iw,
'(A)',
advance=
"NO")
"A x "
1288 WRITE (iw,
'(A)')
"TRANSPOSE(B) "
1290 WRITE (iw,
'(A)')
"B "
1292 WRITE (iw,
'(T2,A,T50,I5,A,I5)')
'requested block size', nrow_block,
' by ', ncol_block
1293 WRITE (iw,
'(T2,A,T50,I5)')
'number of repetitions of cp_fm_gemm ', n_loop
1294 WRITE (iw,
'(T2,A,T50,L5)')
'Row Major', row_major
1295 WRITE (iw,
'(T2,A,T50,2I7)')
'GRID_2D ', grid_2d
1296 WRITE (iw,
'(T2,A,T50,L5)')
'Force blocksize ', force_blocksize
1300 WRITE (iw,
'(T2,A,T50,I5)')
'PILAENV blocksize', np
1306 para_env=para_env, &
1307 row_major=row_major, &
1310 NULLIFY (fmstruct_a)
1312 nrow_global = m; ncol_global = k
1314 nrow_global = k; ncol_global = m
1317 nrow_global=nrow_global, ncol_global=ncol_global, &
1318 nrow_block=nrow_block, ncol_block=ncol_block, force_block=force_blocksize)
1319 CALL cp_fm_struct_get(fmstruct_a, nrow_block=nrow_block_actual, ncol_block=ncol_block_actual)
1320 IF (iw > 0)
WRITE (iw,
'(T2,A,I9,A,I9,A,I5,A,I5)')
'matrix A ', nrow_global,
" by ", ncol_global, &
1321 ' using blocks of ', nrow_block_actual,
' by ', ncol_block_actual
1324 nrow_global = n; ncol_global = m
1326 nrow_global = m; ncol_global = n
1328 NULLIFY (fmstruct_b)
1330 nrow_global=nrow_global, ncol_global=ncol_global, &
1331 nrow_block=nrow_block, ncol_block=ncol_block, force_block=force_blocksize)
1332 CALL cp_fm_struct_get(fmstruct_b, nrow_block=nrow_block_actual, ncol_block=ncol_block_actual)
1333 IF (iw > 0)
WRITE (iw,
'(T2,A,I9,A,I9,A,I5,A,I5)')
'matrix B ', nrow_global,
" by ", ncol_global, &
1334 ' using blocks of ', nrow_block_actual,
' by ', ncol_block_actual
1336 NULLIFY (fmstruct_c)
1340 nrow_global=nrow_global, ncol_global=ncol_global, &
1341 nrow_block=nrow_block, ncol_block=ncol_block, force_block=force_blocksize)
1342 CALL cp_fm_struct_get(fmstruct_c, nrow_block=nrow_block_actual, ncol_block=ncol_block_actual)
1343 IF (iw > 0)
WRITE (iw,
'(T2,A,I9,A,I9,A,I5,A,I5)')
'matrix C ', nrow_global,
" by ", ncol_global, &
1344 ' using blocks of ', nrow_block_actual,
' by ', ncol_block_actual
1346 CALL cp_fm_create(matrix=matrix_a, matrix_struct=fmstruct_a, name=
"MATRIX A")
1347 CALL cp_fm_create(matrix=matrix_b, matrix_struct=fmstruct_b, name=
"MATRIX B")
1348 CALL cp_fm_create(matrix=matrix_c, matrix_struct=fmstruct_c, name=
"MATRIX C")
1350 CALL random_number(matrix_a%local_data)
1351 CALL random_number(matrix_b%local_data)
1352 CALL random_number(matrix_c%local_data)
1357 DO i_loop = 1, n_loop
1359 CALL parallel_gemm(transa, transb, k, n, m, 1.0_dp, matrix_a, matrix_b, 0.0_dp, matrix_c)
1362 WRITE (iw,
'(T2,A,T50,F12.6)')
"cp_fm_gemm timing: ", (t4 - t3)
1369 WRITE (iw,
'(T2,A,T50,F12.6)')
"average cp_fm_gemm timing: ", (t2 - t1)/n_loop
1371 WRITE (iw,
'(T2,A,T50,F12.6)')
"cp_fm_gemm Gflops per MPI task: ", &
1372 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
1386 END SUBROUTINE cp_fm_gemm_test
1394 SUBROUTINE cp_dbcsr_tests(para_env, iw, input_section)
1400 CHARACTER,
DIMENSION(3) :: types
1401 INTEGER :: data_type, i_rep, k, m, n, n_loop, &
1403 INTEGER,
DIMENSION(:),
POINTER :: bs_k, bs_m, bs_n, nproc
1404 LOGICAL :: always_checksum, retain_sparsity, &
1406 REAL(kind=
dp) :: alpha, beta, filter_eps, s_a, s_b, s_c
1410 NULLIFY (bs_m, bs_n, bs_k)
1412 CALL dbcsr_reset_randmat_seed()
1431 CALL section_vals_val_get(input_section,
"keepsparse", i_rep_section=i_rep, l_val=retain_sparsity)
1446 i_rep_section=i_rep, r_val=filter_eps)
1447 CALL section_vals_val_get(input_section,
"ALWAYS_CHECKSUM", i_rep_section=i_rep, l_val=always_checksum)
1449 CALL dbcsr_run_tests(para_env%get_handle(), iw, nproc, &
1451 [transa_p, transb_p], &
1455 data_type=data_type, &
1456 test_type=test_type, &
1457 n_loops=n_loop, eps=filter_eps, retain_sparsity=retain_sparsity, &
1458 always_checksum=always_checksum)
1460 END SUBROUTINE cp_dbcsr_tests
1468 SUBROUTINE run_dbm_tests(para_env, iw, input_section)
1474 INTEGER :: i_rep, k, m, n, n_loop, n_rep
1475 INTEGER,
DIMENSION(:),
POINTER :: bs_k, bs_m, bs_n
1476 LOGICAL :: always_checksum, retain_sparsity, &
1478 REAL(kind=
dp) :: alpha, beta, filter_eps, s_a, s_b, s_c
1482 NULLIFY (bs_m, bs_n, bs_k)
1484 CALL dbcsr_reset_randmat_seed()
1495 CALL section_vals_val_get(input_section,
"keepsparse", i_rep_section=i_rep, l_val=retain_sparsity)
1502 CALL section_vals_val_get(input_section,
"ALWAYS_CHECKSUM", i_rep_section=i_rep, l_val=always_checksum)
1506 matrix_sizes=[m, n, k], &
1507 trs=[transa_p, transb_p], &
1511 sparsities=[s_a, s_b, s_c], &
1516 retain_sparsity=retain_sparsity, &
1517 always_checksum=always_checksum)
1519 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 the Gaunt coefficients.
subroutine, public gaunt_coefficient_test()
Compare the Gaunt coefficients against a Lebedev quadrature of the triple product of spherical harmon...
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.
subroutine, public open_file(file_name, unit_number, file_status, file_form, file_action, file_position, file_pad, file_access, debug)
Opens a file and returns its logical unit number.
subroutine, public close_file(unit_number, file_status)
Closes an open file given by its logical unit number.
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...
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.
Definition and construction of time/frequency grids for correlation methods.
subroutine, public test_least_square_ft(nr, iw)
test the singular value decomposition for the computation of integration weights for the Fourier tran...
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