Re: [mpich-discuss] MPI user-defined datatype size
MPI does not know about the padding because it does not really create a struct in the same sense as the compiler. As a result, you need to resize the datatype to account for the padding. Check the examples 5.16 and 5.17 in the MPI standard to see how to use it. For your particular example, replacing the last 2 lines of code with: MPI_Type_create_struct(struct_len, block_len, displacements, types, &tmp_ddt); MPI_Type_create_resized(tmp_ddt, 0, sizeof(), &mpi_data_type); MPI_Type_connit(mpi_data_type); should make the MPI struct match the compiler struct. While you can manipulate the pointers directly and compute the displacements by hand, you should not use a size_t for that. MPI_Aint is a signed type, ssize_t or some form of ptrdiff_t. Instead you should use the MPI suggested way via MPI_Get_address (to obtain the address of an object as an MPI_Aint), and then MPI_Aint_diff to compute relative displacements. George. On Sun, Dec 3, 2023 at 3:55 PM Mccall, Kurt E. (MSFC-EV41) via discuss < [email protected]> wrote:
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);
_______________________________________________ discuss mailing list [email protected] To manage subscription options or unsubscribe: https://lists.mpich.org/mailman/listinfo/discuss
participants (1)
-
George Bosilca