Finally, the port conflict was solved by following c code in asmpub.c around 
line 158.
The rank 0 processor use default port, others use a port specified by os. 


        if(ctype == MPI_TYPE)
        {
          if(rank == 0)
          {
            pub_arg->care_about_port = 1;
          }
          else
          {
            pub_arg->care_about_port = 0;
            pub_arg->port = -1;
          }
        }
        else
            pub_arg->care_about_port = 1;
  


Now AMS works well for parallel environment. 


> 
>   I'll take a look at this but it may take a little time. It could be some of 
> the examples are out of date.
> 
> 
> 
> 
> 
>    Barry
> 
> 
> 
> On Aug 7, 2012, at 5:25 AM, Gong Ding <gdiso at ustc.edu> wrote:
> 
> 
> 
> > Some more bugs about AMS_Comm_publish for parallel situation. even the AMS 
> > mpi example can not work. 
> 
> > 
> 
> > 1) parameter mismatch
> 
> > asmpub.c line 88
> 
> > mysetport = *(int *) va_arg(args, int *);
> 
> > It seems author wants to add another argument as int * to AMS_Comm_publish 
> > function for parallel situation. which not appears in the manual. 
> 
> > I just comment line 88 and line 130-131, 
> 
> > if (mysetport != -1) {
> 
> >             AMS_port = mysetport;
> 
> >     }
> 
> > 
> 
> > 2) extra check of port number
> 
> > asmpub.c line 149
> 
> >        /* Create publisher arguments */
> 
> >        err = AMSP_New_Pub_Arguments(AMS_port, &pub_arg);
> 
> >        CheckErr(err);  
> 
> > 
> 
> > AMSP_New_Pub_Arguments function will check the value of AMS_port. A port 
> > number of -1 or 0 will return a error.
> 
> > 
> 
> > 
> 
> > 3) AMSP_start_publisher_func seems require a port number -1 to force socket 
> > bind function to allocate a new port, which conflict with 
> > AMSP_New_Pub_Arguments check.
> 
> > 
> 
> > nettcppub.c line 66
> 
> > if (*port == -1)
> 
> >     *port = 0;
> 
> > at line 94, a bind function is called.
> 
> > 
> 
> > 
> 
> > I have to set pub_arg->port = -1 as follows. 
> 
> > 
> 
> > if(ctype == MPI_TYPE)
> 
> > {
> 
> >            pub_arg->care_about_port = 0;
> 
> >            pub_arg->port = -1;
> 
> > }
> 
> > else
> 
> >            pub_arg->care_about_port = 1;
> 
> > 
> 
> > 
> 
> > Barry, will you please check it?
> 
> > 
> 
> > 
> 
> >> 
> 
> >> 
> 
> >> On Aug 6, 2012, at 10:17 PM, "Gong Ding" <gdiso at ustc.edu> wrote:
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >>> Thanks, Barry. It is really a wonderful tool.
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >>    Thanks
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >>> PS: The C STRING support of AMS is a bit strange. At very beginning, I 
> >>> can't understand the mechanism of STRING. So I added a CHAR data type to 
> >>> AMS for an alternate of STRING.   
> 
> >> 
> 
> >>> 
> 
> >> 
> 
> >>> Hope the AMS manual have some more detailed description to parallel usage 
> >>> and data types. 
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >>     Maybe you can help write it. We really don't have any one 
> >> maintaining/improving the AMS which is a pity. You can access the 
> >> repository with 
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >>     hg clone http://petsc.cs.iit.edu/petsc/ams-dev
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >>   Barry
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >>> 
> 
> >> 
> 
> >>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> On Aug 6, 2012, at 9:36 AM, "Gong Ding" <gdiso at ustc.edu> wrote:
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> Hi,
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> I am trying to use AMS as data communicator between computational code 
> >>>>> and user monitor. The AMS works well for serial situation, however, I 
> >>>>> don't know how to use it for parallel environment. The manual has 
> >>>>> little information, too.
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>  You need to build AMS with the same MPI  that you will use in the 
> >>>> parallel program.
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> I'd like to know some thing about data synchronization. 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> Does AMS process data synchronization in MPI environment automatically? 
> >>>>> Should I call AMS_Comm_publish on every MPI processor, and create 
> >>>>> memory with AMS_Memory_create for my variables on each processor?
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>  There are different types of variables you can publish.
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> AMS_Comm_publish() takes an argument AMS_Comm_type which would be 
> >>>> MPI_TYPE like in your case.
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>  AMS_Memory_add_field() takes an argument AMS_Shared_type  which can be 
> >>>> AMS_COMMON, AMS_DISTRIBUTED or AMS_REDUCED  and if it is reduced the 
> >>>> AMS_Reduction_type is AMS_SUM, AMS_MAX, AMS_MIN, or AMS_NONE.  See the 
> >>>> manual page for AMS_Memory_add_field() .
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>  If AMS_Shared_type is AMS_COMMON then AMS assumes that the values in 
> >>>> those locations are identical on all processes (and it brings over to 
> >>>> the accessor one set of those values), if distributed then each process 
> >>>> has an array of different values (and it brings over all those values, 
> >>>> in a long array, on the accessor) if reduce that it brings back the 
> >>>> values after applying the reduction operator across all the processes; 
> >>>> so with sum it beings back the sum of the values over all the processes.
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> If so, the accessor will see how many TCP/IP port? Or accessor only 
> >>>>> communicate with MPI processor 0 and processor 0 will broadcast the 
> >>>>> information to all the others?
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>  AMS completely manages the fact there are multiple "publishers", the 
> >>>> accessor transparently handles getting stuff from all the publisher 
> >>>> nodes.
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> If not, should I only create AMS object on processor 0, and processor 0 
> >>>>> should broadcast what AMS get?
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>   Nope, you do not need to do this.
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>  Barry
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> Gong Ding
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >>>> 
> 
> >> 
> 
> >> 
> 
> >> 
> 
> >> 
> 
> 
> 
> 

Reply via email to