Dear all,
I am using openmpi 1.6 on linux. I have a question on MPI_Reduce_scatter.
I try to see how large the data can push through MPI_Reduce_scatter using the
following code.
size = (long) 1024*1024*1024*4;
for(k=1;k<=16;++k) {
bufsize = k*size/16;
for(i=0;i<nproc;++i)
recvCount[i] = bufsize/nproc;
for (i=0;i<bufsize;++i)
sbuf[i] = myid+1;
printf("buffer size: %ld recvCount[0]:%d\n",bufsize,recvCount[0]);
MPI_Reduce_scatter(sbuf,rbuf,recvCount,MPI_LONG,
MPI_SUM,MPI_COMM_WORLD);
for(i=0;i<bufsize/nproc;++i) {
if (rbuf[i] != nproc/2*(nproc+1)) {
printf("failed in %d",myid);
break;
}
}
printf("done\n");
}
ierr = MPI_Finalize();
I used 4 processes and found that if 4 processes are in the same machine. It can
go through size = MAX_INT. However, if 4 processes are in 4 different machines,
it hangs at size= 1073741824.
#0 0x000000337f6d3fc3 in __epoll_wait_nocancel () from /lib64/libc.so.6
#1 0x00002b1e9c45d4eb in epoll_dispatch (base=0xd08e940, arg=0xd08e800,
tv=<value optimized out>) at epoll.c:215
#2 0x00002b1e9c45f98a in opal_event_base_loop (base=0xd08e940,
flags=<value optimized out>) at event.c:838
#3 0x00002b1e9c485809 in opal_progress () at runtime/opal_progress.c:189
#4 0x00002b1e9c3ccf05 in opal_condition_wait (req_ptr=0x7fffc4519fb0,
status=0x0) at ../opal/threads/condition.h:99
#5 ompi_request_wait_completion (req_ptr=0x7fffc4519fb0, status=0x0)
at ../ompi/request/request.h:377
#6 ompi_request_default_wait (req_ptr=0x7fffc4519fb0, status=0x0)
at request/req_wait.c:38
#7 0x00002b1ea0d60dda in ompi_coll_tuned_reduce_scatter_intra_ring (
sbuf=0x7fffc4519fb0, rbuf=0x2b1ea1384010, rcounts=0xd458e30,
dtype=0x601fa0, op=0x601790, comm=0x601390, module=0xd458a10)
at coll_tuned_reduce_scatter.c:584
#8 0x00002b1ea0b4cd8c in mca_coll_sync_reduce_scatter (sbuf=0x2b26a1385010,
rbuf=0x2b1ea1384010, rcounts=<value optimized out>,
dtype=<value optimized out>, op=<value optimized out>, comm=0x601390,
module=0xd458820) at coll_sync_reduce_scatter.c:46
#9 0x00002b1e9c3e7e51 in PMPI_Reduce_scatter (sendbuf=0x2b26a1385010,
recvbuf=0x2b1ea1384010, recvcounts=0xd458e30,
datatype=<value optimized out>, op=0x601790, comm=0x601390)
---Type <return> to continue, or q <return> to quit---
at preduce_scatter.c:129
#10 0x0000000000400ddb in main (argc=1, argv=0x7fffc451a998)
at test_reduce_scatter.c:50
Does openmpi 1.6 uses different mechanisms in reduce_scatter when communicate
within a machine and inter-machines?
What is the limit of size of buffer to use reduce_scatter?
Thanks for your attention.
Regards,
William
|