I suspect that valgrind doesn't recognize that MPI_Allgather will ensure that 
hostname_recv_buf is filled prior to calling strcmp. If you want to eliminate 
the warning, you should memset hostname_recv_buf to 0 so it has a guaranteed 
value.

On Jan 27, 2012, at 6:21 AM, Gabriele Fatigati wrote:

> Hi Jeff,
> 
> yes, very stupid bug in a code, but also with the correction the problem with 
> Valgrind in strcmp remains:
> 
> ==21779== Conditional jump or move depends on uninitialised value(s)
> ==21779==    at 0x4A0898C: strcmp (mc_replace_strmem.c:711)
> ==21779==    by 0x400BA8: main (all_gather.c:28)
> ==21779==
> ==21779== Conditional jump or move depends on uninitialised value(s)
> ==21779==    at 0x4A0899A: strcmp (mc_replace_strmem.c:711)
> ==21779==    by 0x400BA8: main (all_gather.c:28)
> ==21779==
> ==21779== Conditional jump or move depends on uninitialised value(s)
> ==21779==    at 0x4A089BA: strcmp (mc_replace_strmem.c:711)
> ==21779==    by 0x400BA8: main (all_gather.c:28)
> 
> 
> Do you have the same warning with Valgrind?  Localhost name is something like 
> "node343" "node344" and so on.
> 
> 
> 2012/1/27 Jeff Squyres <jsquy...@cisco.com>
> I see one problem:
> 
>    gethostname(local_hostname, sizeof(local_hostname));
> 
> That should be:
> 
>    gethostname(local_hostname, max_name_len);
> 
> because sizeof(local_hostname) will be sizeof(void*).
> 
> But if that's what you were intending, just to simulate a small hostname 
> buffer, then be aware that gethostname() will not put a \0 after the string, 
> because it'll copy in sizeof(local_hostname) characters and then stop.
> 
> Specifically, the man page on OS X says:
> 
>     The gethostname() function returns the standard host name for the current
>     processor, as previously set by sethostname().  The namelen argument
>     specifies the size of the name array.  The returned name is null-termi-
>     nated, unless insufficient space is provided.
> 
> Hence, MPI is transmitting the entire 255 characters in your source array 
> (regardless of content -- MPI is not looking for \0's; you gave it the 
> explicit length of the buffer), but if they weren't filled with \0's, then 
> the receiver's printf will have problems handling it.
> 
> 
> 
> On Jan 27, 2012, at 4:03 AM, Gabriele Fatigati wrote:
> 
> > Sorry,
> >
> > this is the right code.
> >
> > 2012/1/27 Gabriele Fatigati <g.fatig...@cineca.it>
> > Hi Jeff,
> >
> > The problem is when I use strcmp on ALLGather buffer and Valgrind that 
> > raise a warning.
> >
> > Please check if the attached code is right, where size(local_hostname) is 
> > very small.
> >
> > Valgrind is used as:
> >
> > mpirun valgrind --leak-check=full --tool=memcheck ./all_gather
> >
> > and openmpi/1.4.4 compiled with "-O0 -g"
> >
> > Thanks!
> >
> > 2012/1/26 Jeff Squyres <jsquy...@cisco.com>
> > I'm not sure what you're asking.
> >
> > The entire contents of hostname[] will be sent -- from position 0 to 
> > position (MAX_STRING_LEN-1).  If there's a \0 in there, it will be sent.  
> > If the \0 occurs after that, then it won't.
> >
> > Be aware that get_hostname(buf, size) will not put a \0 in the buffer if 
> > the hostname is exactly "size" bytes.  So you might want to double check 
> > that your get_hostname() is returning a \0-terminated string.
> >
> > Does that make sense?
> >
> > Here's a sample I wrote to verify this:
> >
> > #include <stdio.h>
> > #include <string.h>
> > #include <mpi.h>
> > #include <stdlib.h>
> >
> > #define MAX_LEN 64
> >
> > static void where_null(char *ptr, int len, int rank)
> > {
> >    int i;
> >
> >    for (i = 0; i < len; ++i) {
> >        if ('\0' == ptr[i]) {
> >            printf("Rank %d: Null found at position %d (string: %s)\n",
> >                   rank, i, ptr);
> >            return;
> >        }
> >    }
> >
> >    printf("Rank %d: Null not found! (string: ", rank);
> >    for (i = 0; i < len; ++i) putc(ptr[i], stdout);
> >    putc('\n', stdout);
> > }
> >
> > int main()
> > {
> >    int i;
> >    char hostname[MAX_LEN];
> >    char *hostname_recv_buf;
> >    int rank, size;
> >
> >    MPI_Init(NULL, NULL);
> >    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
> >    MPI_Comm_size(MPI_COMM_WORLD, &size);
> >
> >    gethostname(hostname, MAX_LEN - 1);
> >    where_null(hostname, MAX_LEN, rank);
> >
> >    hostname_recv_buf = calloc(size * (MAX_LEN), (sizeof(char)));
> >    MPI_Allgather(hostname, MAX_LEN, MPI_CHAR,
> >                  hostname_recv_buf, MAX_LEN, MPI_CHAR, MPI_COMM_WORLD);
> >    for (i = 0; i < size; ++i) {
> >        where_null(hostname_recv_buf + i * MAX_LEN, MAX_LEN, rank);
> >    }
> >
> >    MPI_Finalize();
> >    return 0;
> > }
> >
> >
> >
> > On Jan 13, 2012, at 2:32 AM, Gabriele Fatigati wrote:
> >
> > > Dear OpenMPI,
> > >
> > > using MPI_Allgather with MPI_CHAR type, I have a doubt about 
> > > null-terminated character. Imaging I want to spawn node names where my 
> > > program is running on:
> > >
> > >
> > > ----------------------------------------
> > >
> > > char hostname[MAX_LEN];
> > >
> > > char* 
> > > hostname_recv_buf=(char*)calloc(num_procs*(MAX_STRING_LEN),(sizeof(char)));
> > >
> > > MPI_Allgather(hostname, MAX_STRING_LEN, MPI_CHAR, hostname_recv_buf, 
> > > MAX_STRING_LEN, MPI_CHAR, MPI_COMM_WORLD);
> > >
> > > ----------------------------------------
> > >
> > >
> > > Now, is the null-terminated character of each local string included? Or I 
> > > have to send and receive in MPI_Allgather MAX_STRING_LEN+1 elements?
> > >
> > > Using Valgrind, in a subsequent simple strcmp:
> > >
> > > for( i= 0; i< num_procs; i++){
> > >                 if(strcmp(&hostname_recv_buf[MAX_STRING_LEN*i], 
> > > local_hostname)==0){
> > >                        ... doing something....
> > >                 }
> > >         }
> > >
> > > raise a warning:
> > >
> > > Conditional jump or move depends on uninitialised value(s)
> > > ==19931==    at 0x4A06E5C: strcmp (mc_replace_strmem.c:412)
> > >
> > > The same warning is not present if I use MAX_STRING_LEN+1 in 
> > > MPI_Allgather.
> > >
> > >
> > > Thanks in forward.
> > >
> > > --
> > > Ing. Gabriele Fatigati
> > >
> > > HPC specialist
> > >
> > > SuperComputing Applications and Innovation Department
> > >
> > > Via Magnanelli 6/3, Casalecchio di Reno (BO) Italy
> > >
> > > www.cineca.it                    Tel:   +39 051 6171722
> > >
> > > g.fatigati [AT] cineca.it
> > > _______________________________________________
> > > users mailing list
> > > us...@open-mpi.org
> > > http://www.open-mpi.org/mailman/listinfo.cgi/users
> >
> >
> > --
> > Jeff Squyres
> > jsquy...@cisco.com
> > For corporate legal information go to:
> > http://www.cisco.com/web/about/doing_business/legal/cri/
> >
> >
> > _______________________________________________
> > users mailing list
> > us...@open-mpi.org
> > http://www.open-mpi.org/mailman/listinfo.cgi/users
> >
> >
> >
> > --
> > Ing. Gabriele Fatigati
> >
> > HPC specialist
> >
> > SuperComputing Applications and Innovation Department
> >
> > Via Magnanelli 6/3, Casalecchio di Reno (BO) Italy
> >
> > www.cineca.it                    Tel:   +39 051 6171722
> >
> > g.fatigati [AT] cineca.it
> >
> >
> >
> > --
> > Ing. Gabriele Fatigati
> >
> > HPC specialist
> >
> > SuperComputing Applications and Innovation Department
> >
> > Via Magnanelli 6/3, Casalecchio di Reno (BO) Italy
> >
> > www.cineca.it                    Tel:   +39 051 6171722
> >
> > g.fatigati [AT] cineca.it
> > <all_gather.c>_______________________________________________
> > users mailing list
> > us...@open-mpi.org
> > http://www.open-mpi.org/mailman/listinfo.cgi/users
> 
> 
> --
> Jeff Squyres
> jsquy...@cisco.com
> For corporate legal information go to:
> http://www.cisco.com/web/about/doing_business/legal/cri/
> 
> 
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users
> 
> 
> 
> -- 
> Ing. Gabriele Fatigati
> 
> HPC specialist
> 
> SuperComputing Applications and Innovation Department
> 
> Via Magnanelli 6/3, Casalecchio di Reno (BO) Italy
> 
> www.cineca.it                    Tel:   +39 051 6171722
> 
> g.fatigati [AT] cineca.it           
> <all_gather.c>_______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users

Reply via email to