Archives


- Beowulf
- Beowulf Announce
- Scyld-users
- Beowulf on Debian

[Beowulf] Stupid MPI programming question

Many of your questions may have already been answered in earlier discussions or in the FAQ. The search results page will indicate current discussions as well as past list serves, articles, and papers.

Search

Jakob Oestergaard jakob at unthought.net
Thu Sep 28 00:42:42 PDT 2006


On Thu, Sep 28, 2006 at 01:47:17AM +0100, Clements, Brent M (SAIC) wrote:
> Hey Guys,
...
>  
> This is what I have in my code(some things have been removed)
>  
> #define MASTER_RANK 0
>  
> char* mystring;

So mystring is a pointer to character(s).

>  
> mystring = "some test";

Now mystring points to a statically allocated string "some test".

You must not overwrite "some test" with other data - the data area is
assumed to be constant and compilers are even free to merge such
strings. For example:

char *a = "some fancy test";
char *b = "fancy test";

This can result in the following memory layout

"some fancy test"
 ^    ^
 a    |
      b

Imagine what would happen to *a if you changed the contents of *b...

I don't know if your compiler does this - but it is just one example of
what *could* go wrong.

My current gcc will place the strings in a read-only part of the program
memory. This means, the following code will segfault:

---
char *foo = "my test"; // 8 bytes in possibly read-only memory
...
foo[0] = ' ';          //    <- blamo! segfault
---


What you probably want to do is:
---
char foo[1024];          // 1KiB on the stack - writable
strncpy(foo, sizeof foo, "my test"); // Assign contents by copying
...
foo[0] = ' ';             // <- fine
---


>  
> MPI_Bcast(&mystring, sizeof(basedir), MPI_CHAR, MASTER_RANK, MPI_COMM_WORLD);

It's really odd to me that MPI_Bcast with MPI_CHAR takes the *address*
of the *pointer* rather than the address of the data that needs to be
sent... But I looked up another example and it does look like that's
really what you need to do. Odd...

So, anyway, I think what you want to do is:

char foo[1024];
strncpy(foo, sizeof foo, "my test");
MPI_Bcast(&foo, sizeof foo, MPI_CHAR, ...);

...
>  
> Am I doing something wrong? Or if someone has some sample code they can point me to on how to send a string to a slave mpi process and have that slave mpi process print out the string..that would be even better. That way..I relearn MPI basics 101

Looks like the problem is with C not MPI  - unless of course I've completely missed something  ;)

-- 

 / jakob




More information about the Beowulf mailing list