1subroutine global_product_&
3&(obj, z, n, mpi_comm_rows, mpi_comm_cols, npc_0, npc_n, success)
9#ifdef WITH_OPENMP_TRADITIONAL
14 integer(kind=ik),
intent(in) :: mpi_comm_cols, mpi_comm_rows
15 integer(kind=ik),
intent(in) :: npc_0, npc_n
17 integer(kind=MPI_KIND) :: mpierr,my_pcolMPI, np_colsMPI, np_rowsMPI
19 integer(kind=ik) :: n, my_pcol, np_cols, np_rows
20 real(kind=real_datatype) :: z(n)
22 real(kind=real_datatype) :: tmp(n)
23 integer(kind=ik) :: np
24 integer(kind=MPI_KIND) :: allreduce_request1, allreduce_request2
25 logical :: useNonBlockingCollectivesCols
26 logical :: useNonBlockingCollectivesRows
27 integer(kind=c_int) :: non_blocking_collectives_rows, error, &
28 non_blocking_collectives_cols
33 call obj%get(
"nbc_row_global_product", non_blocking_collectives_rows, error)
34 if (error .ne. elpa_ok)
then
35 write(error_unit,*)
"Problem setting option for non blocking collectives for rows in global_product. Aborting..."
40 call obj%get(
"nbc_col_global_product", non_blocking_collectives_cols, error)
41 if (error .ne. elpa_ok)
then
42 write(error_unit,*)
"Problem setting option for non blocking collectives for cols in global_product. Aborting..."
47 if (non_blocking_collectives_rows .eq. 1)
then
48 usenonblockingcollectivesrows = .true.
50 usenonblockingcollectivesrows = .false.
53 if (non_blocking_collectives_cols .eq. 1)
then
54 usenonblockingcollectivescols = .true.
56 usenonblockingcollectivescols = .false.
60 call obj%timer%start(
"mpi_communication")
61 call mpi_comm_size(int(mpi_comm_rows,kind=mpi_kind) ,np_rowsmpi, mpierr)
62 np_rows = int(np_rowsmpi,kind=c_int)
64 call mpi_comm_rank(int(mpi_comm_cols,kind=mpi_kind) ,my_pcolmpi, mpierr)
65 my_pcol = int(my_pcolmpi,kind=c_int)
66 call mpi_comm_size(int(mpi_comm_cols,kind=mpi_kind) ,np_colsmpi, mpierr)
67 np_cols = int(np_colsmpi,kind=c_int)
69 call obj%timer%stop(
"mpi_communication")
72 if (npc_n==1 .and. np_rows==1)
return
77 if (usenonblockingcollectivesrows)
then
78 call obj%timer%start(
"mpi_nbc_communication")
79 call mpi_iallreduce(z, tmp, int(n,kind=mpi_kind), mpi_real_precision, mpi_prod, int(mpi_comm_rows,kind=mpi_kind), &
80 allreduce_request1, mpierr)
81 call mpi_wait(allreduce_request1, mpi_status_ignore, mpierr)
82 call obj%timer%stop(
"mpi_nbc_communication")
84 call obj%timer%start(
"mpi_communication")
85 call mpi_allreduce(z, tmp, int(n,kind=mpi_kind), mpi_real_precision, mpi_prod, int(mpi_comm_rows,kind=mpi_kind), &
87 call obj%timer%stop(
"mpi_communication")
100 if (npc_n==np_cols)
then
102 if (usenonblockingcollectivescols)
then
103 call obj%timer%start(
"mpi_nbc_communication")
104 call mpi_iallreduce(tmp, z, int(n,kind=mpi_kind), mpi_real_precision, mpi_prod, int(mpi_comm_cols,kind=mpi_kind), &
105 allreduce_request2, mpierr)
106 call mpi_wait(allreduce_request2, mpi_status_ignore, mpierr)
107 call obj%timer%stop(
"mpi_nbc_communication")
109 call obj%timer%start(
"mpi_communication")
110 call mpi_allreduce(tmp, z, int(n,kind=mpi_kind), mpi_real_precision, mpi_prod, int(mpi_comm_cols,kind=mpi_kind), &
112 call obj%timer%stop(
"mpi_communication")
123 if (my_pcol == npc_0)
then
125 do np = npc_0+1, npc_0+npc_n-1
127 call obj%timer%start(
"mpi_communication")
128 call mpi_recv(tmp, int(n,kind=mpi_kind), mpi_real_precision, int(np,kind=mpi_kind), 1117_mpi_kind, &
129 int(mpi_comm_cols,kind=mpi_kind), mpi_status_ignore, mpierr)
130 call obj%timer%stop(
"mpi_communication")
134 z(1:n) = z(1:n)*tmp(1:n)
136 do np = npc_0+1, npc_0+npc_n-1
138 call obj%timer%start(
"mpi_communication")
139 call mpi_send(z, int(n,kind=mpi_kind), mpi_real_precision, int(np,kind=mpi_kind), 1118_mpi_kind, &
140 int(mpi_comm_cols,kind=mpi_kind), mpierr)
141 call obj%timer%stop(
"mpi_communication")
147 call obj%timer%start(
"mpi_communication")
148 call mpi_send(tmp, int(n,kind=mpi_kind), mpi_real_precision, int(npc_0,kind=mpi_kind), 1117_mpi_kind, &
149 int(mpi_comm_cols,kind=mpi_kind), mpierr)
150 call mpi_recv(z, int(n,kind=mpi_kind), mpi_real_precision, int(npc_0,kind=mpi_kind), 1118_mpi_kind, &
151 int(mpi_comm_cols,kind=mpi_kind), mpi_status_ignore, mpierr)
152 call obj%timer%stop(
"mpi_communication")