On Sep 1, 2013, at 23:36 , Huangwei <hz...@cam.ac.uk> wrote: > Hi George, > > Thank you for your reply. Please see below. > best regards, > Huangwei > > > > > On 1 September 2013 22:03, George Bosilca <bosi...@icl.utk.edu> wrote: > > On Aug 31, 2013, at 14:56 , Huangwei <hz...@cam.ac.uk> wrote: > >> Hi All, >> >> I would like to send an array A, which has different dimensions in the >> processors. Then the root receive these As and puts them into another array >> globA. I know MPI_allgatherv can do this. However, there are still some >> implementation issues that are not very clear for me. Thank you very much if >> any of you can give me some suggestions and comments. The piece of code is >> as follows (I am not sure if it is completely correct): >> >> >> !...calculate the total size for the total size of the globA, >> PROCASize(myidf) is the size of array A in each processor. >> >> allocate(PROCASize(numprocs)) >> PROCASize(myidf) = Asize >> call >> mpi_allreduce(PROCSize,PROCSize,numprocs,mpi_integer,mpi_sum,MPI_COMM_WORLD,ierr) >> globAsize = sum(PROCAsize) >> >> !...calculate the RECS and DISP for MPI_allgatherv >> allocate(RECSASize(0:numprocs-1)) >> allocate(DISP(0:numprocs-1)) >> do i=1,numprocs >> RECSASize(i-1) = PROCASize(i) >> enddo >> call mpi_type_extent(mpi_integer, extent, ierr) >> do i=1,numprocs >> DISP(i-1) = 1 + (i-1)*RECSASIze(i-1)*extent >> enddo >> >> !...allocate the size of the array globA >> allocate(globA(globASize*extent)) >> call mpi_allgatherv(A,ASize,MPI_INTEGER,globA, RECSASIze, >> DISP,MPI_INTEGER,MPI_COMM_WORLD,ierr) >> >> My Questions: >> >> 1, How to allocate the globA, i.e. the receive buff's size? Should I use >> globASize*extent or justglobalize? > > > I don't understand what globASize is supposed to be as you do the reduction > on PROCSize and then sum PROCAsize. > > Here I assume globASize is sum of the size of the array A in all the > processors. For example, in proc 1, it is A(3), in proc 2, it is A(5), in > proc 3 it is A(6). so globSize =14. I aim to put these A arrays to globA > which is sized as 14. All the data in A are aimed to be stored in globA > consecutively based on rank number. > > > Anyway, you should always allocate the memory for collective based on the > total number of elements to receive times the extent of each element. In fact > to be even more accurate, if we suppose that you correctly computed the DISP > array, you should allocate globA as DISP(numprocs-1) + RECSASIze. > If all the elements in all A arrays are integer or all are uniformly > double precision, the size of globA should be 14 or 14*extent_integer?
14 * extent(datatype). > > >> >> 2, about the displacements in globA, i.e. DISP(:), it is stand for the order >> of an array? like 1, 2, 3, ...., this corresponds to DISP(i-1) = 1 + >> (i-1)*RECSASIze(i-1)*extent. Or this array's elements are the address at >> which the data from different processors will be stored in globA? > > These are the displacement from the beginning of the array where the data > from a peer is stored. The index in this array is the rank of the peer > process in the communicator. > > Yes, I know. But I mean the meaning of the elements of this array. Still use > that example mentioned above. Is the following specification correct: > DISP(1)=0, DISP(2)=3, DISP(3)=8 ? It depends on the amount of data sent by each process (as the ranges should not overlap). >> >> 3, should the arrays start from 0 to numprocs-1? or start from 1 to >> numprocs? This may be important when they work as arguments in >> mpi_allgatherv subroutine. > > It doesn't matter how you allocate it (0:numprocs-1) or simple (numprocs) the > compiler will do the right this when creating the call using the array. > > George. > > Additional Question is: > > For fortran mpi, can the mpi subroutine send array with 0 size, i.e. in the > example, A is A(0), and ASize =0: As long as the peers expect 0 INTEGERS from this rank the call is correct. George. > > call mpi_allgatherv(A,ASize,MPI_INTEGER,globA, RECSASIze, > DISP,MPI_INTEGER,MPI_COMM_WORLD,ierr) > > Is this valid in mpi calling? This case will appear in my work. > > > Thank you very much for your help! > > Have a nice holiday! > > >> >> These questions may be too simple for MPI professionals, but I do not have >> much experience on this. Thus I am sincerely eager to get some comments and >> suggestions from you. Thank you in advance! >> >> >> regards, >> Huangwei >> >> >> >> >> _______________________________________________ >> users mailing list >> us...@open-mpi.org >> http://www.open-mpi.org/mailman/listinfo.cgi/users > > > _______________________________________________ > users mailing list > us...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/users > > _______________________________________________ > users mailing list > us...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/users