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, -- Frank Gruellich HPC-Techniker Tel.: +49 3722 528 42 Fax: +49 3722 528 15 E-Mail: frank.gruell...@megware.com MEGWARE Computer GmbH Vertrieb und Service Nordstrasse 19 09247 Chemnitz/Roehrsdorf Germany http://www.megware.com/