I have a big patch pending, that will map all ompi types, and therefore all OP directly into OPAL ddt. The OMPI DDT part is completed, but I have some troubles with the ops. At this point I'm looking into the .m4 files for some help with the mapping between Fortran types directly into the POSIX types (int8_t and friends) instead of C types.
I tried a different approach, where I add things in the ompi_datatype_t. Unfortunately, this will break all backward compatibility because of the use of the ompi_predefined_datatype_t fixed size structure. The problem is that adding things into the ompi_datatype_t, make this structure larger than 512 bytes, and therefore force us to modify the size of the ompi_predefined_datatype_t.
Anyway, back to your question. The MPI and OPAL datatypes uses the same indexes, for all the OPAL predefined types. Several MPI types map to the same underlying OPAL type: such as MPI_INT, MPI_INTEGER, MPI_INT32_T. All MPI types not supported at OPAL level, will get their indexes contiguously after the OPAL_DATATYPE_MAX_PREDEFINED upper bound (up to OMPI_DATATYPE_MPI_MAX_PREDEFINED). Moreover, the OPAL layer has been modified to support up to OPAL_DATATYPE_MAX_SUPPORTED datatypes, and this value should be modified based on the upper level requirements (today it is set to 46 as this is the total number of MPI supported datatypes, including the Fortran ones). bdt_used is currently defined as an uint32_t, so obviously there is not enough place to hold all possible MPI datatypes.
Solution 1: We can change the bdt_used to uint64_t. This requires some work, and I will prefer to have some time to see exactly all the implications.
Solution 2: Quick and dirty, but not the fastest one. Instead of walking the bdt_used you can walk the btypes array. If the count is not zero, then the MPI datatype corresponding to the index in the array is used.
On Dec 21, 2010, at 12:02 , Barrett, Brian W wrote:
> All -
> I'm trying to follow up on James Dinan's one-sided datatype errors e-mail and running into some datatype issues from when the datatype engine was moved to OPAL (sigh). Accumulate needs to get at the underlying datatypes for a user-created dataype. Before the ddt move, one just walked bdt_used and found the underlying type. Now it appears that bdt_used refers to the opal types, not the ompi types. And since there's not a one-to-one mapping between the two, I'm at a loss as to how one could find a MPI pre-defined datatype from the user-defined datatype. Can someone point me in the right direction?
> Brian W. Barrett
> Dept. 1423: Scalable System Software
> Sandia National Laboratories
> devel mailing list