[mpich-discuss] MPI user-defined datatype size
Mccall, Kurt E. (MSFC-EV41)
kurt.e.mccall at nasa.gov
Sun Dec 3 14:55:28 CST 2023
Hi,
I'm running MPICH 4.1.2.
Should a MPI user-defined datatype created by MPI_Type_create_struct have the same size as the C++ object on which it is based? Comparing sizeof(cpp_obj) and the output
>From MPI_Type_size(mpi_data_type_, &size1), the C++ object is four bytes larger than the MPI datatype. I don't know if this is because I have to do something special to take
padding into account when I create the MPI user datatype.
Here is my C++ message class:
struct MsgTupleSeq
{
static const int N_INDICES_MAX_ = 4; // culprit?
int n_vars_;
int n_ndxs_;
short start_[N_INDICES_MAX_];
short end_[N_INDICES_MAX_];
short current_[N_INDICES_MAX_];
long long n_tuples_;
int unique_id_;
int subordinate_id_;
int opcode_;
char error_msg_[512];
}
That is 564 bytes for the non-static members, but such an object is 568 bytes long with the 4 bytes of padding that the compiler inserts.
I define the MPI user datatype with the code below, using the MsgTupleSeq object to compute the offsets. MPI_Type_size returns 564 bytes for the user datatype,
so it seems like it isn't seeing the padding.
MsgTupleSeq obj;
MPI_Datatype mpi_data_type;
int struct_len = 10, i = 0;
int block_len[struct_len];
MPI_Datatype types[struct_len];
MPI_Aint displacements[struct_len];
// the integer "n_vars_" member
block_len[i] = 1;
types[i] = MPI_INT;
displacements[i] = (size_t) &obj.n_vars_ - (size_t) &obj;
// the integer "n_ndxs_" member
++i;
block_len[i] = 1;
types[i] = MPI_INT;
displacements[i] = (size_t) &obj.n_ndxs_ - (size_t) &obj;
// the short integer "start_" array member
++i;
block_len[i] = N_INDICES_MAX_;
types[i] = MPI_SHORT;
displacements[i] = (size_t) &obj.start_ - (size_t) &obj;
// the short integer "end_" array member
++i;
block_len[i] = N_INDICES_MAX_;
types[i] = MPI_SHORT;
displacements[i] = (size_t) &obj.end_ - (size_t) &obj;
// the short integer "current_" array member
++i;
block_len[i] = N_INDICES_MAX_;
types[i] = MPI_SHORT;
displacements[i] = (size_t) &obj.current_ - (size_t) &obj;
// the long long integer "n_tuples_" member
++i;
block_len[i] = 1;
types[i] = MPI_LONG_LONG;
displacements[i] = (size_t) &obj.n_tuples_ - (size_t) &obj;
// the integer "unique_id_" member
++i;
block_len[i] = 1;
types[i] = MPI_INT;
displacements[i] = (size_t) &obj.unique_id_ - (size_t) &obj;
// the integer "subordinate_id_" member
++i;
block_len[i] = 1;
types[i] = MPI_INT;
displacements[i] = (size_t) &obj.subordinate_id_ - (size_t) &obj;
// the integer "opcode_" member
++i;
block_len[i] = 1;
types[i] = MPI_INT;
displacements[i] = (size_t) &obj.opcode_ - (size_t) &obj;
// the char array "error_msg_" member
++i;
block_len[i] = 512;
types[i] = MPI_CHAR;
displacements[i] = (size_t) &obj.error_msg_[0] - (size_t) &obj;
MPI_Type_create_struct(struct_len, block_len, displacements, types, &mpi_data_type);
MPI_Type_commit(&mpi_data_type);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mpich.org/pipermail/discuss/attachments/20231203/7fac298b/attachment.html>
More information about the discuss
mailing list