How to send dynamic vector?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • dopiotr

    How to send dynamic vector?

    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*)mall oc(sizeof(int)* size);

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

    Thanks!

  • santosh

    #2
    Re: How to send dynamic vector?

    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*)mall oc(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.or g/wiki/Message_Passing _Interface>
    <http://www.mpi-forum.org/docs/>
    <http://www.open-mpi.org/>
    <http://www.personal.le eds.ac.uk/~bgy1mm/MPITutorial/MPIHome.html>

    Comment

    • CryptiqueGuy

      #3
      Re: How to send dynamic vector?

      On Oct 22, 12:45 am, dopiotr <nos...@nospam. invalidwrote:
      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*)mall oc(sizeof(int)* size);
      >
      Did u check the return value of malloc?
      It might be NULL, due to failed memory allocation.

      Comment

      • dopiotr

        #4
        Re: How to send dynamic vector?

        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*)mall oc(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.or g/wiki/Message_Passing _Interface>
        ><http://www.mpi-forum.org/docs/>
        ><http://www.open-mpi.org/>
        ><http://www.personal.le eds.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(M PI_COMM_WORLD,& size);
        MPI_Comm_rank(M PI_COMM_WORLD,& rank);
        n_sigm=1000;

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

        if(rank != 0)
        {
        for(j=0;j<n_sig m;j++)
        suma_sigm[j]=rank*1000+j;
        }
        else
        {
        for(j=0;j<n_sig m;j++)
        s_tmp[j]=0;
        }
        MPI_Reduce(suma _sigm,s_tmp ,n_sigm,MPI_FLO AT,MPI_SUM,
        0,MPI_COMM_WORL D);
        if( rank == 0 )
        for(j=0;j<n_sig m;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(M PI_COMM_WORLD,& size);
        MPI_Comm_rank(M PI_COMM_WORLD,& rank);
        n_sigm=1000;

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

        if(rank != 0)
        {
        for(j=0;j<n_sig m;j++)
        suma_sigm[j]=rank*1000+j;
        }
        else
        {
        for(j=0;j<n_sig m;j++)
        s_tmp[j]=0;
        }
        s_tmp=(float *)malloc(sizeof (float)*n_sigm) ;//difference
        MPI_Reduce(suma _sigm,s_tmp ,n_sigm,MPI_FLO AT,MPI_SUM,
        0,MPI_COMM_WORL D);
        if( rank == 0 )
        for(j=0;j<n_sig m;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).

        Comment

        • santosh

          #5
          Re: How to send dynamic vector?

          dopiotr wrote:
          On 21 Oct 2007 at 19:56, santosh wrote:
          >dopiotr wrote:
          >>
          >>Hello Group,
          >>>
          >>int Msg[size];
          >>MPI_Send(Ms g, size, MPI_INT, DEST, TAG, MPI_COMM_WORLD) ;
          >>this is working fine.
          >>>
          >>But how to send Msg declared like this:
          >>int *Msg=(int*)mall oc(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.or g/wiki/Message_Passing _Interface>
          >><http://www.mpi-forum.org/docs/>
          >><http://www.open-mpi.org/>
          >><http://www.personal.le eds.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(M PI_COMM_WORLD,& size);
          MPI_Comm_rank(M PI_COMM_WORLD,& rank);
          n_sigm=1000;
          >
          suma_sigm=(floa t *)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_sig m;j++)
          suma_sigm[j]=rank*1000+j;
          }
          else
          {
          for(j=0;j<n_sig m;j++)
          s_tmp[j]=0;
          }
          MPI_Reduce(suma _sigm,s_tmp ,n_sigm,MPI_FLO AT,MPI_SUM,
          0,MPI_COMM_WORL D);
          if( rank == 0 )
          for(j=0;j<n_sig m;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(M PI_COMM_WORLD,& size);
          MPI_Comm_rank(M PI_COMM_WORLD,& rank);
          n_sigm=1000;
          >
          suma_sigm=(floa t *)malloc(sizeof (float)*n_sigm) ;
          >
          if(rank != 0)
          {
          for(j=0;j<n_sig m;j++)
          suma_sigm[j]=rank*1000+j;
          }
          else
          {
          for(j=0;j<n_sig m;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_FLO AT,MPI_SUM,
          0,MPI_COMM_WORL D);
          if( rank == 0 )
          for(j=0;j<n_sig m;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.


          Comment

          • Barry Schwarz

            #6
            Re: How to send dynamic vector?

            On Oct 21, 1:06 pm, dopiotr <nos...@nospam. invalidwrote:

            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*)mall oc(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(M PI_COMM_WORLD,& size);
            MPI_Comm_rank(M PI_COMM_WORLD,& rank);
            n_sigm=1000;
            >
            suma_sigm=(floa t *)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_sig m;j++)
            suma_sigm[j]=rank*1000+j;
            }
            else
            {
            for(j=0;j<n_sig m;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_FLO AT,MPI_SUM,
            0,MPI_COMM_WORL D);
            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_sig m;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(M PI_COMM_WORLD,& size);
            MPI_Comm_rank(M PI_COMM_WORLD,& rank);
            n_sigm=1000;
            >
            suma_sigm=(floa t *)malloc(sizeof (float)*n_sigm) ;
            >
            if(rank != 0)
            {
            for(j=0;j<n_sig m;j++)
            suma_sigm[j]=rank*1000+j;
            }
            else
            {
            for(j=0;j<n_sig m;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_FLO AT,MPI_SUM,
            0,MPI_COMM_WORL D);
            if( rank == 0 )
            for(j=0;j<n_sig m;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?

            Comment

            • Malcolm McLean

              #7
              Re: How to send dynamic vector?


              "dopiotr" <nospam@nospam. invalidwrote 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*)mall oc(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.



              Comment

              • Tor Rustad

                #8
                Re: How to send dynamic vector?

                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*)mall oc(sizeof(int)* size);
                Have you included <stdlib.h>? We recommend dropping the cast, and write
                this:

                int *Msg = malloc(sizeof(i nt)*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.m pi


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

                "Technical skill is mastery of complexity, while creativity is mastery
                of simplicity"

                Comment

                • Richard Heathfield

                  #9
                  Re: How to send dynamic vector?

                  Tor Rustad said:
                  dopiotr wrote:
                  >int *Msg=(int*)mall oc(sizeof(int)* size);
                  >
                  Have you included <stdlib.h>? We recommend dropping the cast, and write
                  this:
                  >
                  int *Msg = malloc(sizeof(i nt)*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

                  Comment

                  • Richard

                    #10
                    Re: How to send dynamic vector?

                    CryptiqueGuy <SRRajesh1989@g mail.comwrites:
                    On Oct 22, 12:45 am, dopiotr <nos...@nospam. invalidwrote:
                    >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*)mall oc(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...

                    Comment

                    • Tor Rustad

                      #11
                      Re: How to send dynamic vector?

                      Richard Heathfield wrote:
                      Tor Rustad said:
                      >
                      >dopiotr wrote:
                      >>int *Msg=(int*)mall oc(sizeof(int)* size);
                      >Have you included <stdlib.h>? We recommend dropping the cast, and write
                      >this:
                      >>
                      >int *Msg = malloc(sizeof(i nt)*size);
                      >
                      Who's this "we"?
                      The FAQ
                      Dropping the cast, sure, but repeating the type? Blech.
                      Agreed, I didn't notice the sizeof(type).


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


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

                      "Technical skill is mastery of complexity, while creativity is mastery
                      of simplicity"

                      Comment

                      • Tor Rustad

                        #12
                        Re: How to send dynamic vector?

                        Richard wrote:
                        CryptiqueGuy <SRRajesh1989@g mail.comwrites:
                        [...]
                        >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 can remember, doing my first matrix computations under DOS. The C
                        compiler had a size limit at 64 kb for objects. Not only could malloc
                        fail, but the max matrix size, was rather useless for doing scientific
                        double precision calculations.
                        I must admit that malloc has never failed me under Linux or Windows...
                        With the default setting in Linux, malloc should never fail. :)

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

                        "Technical skill is mastery of complexity, while creativity is mastery
                        of simplicity"

                        Comment

                        • Richard Heathfield

                          #13
                          Re: How to send dynamic vector?

                          Tor Rustad said:
                          Richard Heathfield wrote:
                          >Tor Rustad said:
                          >>
                          >>dopiotr wrote:
                          >>>int *Msg=(int*)mall oc(sizeof(int)* size);
                          >>Have you included <stdlib.h>? We recommend dropping the cast, and write
                          >>this:
                          >>>
                          >>int *Msg = malloc(sizeof(i nt)*size);
                          >>
                          >Who's this "we"?
                          >
                          The FAQ
                          Then the FAQ needs fixing. The above is poor style, and it is evident that
                          you agree...
                          >Dropping the cast, sure, but repeating the type? Blech.
                          >
                          Agreed, I didn't notice the sizeof(type).
                          >
                          >
                          int *msg = malloc(sizeof(* msg) * size);
                          Close enough. Personally, I'd use: int *msg = malloc(size * sizeof *msg);

                          --
                          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

                          Comment

                          • blmblm@myrealbox.com

                            #14
                            Re: How to send dynamic vector?

                            In article <1193001861.542 249.91070@k35g2 000prh.googlegr oups.com>,
                            Barry Schwarz <schwarz45@yaho o.comwrote:
                            On Oct 21, 1:06 pm, dopiotr <nos...@nospam. invalidwrote:
                            >
                            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*)mall oc(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.

                            First -- agreed that this is off-topic and that comp.parallel.m pi
                            would be a more appropriate newsgroup. A couple of points for the
                            record, one here, one later:

                            When I correct the problems mentioned by others here, the OP's
                            program produces what appear to me to be correct results (using
                            OpenMPI on a Fedora 7 system).

                            #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(M PI_COMM_WORLD,& size);
                            MPI_Comm_rank(M PI_COMM_WORLD,& rank);
                            n_sigm=1000;

                            suma_sigm=(floa t *)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_sig m;j++)
                            suma_sigm[j]=rank*1000+j;
                            }
                            else
                            {
                            for(j=0;j<n_sig m;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_FLO AT,MPI_SUM,
                            0,MPI_COMM_WORL D);
                            >
                            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.

                            Well, this *is* a library function, part of the same library that
                            initialized the local "rank" variable in the first place (via
                            the call to MPI_Comm_rank). Agreed that this isn't necessarily
                            obvious to readers of comp.lang.c, of course.

                            if( rank == 0 )
                            for(j=0;j<n_sig m;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(M PI_COMM_WORLD,& size);
                            MPI_Comm_rank(M PI_COMM_WORLD,& rank);
                            n_sigm=1000;

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

                            if(rank != 0)
                            {
                            for(j=0;j<n_sig m;j++)
                            suma_sigm[j]=rank*1000+j;
                            }
                            else
                            {
                            for(j=0;j<n_sig m;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_FLO AT,MPI_SUM,
                            0,MPI_COMM_WORL D);
                            if( rank == 0 )
                            for(j=0;j<n_sig m;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?
                            >
                            --
                            B. L. Massingill
                            ObDisclaimer: I don't speak for my employers; they return the favor.

                            Comment

                            • Charlie Gordon

                              #15
                              Re: How to send dynamic vector?

                              "Tor Rustad" <tor_rustad@hot mail.coma écrit dans le message de news:
                              _ZKdnTEn4P0RQYb aRVnzvQA@teleno r.com...
                              >
                              "Technical skill is mastery of complexity, while creativity is mastery of
                              simplicity"
                              What a striking quote! (attributed to Erik Christopher Zeeman)

                              --
                              Chqrlie.


                              Comment

                              Working...