Dear All,

I read a little more about MPI derived data types, and to answer my own 
question:

In general, we cannot assume portability of sending a C/C++ struct as a stream 
of bytes. There must be a promise that data representation on machines involved 
in the transmission must perform the same data layout. 


Also, there was a +1 on using derived data types in terms of clarity of code.

But, now that I decided to use it, I run into another problem.

I have a function that commits the new datatype: Add_New_MPITypes(). This is 
called just after MPI_Init(...).
After a few subsequent function calls, I am doing MPI-Send/Receive in another 
function, which looks like:

void sendMessagetoSlave(void* Payload, int MESSAGETYPE)
{
    switch (MESSAGETYPE)
    {
    case MSGINSTALLP:
      {
        //Add_MPI_msgInstallP_Type(); /*Was already done in Add_New_MPITypes() 
*/
        msgInstallP InstallPMessage;
        InstallPMessage = *(msgInstallP*)Payload;
        MPI_Ssend(
                  (void*)Payload,                       /* Payload */
                  sizeof(msgInstallP),                 /* size of the payload */
                  MPI_MSGINSTALLP,                      /* MPI Data type */
                  InstallPMessage.location,             /* location to which 
the message is being sent */
                  MASTERSLAVECONTROLMESSAGE,            /* Tag */
                  MPI_COMM_WORLD                        /* Communicator */
                  );
      }
      break;

    default:
      break;
    }
}


The linker complains that it does not know MPI_MSGINSTALLP derived datatype. 
Specifically, the message from the linker is:

"‘MPI_MSGINSTALLP’ was not declared in this scope".

I have using mpic++ (1.4.2) to compile, and g++ (4.5.3) to link.

Can anyone help?

Best.


Devendra


________________________________
 From: devendra rai <rai.deven...@yahoo.co.uk>
To: Open MPI Users <us...@open-mpi.org> 
Sent: Wednesday, 4 January 2012, 17:31
Subject: [OMPI users] Can we avoid derived datatypes?
 

Hello All,

I need to send a struct- datatype over MPI. Currently, I send the strcture as a 
series of MPI_BYTEs and on the other end, I dereference it as though it were a 
struct- type.

Something like this:

MPI_Ssend((void*)&MasterSlavePayload, sizeof(MasterSlavePayload), MPI_BYTE, 
destNode,MASTERSLAVECONTROLMESSAGE,MPI_COMM_WORLD);

where MasterSlavePayload is a structure variable.


This currently seems to work, where we have a homogenous environment: same 
hardware configuration, and same operating system.

The question is: Is this approach portable? Safe? And whether this will work on 
a
 system of nodes with mixed processor types?

I read from MPI tutorials

"...Primitive data types are contiguous. Derived data types allow you to  
specify non-contiguous data in a convenient manner and to treat it as  though 
it was contiguous. "

So, since I am using a primitive data type, does it mean that the packing of 
elements is maintained across the MPI_Send/MPI_Recv process? If so, it would 
mean that the approach that I use should work.

Any ideas?

Thanks a lot,

best

Devendra



_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users

Reply via email to