Re: MPI_Type_resize

Rajeev Thakur (thakur@mcs.anl.gov)
Mon, 21 Apr 1997 16:31:45 -0500

> I agree with Rajeev's statement that the meaning of MPI_TYPE_RESIZE
> created lb and ub markers is not defined well enough. I suggest that
> the cleanest view is that the markers placed by MPI_UB and MPI_LB are
> strong or sticky markers. The MPI_TYPE_RESIZE call creates a new type
> which has weak LB and UB markers. A weak marker is one that has the
> same genetic force as the displacement of real data. An application of
> a datatype which has an explicit but weak UB behaves AS IF it were
> carrying a data implied UB. (Except when passed to MPI_GET_TRUE_EXTENT.)
>
> If I have MPI_Datatype T1S which was created with a strong UB (using
> MPI_UB) at displacement 16 and then use it to create T2 which has a T1S
> at zero and an MPI_INT at 100 I get a strong UB at 16 in T2.

That means the lb and ub defined in MPI-1.1 are strong or sticky.
But MPI-1.1 also has the foll. rule, pg 71, ln. 19-21:
"An entry of type ub can be deleted if there is another entry of type
ub with higher displacement; an entry of type lb can be deleted if
there is another entry of type lb with a lower displacement."

By this rule, in the above example, the ub should be at 104, just after
the int.

Or are we modifying an MPI-1 rule over here?

> Even if I create T2 with an MPI_UB at 10 I still get the UB at 16
> in my resulting T2. The MPI_UB in T1S is sticky.

To do this in MPI-1, you would have to use MPI_Type_struct with T2 as
one datatype and MPI_UB as the other. And then again the above rule
should apply, causing ub to remain at 104.

> If I make T1W which has a weak UB at 16 and an MPI_INT at 100 then any
> use of T1W in communication, IO or type construction contributes that UB
> of 16 with the same force as a UB which comes from data. Therefor, if I
> make T2 with 2*T1W at 0 and an MPI_INT at 8, the UB of T2 is 32. If I
> make T2 with 2*T1W at 0 and an MPI_INT at 100, the T2 UB is 104.

If this is what is intended, it is a new rule and must be clearly
explained in the document.
In my opinion, this weak ub is behaving stronger than a strong ub of
MPI-1, particularly in the second-last sentence of the above paragraph.

> Any MPI_TYPE_STRUCT call which uses MPI_LB or MPI_UB overrides a weak LB
> or UB and it makes no difference whether that weak LB/UB came from data
> locations or MPI_TYPE_RESIZE calls. The strong MPI_LB/UB is there in
> the new datatype and only an MPI_TYPE_RESIZE call or a lower-MPI_LB or
> higher-MPI_UB can knock it loose.

This means...
MPI_TYPE_STRUCT introduces a strong lb/ub which overrides a weak lb/ub.
MPI_TYPE_RESIZE introduces a weak lb/ub which can knock loose a strong
lb/ub. Seems contradictory.

> I think this view is consistent with the general usefulness of pseudo
> UB, LB and extent. In the rare conditions where the user really needs
> to get back to LB,UB and extent that are based on actual data positions
> he can call MPI_GET_TRUE_EXTENT and then use MPI_TYPE_RESIZE.

The source of my confusion about sticky/not-sticky, strong/weak is the
above-mentioned rule in MPI-1, which leads me to believe that lbs and
ubs in MPI-1 are themselves not sticky to begin with.

Rajeev