It is what I suspected. You can see that the envio array is smaller than
it should. It was created as an array of doubles with the size t_max, when
it should have been created as an array of double with the size t_max *
nprocs. If you look how the recibe array is created you can notice that
it's size if t_max * nprocs (allocate(recibe(t_max*nproc))). As on the
all-to-all operation everybody send and receive exactly the same amount of
data, both the send and receive array should have the same size.
I propose the following fix:
- instead of
double precision,dimension(t_max)::envio
double precision,dimension(:),allocatable::recibe
do a
double precision,dimension(:),allocatable::envio
double precision,dimension(:),allocatable::recibe
- then, when the recibe array is created add the allocation for envio too
allocate(recibe(t_max*nproc))
allocate(envio(t_max*nproc))
Now your program should work just fine.
george.
On Thu, 20 Jul 2006, Frank Gruellich wrote:
Hi,
George Bosilca wrote:
On the all-to-all collective the send and receive buffers has to be able
to contain all the information you try to send. On this particular case,
as you initialize the envio variable to a double I suppose it is defined
as a double. If it's the case then the error is that the send operation
will send more data than the amount available on the envio variable.
If you want to be able to do correctly the all-to-all in your example,
make sure the envio variable has a size at least equal to:
tam * sizeof(byte) * NPROCS, where NPROCS is the number of procs available
on the mpi_comm_world communicator.
I'm unfortunately not that Fortran guy. Maybe the best would be to
submit the whole function at the beginning, it's neither secret nor big:
module alltoall
use globales
implicit none
contains
subroutine All_to_all
integer,parameter :: npuntos = 24
integer,parameter :: t_max = 2**(npuntos-1)
integer siguiente,anterior,tam,rep,p_1,p_2,i,j,ndatos,rep2,o,k
double precision time1,time2,time,ov,tmin,tavg
double precision,dimension(t_max)::envio
double precision,dimension(:),allocatable::recibe
double precision,dimension(npuntos)::m_tmin,m_tavg
double precision,dimension(npuntos)::tams
rep2 = 10
tag1 = 1
tag2 = 2
rep = 3
allocate(recibe(t_max*nproc))
siguiente = my_id + 1
if (my_id == nproc -1) siguiente = 0
anterior = my_id - 1
if (my_id == 0) anterior = nproc- 1
do i = 1,npuntos
print *,'puntos',i
tam = 2**(i-1)
tmin = 1e5
tavg = 0.0d0
do j = 1,rep
envio = 8.0d0*j
call mpi_barrier(mpi_comm_world,ierr)
time1 = mpi_wtime()
do k = 1,rep2
call
mpi_alltoall(envio,tam,mpi_byte,recibe,tam,mpi_byte,mpi_comm_world,ierr)
end do
call mpi_barrier(mpi_comm_world,ierr)
time2 = mpi_wtime()
time = (time2 - time1)/(rep2)
if (time < tmin) tmin = time
tavg = tavg + time
end do
m_tmin(i) = tmin
m_tavg(i) = tavg/rep
end do
call mpi_barrier(mpi_comm_world,ierr)
print *,"acaba"
if (my_id == 0) then
open (1,file='Alltoall.dat')
write (1,*) "#Prueba All to all entre todos los procesadores(",nproc,")"
write (1,*) "#Precision del reloj:",mpi_wtick()*1.0d6,"(muS)"
do i =1,npuntos
write(1,900) 2*nproc*2**(i-1),m_tmin(i),m_tavg(i)!,ov
end do
close(1)
end if
900 FORMAT(I10,F14.8,F14.8)
800 FORMAT(I10,F14.8,F14.8)
end subroutine
end module
Can you read this? (Sorry, I can't.) But the size_of envio seems to be
2**32 = 8388608 doubles, isn't it? I don't understand, why it should
depend on the number of MPI nodes, as you said.
Thanks for your help. Kind regards,
"We must accept finite disappointment, but we must never lose infinite
hope."
Martin Luther King