Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > How to send dynamic vector?

Reply
Thread Tools

How to send dynamic vector?

 
 
dopiotr
Guest
Posts: n/a
 
      10-21-2007
Hello Group,

int Msg[size];
MPI_Send(Msg, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD);
this is working fine.

But how to send Msg declared like this:
int *Msg=(int*)malloc(sizeof(int)*size);

It gives me
p4_error: interrupt SIGSEGV: 11
not_send: could not write to fd=4, errno = 32

Thanks!

 
Reply With Quote
 
 
 
 
santosh
Guest
Posts: n/a
 
      10-21-2007
dopiotr wrote:

> Hello Group,
>
> int Msg[size];
> MPI_Send(Msg, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD);
> this is working fine.
>
> But how to send Msg declared like this:
> int *Msg=(int*)malloc(sizeof(int)*size);
>
> It gives me
> p4_error: interrupt SIGSEGV: 11
> not_send: could not write to fd=4, errno = 32


Without further code I can't really tell what your problem is. It may
not be a C problem but an incorrect use of MPI functions. You might do
better to ask in a forum dedicated to your MPI implementation.

<http://en.wikipedia.org/wiki/Message_Passing_Interface>
<http://www.mpi-forum.org/docs/>
<http://www.open-mpi.org/>
<http://www.personal.leeds.ac.uk/~bgy1mm/MPITutorial/MPIHome.html>

 
Reply With Quote
 
 
 
 
CryptiqueGuy
Guest
Posts: n/a
 
      10-21-2007
On Oct 22, 12:45 am, dopiotr <(E-Mail Removed)> wrote:
> Hello Group,
>
> int Msg[size];
> MPI_Send(Msg, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD);
> this is working fine.
>
> But how to send Msg declared like this:
> int *Msg=(int*)malloc(sizeof(int)*size);
>


Did u check the return value of malloc?
It might be NULL, due to failed memory allocation.

 
Reply With Quote
 
dopiotr
Guest
Posts: n/a
 
      10-21-2007
On 21 Oct 2007 at 19:56, santosh wrote:
> dopiotr wrote:
>
>> Hello Group,
>>
>> int Msg[size];
>> MPI_Send(Msg, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD);
>> this is working fine.
>>
>> But how to send Msg declared like this:
>> int *Msg=(int*)malloc(sizeof(int)*size);
>>
>> It gives me
>> p4_error: interrupt SIGSEGV: 11
>> not_send: could not write to fd=4, errno = 32

>
> Without further code I can't really tell what your problem is. It may
> not be a C problem but an incorrect use of MPI functions. You might do
> better to ask in a forum dedicated to your MPI implementation.
>
><http://en.wikipedia.org/wiki/Message_Passing_Interface>
><http://www.mpi-forum.org/docs/>
><http://www.open-mpi.org/>
><http://www.personal.leeds.ac.uk/~bgy1mm/MPITutorial/MPIHome.html>
>


Working wersion:
#include "mpi.h"
#include<stdio.h>
#include<stdlib.h>
uint n_sigm;
float *suma_sigm;

void main(int c, char *v[])
{
int size,rank;
int j;
float *s_tmp;
MPI_Init(&c,&v);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
n_sigm=1000;

suma_sigm=(float *)malloc(sizeof(float)*n_sigm);
s_tmp=(float *)malloc(sizeof(float)*n_sigm);//difference

if(rank != 0)
{
for(j=0;j<n_sigm;j++)
suma_sigm[j]=rank*1000+j;
}
else
{
for(j=0;j<n_sigm;j++)
s_tmp[j]=0;
}
MPI_Reduce(suma_sigm,s_tmp ,n_sigm,MPI_FLOAT,MPI_SUM,
0,MPI_COMM_WORLD);
if( rank == 0 )
for(j=0;j<n_sigm;j++)
printf("%i %f\n",j,s_tmp[j]);
free(suma_sigm);
free(s_tmp);
MPI_Finalize();
}

Why it is not working:
#include "mpi.h"
#include<stdio.h>
#include<stdlib.h>
uint n_sigm;
float *suma_sigm;
int main(int c, char *v[])
{
int size,rank;
int j;
float *s_tmp;
MPI_Init(&c,&v);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
n_sigm=1000;

suma_sigm=(float *)malloc(sizeof(float)*n_sigm);

if(rank != 0)
{
for(j=0;j<n_sigm;j++)
suma_sigm[j]=rank*1000+j;
}
else
{
for(j=0;j<n_sigm;j++)
s_tmp[j]=0;
}
s_tmp=(float *)malloc(sizeof(float)*n_sigm);//difference
MPI_Reduce(suma_sigm,s_tmp ,n_sigm,MPI_FLOAT,MPI_SUM,
0,MPI_COMM_WORLD);
if( rank == 0 )
for(j=0;j<n_sigm;j++)
printf("%i %f\n",j,s_tmp[j]);
free(suma_sigm);
free(s_tmp);
MPI_Finalize();
}

And why value of s_tmp[0] & s_tmp[1] is incorrect (in working
version).

 
Reply With Quote
 
santosh
Guest
Posts: n/a
 
      10-21-2007
dopiotr wrote:

> On 21 Oct 2007 at 19:56, santosh wrote:
>> dopiotr wrote:
>>
>>> Hello Group,
>>>
>>> int Msg[size];
>>> MPI_Send(Msg, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD);
>>> this is working fine.
>>>
>>> But how to send Msg declared like this:
>>> int *Msg=(int*)malloc(sizeof(int)*size);
>>>
>>> It gives me
>>> p4_error: interrupt SIGSEGV: 11
>>> not_send: could not write to fd=4, errno = 32

>>
>> Without further code I can't really tell what your problem is. It may
>> not be a C problem but an incorrect use of MPI functions. You might
>> do better to ask in a forum dedicated to your MPI implementation.
>>
>><http://en.wikipedia.org/wiki/Message_Passing_Interface>
>><http://www.mpi-forum.org/docs/>
>><http://www.open-mpi.org/>
>><http://www.personal.leeds.ac.uk/~bgy1mm/MPITutorial/MPIHome.html>
>>

>
> Working wersion:
> #include "mpi.h"
> #include<stdio.h>
> #include<stdlib.h>
> uint n_sigm;
> float *suma_sigm;
>
> void main(int c, char *v[])


Use int main

> {
> int size,rank;
> int j;
> float *s_tmp;
> MPI_Init(&c,&v);
> MPI_Comm_size(MPI_COMM_WORLD,&size);
> MPI_Comm_rank(MPI_COMM_WORLD,&rank);
> n_sigm=1000;
>
> suma_sigm=(float *)malloc(sizeof(float)*n_sigm);
> s_tmp=(float *)malloc(sizeof(float)*n_sigm);//difference


In C the cast of malloc's return value is not needed. I'd write your
statements as:

suma_sigm = malloc(sizeof *suma_sigm * n_sigm);
s_tmp = malloc(sizeof *s_tmp * n_sigm);

Also be sure to check that malloc actually succeeded.

> if(rank != 0)
> {
> for(j=0;j<n_sigm;j++)
> suma_sigm[j]=rank*1000+j;
> }
> else
> {
> for(j=0;j<n_sigm;j++)
> s_tmp[j]=0;
> }
> MPI_Reduce(suma_sigm,s_tmp ,n_sigm,MPI_FLOAT,MPI_SUM,
> 0,MPI_COMM_WORLD);
> if( rank == 0 )
> for(j=0;j<n_sigm;j++)
> printf("%i %f\n",j,s_tmp[j]);
> free(suma_sigm);
> free(s_tmp);
> MPI_Finalize();


Return a value here.

> }
>
> Why it is not working:
> #include "mpi.h"
> #include<stdio.h>
> #include<stdlib.h>
> uint n_sigm;
> float *suma_sigm;
> int main(int c, char *v[])
> {
> int size,rank;
> int j;
> float *s_tmp;
> MPI_Init(&c,&v);
> MPI_Comm_size(MPI_COMM_WORLD,&size);
> MPI_Comm_rank(MPI_COMM_WORLD,&rank);
> n_sigm=1000;
>
> suma_sigm=(float *)malloc(sizeof(float)*n_sigm);
>
> if(rank != 0)
> {
> for(j=0;j<n_sigm;j++)
> suma_sigm[j]=rank*1000+j;
> }
> else
> {
> for(j=0;j<n_sigm;j++)
> s_tmp[j]=0;


Well, here s_tmp is not yet pointing to any valid memory. You're writing
to memory you don't own or should not be writing to. Initialise s_tmp
to a valid object or an array of objects before using it.

> }
> s_tmp=(float *)malloc(sizeof(float)*n_sigm);//difference


/Now/ you're doing it, but it's too late, unless rank was not zero.

> MPI_Reduce(suma_sigm,s_tmp ,n_sigm,MPI_FLOAT,MPI_SUM,
> 0,MPI_COMM_WORLD);
> if( rank == 0 )
> for(j=0;j<n_sigm;j++)
> printf("%i %f\n",j,s_tmp[j]);
> free(suma_sigm);
> free(s_tmp);
> MPI_Finalize();
> }
>
> And why value of s_tmp[0] & s_tmp[1] is incorrect (in working
> version).


How should I know? What value did you expect? The obvious bug waiting to
happen in your second version is the use of the pointer s_tmp without
making it point to anything valid beforehand.


 
Reply With Quote
 
Barry Schwarz
Guest
Posts: n/a
 
      10-21-2007
On Oct 21, 1:06 pm, dopiotr <(E-Mail Removed)> wrote:

snip

> > dopiotr wrote:

>
> >> Hello Group,

>
> >> int Msg[size];
> >> MPI_Send(Msg, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD);
> >> this is working fine.

>
> >> But how to send Msg declared like this:
> >> int *Msg=(int*)malloc(sizeof(int)*size);

>
> >> It gives me
> >> p4_error: interrupt SIGSEGV: 11
> >> not_send: could not write to fd=4, errno = 32


snip

> Working wersion:


This is not a working version. It invokes undefined behavior and you
state it produces incorrect results.

> #include "mpi.h"
> #include<stdio.h>
> #include<stdlib.h>
> uint n_sigm;
> float *suma_sigm;
>
> void main(int c, char *v[])


main should return int.

> {
> int size,rank;
> int j;
> float *s_tmp;
> MPI_Init(&c,&v);
> MPI_Comm_size(MPI_COMM_WORLD,&size);
> MPI_Comm_rank(MPI_COMM_WORLD,&rank);
> n_sigm=1000;
>
> suma_sigm=(float *)malloc(sizeof(float)*n_sigm);


Do not cast the return from malloc. It can never help and the only
effect would be to suppress a diagnostic you really want to see if it
applies to your code.

> s_tmp=(float *)malloc(sizeof(float)*n_sigm);//difference


You should always check that malloc succeeds.

>
> if(rank != 0)
> {
> for(j=0;j<n_sigm;j++)
> suma_sigm[j]=rank*1000+j;
> }
> else
> {
> for(j=0;j<n_sigm;j++)
> s_tmp[j]=0;
> }


At this point, the elements of suma_sigm or s_tmp (but not both) have
been assigned values. The elements of the other array are
indeterminate (uninitialized).

> MPI_Reduce(suma_sigm,s_tmp ,n_sigm,MPI_FLOAT,MPI_SUM,
> 0,MPI_COMM_WORLD);


Since you don't pass rank to this function, how is it supposed to
determine which of the arrays has valid values and which doesn't. Any
attempt by the function to evaluate an indeterminate element will
invoke undefined behavior.

> if( rank == 0 )
> for(j=0;j<n_sigm;j++)
> printf("%i %f\n",j,s_tmp[j]);
> free(suma_sigm);
> free(s_tmp);
> MPI_Finalize();
>
> }
>
> Why it is not working:
> #include "mpi.h"
> #include<stdio.h>
> #include<stdlib.h>
> uint n_sigm;
> float *suma_sigm;
> int main(int c, char *v[])
> {
> int size,rank;
> int j;
> float *s_tmp;
> MPI_Init(&c,&v);
> MPI_Comm_size(MPI_COMM_WORLD,&size);
> MPI_Comm_rank(MPI_COMM_WORLD,&rank);
> n_sigm=1000;
>
> suma_sigm=(float *)malloc(sizeof(float)*n_sigm);
>
> if(rank != 0)
> {
> for(j=0;j<n_sigm;j++)
> suma_sigm[j]=rank*1000+j;
> }
> else
> {
> for(j=0;j<n_sigm;j++)
> s_tmp[j]=0;


At this point, s_tmp is still indeterminate; it does not yet point to
any memory you can access. s_tmp[j] does not exist. This invokes
undefined behavior.

> }
> s_tmp=(float *)malloc(sizeof(float)*n_sigm);//difference


And if the previous undefined behavior were not sufficient, this would
replace the address that s_tmp was pointing to with the address of the
newly allocated memory making all the elements of the array
indeterminate again.

> MPI_Reduce(suma_sigm,s_tmp ,n_sigm,MPI_FLOAT,MPI_SUM,
> 0,MPI_COMM_WORLD);
> if( rank == 0 )
> for(j=0;j<n_sigm;j++)
> printf("%i %f\n",j,s_tmp[j]);
> free(suma_sigm);
> free(s_tmp);
> MPI_Finalize();
>
> }
>
> And why value of s_tmp[0] & s_tmp[1] is incorrect (in working
> version).


By definition, a working version would produce correct results. What
is the vlaue of rank when you see these incorrect values? What is the
function MPI_Reduce supposed to do with the two arrays you pass?

 
Reply With Quote
 
Malcolm McLean
Guest
Posts: n/a
 
      10-21-2007

"dopiotr" <(E-Mail Removed)> wrote in message
> Hello Group,
>
> int Msg[size];
> MPI_Send(Msg, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD);
> this is working fine.
>
> But how to send Msg declared like this:
> int *Msg=(int*)malloc(sizeof(int)*size);
>
> It gives me
> p4_error: interrupt SIGSEGV: 11
> not_send: could not write to fd=4, errno = 32
>

Should be fine. If the call sends a static array it should work exactly the
same way with a dynamic buffer allocated with malloc(). This is a general
feature of C functions, not just MPI.

However you have to know the message length, and allocate another buffer, to
receive the message at the other end.

--
Free games and programming goodies.
http://www.personal.leeds.ac.uk/~bgy1mm


 
Reply With Quote
 
Tor Rustad
Guest
Posts: n/a
 
      10-21-2007
dopiotr wrote:
> Hello Group,
>
> int Msg[size];
> MPI_Send(Msg, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD);
> this is working fine.
>
> But how to send Msg declared like this:
> int *Msg=(int*)malloc(sizeof(int)*size);


Have you included <stdlib.h>? We recommend dropping the cast, and write
this:

int *Msg = malloc(sizeof(int)*size);

> It gives me
> p4_error: interrupt SIGSEGV: 11
> not_send: could not write to fd=4, errno = 32


MPI related questions are off-topic here, try

comp.parallel.mpi


--
Tor <torust [at] online [dot] no>

"Technical skill is mastery of complexity, while creativity is mastery
of simplicity"
 
Reply With Quote
 
Richard Heathfield
Guest
Posts: n/a
 
      10-21-2007
Tor Rustad said:

> dopiotr wrote:
>> int *Msg=(int*)malloc(sizeof(int)*size);

>
> Have you included <stdlib.h>? We recommend dropping the cast, and write
> this:
>
> int *Msg = malloc(sizeof(int)*size);


Who's this "we"? Dropping the cast, sure, but repeating the type? Blech.

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
 
Reply With Quote
 
Richard
Guest
Posts: n/a
 
      10-21-2007
CryptiqueGuy <(E-Mail Removed)> writes:

> On Oct 22, 12:45 am, dopiotr <(E-Mail Removed)> wrote:
>> Hello Group,
>>
>> int Msg[size];
>> MPI_Send(Msg, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD);
>> this is working fine.
>>
>> But how to send Msg declared like this:
>> int *Msg=(int*)malloc(sizeof(int)*size);
>>

>
> Did u check the return value of malloc?
> It might be NULL, due to failed memory allocation.


I wonder how many times people have come across this? I must admit that
malloc has never failed me under Linux or Windows...
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Socket send functions only allow you to send strings? Ryan Parmeter Ruby 4 09-05-2007 03:29 AM
Mail.SmtpMail.Send won't send to one of my addresses Nathan Sokalski ASP .Net 3 11-23-2005 09:25 PM
Pre-Send Request Headers, Pre-Send Request Content =?Utf-8?B?S2V2aW4gQnVydG9u?= ASP .Net 0 12-31-2004 06:29 PM
Does Socket.send send all bytes? Chris Reay Ruby 2 11-04-2003 08:22 PM



Advertisments