<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7036.0">
<TITLE>RE: [mpich-discuss] Problem sometimes when running on winxp on &gt;=2 processes and MPE_IBCAST</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>&nbsp;Hi,<BR>
&nbsp; I did not see the exact example source code in RS 6000 MPI programming guide (The closest example was a template code which slightly differs from the one that you sent us).<BR>
&nbsp; After removing the MPI_Barrier() from for loop (keeping the MPI_Bcast() still in for loop) I do not get any errors when running your program for 0&lt; n &lt;=4 procs. Send us your code and the logic of the code for further analysis.<BR>
&nbsp; Meanwhile the block distribution code (para_range -- to find the range for block distribution) that you use in your source code is not valid if you have less work to do than the number of procs (i.e., no need for distribution --- You are using the array, jjsta, indices 3 to 6 in your job = which is 4 elements to work with =&gt; the distribution range finder code will fail if you run your code with &gt; 4 procs).<BR>
<BR>
Regards,<BR>
Jayesh<BR>
-----Original Message-----<BR>
From: owner-mpich-discuss@mcs.anl.gov [<A HREF="mailto:owner-mpich-discuss@mcs.anl.gov">mailto:owner-mpich-discuss@mcs.anl.gov</A>] On Behalf Of Ben Tay<BR>
Sent: Wednesday, May 07, 2008 7:45 PM<BR>
To: mpich-discuss@mcs.anl.gov<BR>
Subject: Re: [mpich-discuss] Problem sometimes when running on winxp on &gt;=2 processes and MPE_IBCAST<BR>
<BR>
Hi,<BR>
<BR>
I've removed the MPI_Barrier. The bound checking is also enabled.<BR>
However the same error still happens, randomly when processes =2 and always when processes =4. I did not encounter this error when I run it in my school's servers.<BR>
<BR>
I also just compile using MPICH. Interestingly, there is no problem at all. So I guess this problem is due to MPICH2.<BR>
<BR>
Thank you very much.<BR>
<BR>
Jayesh Krishna wrote:<BR>
&gt;<BR>
&gt;&nbsp; Hi,<BR>
&gt;&nbsp;&nbsp; Please find my observations below,<BR>
&gt;<BR>
&gt; 1) As Anthony pointed out you don't have to call MPI_Barrier() in a<BR>
&gt; loop for all processes (see usage of MPI collectives).<BR>
&gt; 2) When running the program with more than 4 procs, some array<BR>
&gt; accesses are out of bounds (Try re-compiling your program with Run<BR>
&gt; time checking for &quot;Array and String bounds&quot; --&gt; If you are using VS<BR>
&gt; check out &quot;Configuration Properties&quot; --&gt; Fortran --&gt; Runtime --&gt; * for<BR>
&gt; setting the runtime checking)<BR>
&gt;<BR>
&gt; Regards,<BR>
&gt; Jayesh<BR>
&gt;<BR>
&gt; -----Original Message-----<BR>
&gt; From: owner-mpich-discuss@mcs.anl.gov<BR>
&gt; [<A HREF="mailto:owner-mpich-discuss@mcs.anl.gov">mailto:owner-mpich-discuss@mcs.anl.gov</A>] On Behalf Of Anthony Chan<BR>
&gt; Sent: Wednesday, May 07, 2008 11:13 AM<BR>
&gt; To: mpich-discuss@mcs.anl.gov<BR>
&gt; Subject: Re: [mpich-discuss] Problem sometimes when running on winxp<BR>
&gt; on &gt;=2 processes and MPE_IBCAST<BR>
&gt;<BR>
&gt;<BR>
&gt; May not be related to the error that you saw.&nbsp; You shouldn't call<BR>
&gt; MPI_Barrier and MPI_Bcast with a do loop over processes.<BR>
&gt;<BR>
&gt; A.Chan<BR>
&gt; ----- &quot;Ben Tay&quot; &lt;zonexo@gmail.com&gt; wrote:<BR>
&gt;<BR>
&gt; &gt; Hi Rajeev,<BR>
&gt; &gt;<BR>
&gt; &gt; I've attached the code. Thank you very much.<BR>
&gt; &gt;<BR>
&gt; &gt; Regards.<BR>
&gt; &gt;<BR>
&gt; &gt; Rajeev Thakur wrote:<BR>
&gt; &gt; &gt; Can you send us the code?<BR>
&gt; &gt; &gt;<BR>
&gt; &gt; &gt; MPE_IBCAST is not a part of the MPI standard. There is no<BR>
&gt; &gt; &gt; equivalent<BR>
&gt; &gt; for it<BR>
&gt; &gt; &gt; in MPICH2. You could spawn a thread that calls MPI_Bcast though<BR>
&gt; &gt; (after<BR>
&gt; &gt; &gt; following all the caveats of MPI and threads as defined in the<BR>
&gt; &gt; standard).<BR>
&gt; &gt; &gt;<BR>
&gt; &gt; &gt; Rajeev<BR>
&gt; &gt; &gt;<BR>
&gt; &gt; &gt;&nbsp;<BR>
&gt; &gt; &gt;&gt; -----Original Message-----<BR>
&gt; &gt; &gt;&gt; From: owner-mpich-discuss@mcs.anl.gov<BR>
&gt; &gt; &gt;&gt; [<A HREF="mailto:owner-mpich-discuss@mcs.anl.gov">mailto:owner-mpich-discuss@mcs.anl.gov</A>] On Behalf Of Ben Tay<BR>
&gt; &gt; &gt;&gt; Sent: Wednesday, May 07, 2008 10:25 AM<BR>
&gt; &gt; &gt;&gt; To: mpich-discuss@mcs.anl.gov<BR>
&gt; &gt; &gt;&gt; Subject: [mpich-discuss] Problem sometimes when running on winxp<BR>
&gt; &gt; &gt;&gt; on<BR>
&gt; &gt; &gt;&gt; &gt;=2 processes and MPE_IBCAST<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt; Hi,<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt; I tried to run a mpi code which is copied from an example by the<BR>
&gt; &gt; &gt;&gt; RS 6000 book. It is supposed to broadcast and synchronize all values.<BR>
&gt; &gt; &gt;&gt; When I ran it on my school's linux servers, there is no problem.<BR>
&gt; &gt; &gt;&gt; However, if I run it on my own winxp, on &gt;=2 processes, sometimes<BR>
&gt; &gt; &gt;&gt; it work, other times I get the error:<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt; [01:3216].....ERROR:result command received but the wait_list is<BR>
&gt; &gt; &gt;&gt; empty.<BR>
&gt; &gt; &gt;&gt; [01:3216]...ERROR:unable to handle the command: &quot;cmd=result<BR>
&gt; &gt; &gt;&gt; src=1 dest=1<BR>
&gt; &gt; &gt;&gt; tag=7 c<BR>
&gt; &gt; &gt;&gt; md_tag=3 cmd_orig=dbget ctx_key=1 value=&quot;port=1518<BR>
&gt; &gt; &gt;&gt; description=gotchama-16e5ed i<BR>
&gt; &gt; &gt;&gt; fname=192.168.1.105 &quot; result=DBS_SUCCESS &quot;<BR>
&gt; &gt; &gt;&gt; [01:3216].ERROR:error closing the unknown context socket:<BR>
&gt; &gt; &gt;&gt; generic socket failure , error stack:<BR>
&gt; &gt; &gt;&gt; MPIDU_Sock_wait(2603): The I/O operation has been aborted because<BR>
&gt; &gt; &gt;&gt; of either a th read exit or an application request.<BR>
&gt; &gt; &gt;&gt; (errno 995) [01:3216]..ERROR:sock_op_close returned while unknown<BR>
&gt; &gt; &gt;&gt; context is in<BR>
&gt; &gt; &gt;&gt; state: SMPD_<BR>
&gt; &gt; &gt;&gt; IDLE<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt; Or<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt; [01:3308].....ERROR:result command received but the wait_list is<BR>
&gt; &gt; &gt;&gt; empty.<BR>
&gt; &gt; &gt;&gt; [01:3308]...ERROR:unable to handle the command: &quot;cmd=result<BR>
&gt; &gt; &gt;&gt; src=1 dest=1<BR>
&gt; &gt; &gt;&gt; tag=15<BR>
&gt; &gt; &gt;&gt; cmd_tag=5 cmd_orig=barrier ctx_key=0 result=DBS_SUCCESS &quot;<BR>
&gt; &gt; &gt;&gt; [01:3308]..ERROR:sock_op_close returned while unknown context is<BR>
&gt; &gt; in<BR>
&gt; &gt; &gt;&gt; state: SMPD_<BR>
&gt; &gt; &gt;&gt; IDLE<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt; There is no problem if I run on 1 process. If it's &gt;=4, then the<BR>
&gt; &gt; &gt;&gt; error happens all the time. Moreover, it's a rather simple code<BR>
&gt; &gt; &gt;&gt; and so there shouldn't be anything wrong with it.<BR>
&gt; &gt; &gt;&gt; Why is this so?<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt; Btw, the RS 6000 book also mention a routine called MPE_IBCAST,<BR>
&gt; &gt; &gt;&gt; which is a non-blocking version of MPI_BCAST. Is there a similar<BR>
&gt; &gt; &gt;&gt; routine in MPICH2?<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt; Thank you very much<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt; Regards.<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt;<BR>
&gt; &gt; &gt;&gt;&nbsp;&nbsp;&nbsp;<BR>
&gt; &gt; &gt;<BR>
&gt; &gt; &gt;<BR>
&gt; &gt; &gt;&nbsp;<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt; program mpi_test2<BR>
&gt; &gt;<BR>
&gt; &gt; !&nbsp;&nbsp;&nbsp;&nbsp; test to show updating for i,j double loop (partial continuous<BR>
&gt; data)<BR>
&gt; &gt; for specific req data only<BR>
&gt; &gt;<BR>
&gt; &gt; !&nbsp;&nbsp;&nbsp;&nbsp; ie update u(2:6,2:6) values instead of all u values, also for<BR>
&gt; struct<BR>
&gt; &gt; data<BR>
&gt; &gt;<BR>
&gt; &gt; !&nbsp;&nbsp;&nbsp;&nbsp; FVM use<BR>
&gt; &gt;<BR>
&gt; &gt; implicit none<BR>
&gt; &gt;<BR>
&gt; &gt; include &quot;mpif.h&quot;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&gt; &gt;<BR>
&gt; &gt; integer, parameter :: size_x=8,size_y=8<BR>
&gt; &gt;<BR>
&gt; &gt; integer :: i,j,k,ierr,rank,nprocs,u(size_x,size_y)<BR>
&gt; &gt;<BR>
&gt; &gt; integer :: jsta,jend,jsta2,jend1,inext,iprev,isend1,irecv1,isend2<BR>
&gt; &gt;<BR>
&gt; &gt; integer :: irecv2,is,ie,js,je<BR>
&gt; &gt;<BR>
&gt; &gt; integer, allocatable :: jjsta(:), jjlen(:),jjreq(:),u_tmp(:,:)<BR>
&gt; &gt;<BR>
&gt; &gt; INTEGER istatus(MPI_STATUS_SIZE)<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt; call MPI_Init(ierr)<BR>
&gt; &gt;<BR>
&gt; &gt; call MPI_Comm_rank(MPI_COMM_WORLD,rank,ierr)<BR>
&gt; &gt;&nbsp;<BR>
&gt; &gt; call MPI_Comm_size(MPI_COMM_WORLD,nprocs,ierr)<BR>
&gt; &gt;<BR>
&gt; &gt; allocate (jjsta(0:nprocs-1),jjlen(0:nprocs-1),jjreq(0:nprocs-1))<BR>
&gt; &gt;<BR>
&gt; &gt; is=3; ie=6;&nbsp;&nbsp; js=3;&nbsp;&nbsp; je=6<BR>
&gt; &gt;<BR>
&gt; &gt; allocate (u_tmp(is:ie,js:je))<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt; do k = 0, nprocs - 1<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call para_range(js,je, nprocs, k, jsta, jend)<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jjsta(k) = jsta<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jjlen(k) = (ie-is+1) * (jend - jsta + 1)<BR>
&gt; &gt;<BR>
&gt; &gt; end do<BR>
&gt; &gt;<BR>
&gt; &gt; call para_range(js, je, nprocs, rank , jsta, jend)<BR>
&gt; &gt;<BR>
&gt; &gt; do j=jsta,jend<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do i=is,ie<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u(i,j)=(j-1)*size_x+i<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end do<BR>
&gt; &gt;<BR>
&gt; &gt; end do<BR>
&gt; &gt;<BR>
&gt; &gt; do j=jsta,jend<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do i=is,ie<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u_tmp(i,j)=u(i,j)<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end do<BR>
&gt; &gt;<BR>
&gt; &gt; end do<BR>
&gt; &gt;<BR>
&gt; &gt; do k=0,nprocs-1<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MPI_Barrier(MPI_COMM_WORLD,ierr)<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (k==rank) then<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print *, rank<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write (*,'(8i5)') u<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if<BR>
&gt; &gt;<BR>
&gt; &gt; end do<BR>
&gt; &gt;<BR>
&gt; &gt; do k = 0, nprocs - 1<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MPI_BCAST(u_tmp(is,jjsta(k)), jjlen(k), MPI_Integer,k,<BR>
&gt; &gt; MPI_COMM_WORLD, ierr)<BR>
&gt; &gt;<BR>
&gt; &gt; end do<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt; deallocate (jjsta, jjlen, jjreq)<BR>
&gt; &gt;<BR>
&gt; &gt; u(is:ie,js:je)=u_tmp(is:ie,js:je)<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt; do k=0,nprocs-1<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MPI_Barrier(MPI_COMM_WORLD,ierr)<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (k==rank) then<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print *, rank<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write (*,'(8i5)') u<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&gt; &gt;<BR>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if<BR>
&gt; &gt;<BR>
&gt; &gt; end do<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt;<BR>
&gt; &gt; call MPI_Finalize(ierr)<BR>
&gt; &gt;<BR>
&gt; &gt; contains<BR>
&gt; &gt;<BR>
&gt; &gt; subroutine para_range(n1, n2, nprocs, irank, ista, iend)<BR>
&gt; &gt; !&nbsp;&nbsp;&nbsp;&nbsp; block distribution<BR>
&gt; &gt;<BR>
&gt; &gt; integer n1 !The lowest value of the iteration variable (IN)<BR>
&gt; &gt;<BR>
&gt; &gt; integer n2 !The highest value of the iteration variable (IN)<BR>
&gt; &gt;<BR>
&gt; &gt; integer nprocs !The number of processes (IN)<BR>
&gt; &gt;<BR>
&gt; &gt; integer irank !The rank for which you want to know the range of<BR>
&gt; &gt; iterations(IN)<BR>
&gt; &gt;<BR>
&gt; &gt; integer ista !The lowest value of the iteration variable that<BR>
&gt; &gt; process irank executes (OUT)<BR>
&gt; &gt;<BR>
&gt; &gt; integer iend !The highest value of the iteration variable that<BR>
&gt; &gt; process irank executes (OUT)<BR>
&gt; &gt;<BR>
&gt; &gt; integer iwork1,iwork2<BR>
&gt; &gt;<BR>
&gt; &gt; iwork1 = (n2 - n1 + 1) / nprocs<BR>
&gt; &gt;<BR>
&gt; &gt; iwork2 = mod(n2 - n1 + 1, nprocs)<BR>
&gt; &gt;<BR>
&gt; &gt; ista = irank * iwork1 + n1 + min(irank, iwork2)<BR>
&gt; &gt;<BR>
&gt; &gt; iend = ista + iwork1 - 1<BR>
&gt; &gt;<BR>
&gt; &gt; if (iwork2 &gt; irank) iend = iend + 1<BR>
&gt; &gt;<BR>
&gt; &gt; end subroutine para_range<BR>
&gt; &gt;<BR>
&gt; &gt; end program mpi_test2<BR>
&gt;<BR>
&gt;<BR>
<BR>
<BR>
</FONT>
</P>

</BODY>
</HTML>