[mpich-discuss] ROMIO: view and type_indexed with holes at the end

Rob Ross rross at mcs.anl.gov
Mon Mar 8 08:42:46 CST 2010


Hi Pascal,

I believe that the issue is simply one of a misunderstanding of the  
MPI datatype system.

Zero length elements of an indexed type do not contribute to the  
typemap, so they can be ignored. You can add as many zero-length  
elements as you liked, at any position you wanted, and they will not  
change the effective type. If you want to introduce holes as you say,  
you should use MPI_Type_create_resized() instead.

This mainly boils down to getting the extent of your type correct. You  
are trying to get the extent of your type to be equal to disp[2] *  
sizeof(integer) in your code, but my expectation is that if you used  
MPI_Type_get_extent() on the type that you have created, you would see  
sizeof(integer) instead -- there's only one integer of data. The  
reason that you want the extent to be bigger is that when ROMIO tiles  
the type, the next type is positioned at the end of the extent of the  
previous one (more or less); that's what creates the hole at the end  
of the type, not a zero-length element.

Likewise the first zero-length element in your type doesn't really do  
anything. Instead you want the LB of your type to be zero. This is  
also handled with MPI_Type_create_resized().

So try this instead.

lng[0] = 1;
dsp[0] = 1;
MPI_Type_create_indexed(1, lng, dsp, MPI_INTEGER, &offtype);
MPI_Type_create_resized(offtype, 0, hole_position * sizeof(integer),  
&filetype);
MPI_Type_commit(&filetype);

...

Rob



On Mar 8, 2010, at 7:23 AM, Pascal Deveze wrote:

> Sorry, I forget the programm file
> Here it is.
>
> Pascal
>
> Pascal Deveze a écrit :
>> Hi all,
>>
>> I found a strange behaviour of  ROMIO with a type indexed datatype  
>> that is contains holes.
>> My definition:
>>      lng[0]= 0;
>>      dsp[0]= 0; ==> hole at first element
>>      lng[1]= 1;
>>      dsp[1]= 1; ===> one element
>>      lng[2]= 0;
>>      dsp[2]= 3; ====> hole at the end
>>
>>      MPI_Type_indexed(3, lng, dsp, MPI_INTEGER, &filetype);
>>      MPI_Type_commit(&filetype);
>>      MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_RDONLY ,  
>> MPI_INFO_NULL, &fh);
>>      MPI_File_set_view(fh, 0, MPI_INTEGER, filetype,"native",  
>> MPI_INFO_NULL);
>>
>> This definition works fine: One element with one hole at the  
>> beginning and 2 holes at the end.
>> It works also fine when dsp[2] > 3.
>>
>> But it does not work with dsp[2]=2. In that case, there is no hole  
>> at the end.
>>
>> Attached is a small program to reproduce the error.
>>
>> I do not find if the MPI standard allows to introduce "holes" in  
>> the indexed datatype (specifiing lng[i]=0) or does'nt.
>> In any case, it seems to work in all cases excepted if only one  
>> hole is specified at the end (dsp[2] = 2).
>>
>> Is this a bug in ROMIO or a limit of the MPI standard ?
>>
>> Pascal
>>
>>
>>
>> _______________________________________________
>> mpich-discuss mailing list
>> mpich-discuss at mcs.anl.gov
>> https://lists.mcs.anl.gov/mailman/listinfo/mpich-discuss
>>
>>
>
> #include <stdio.h>
> #include "mpi.h"
>
> #define SIZE 1000
> char filename[256]="/mnt/fs3/devezep/VIEW_TEST";
> int i, j, myid, dsp[3], lng[3], buffer[SIZE];
> MPI_Status status;
> MPI_File fh;
> MPI_Datatype filetype;
>
> int main(int argc, char **argv) {
>
> MPI_Init(&argc, &argv);
> MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL);
> MPI_Comm_rank(MPI_COMM_WORLD, &myid);
>
> if (!myid) {
>    MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_CREATE |  
> MPI_MODE_RDWR , MPI_INFO_NULL, &fh);
>    MPI_File_set_errhandler(fh, MPI_ERRORS_ARE_FATAL);
>
>    for (i=0; i<SIZE; i++) buffer[i] = i;
>    MPI_File_write(fh, buffer, SIZE, MPI_INTEGER, &status);
>    MPI_File_close(&fh);
>
> // loop for test :
>    for (i=2 ; i<4 ; i++) {
>       lng[0]= 0;
>       dsp[0]= 0;
>       lng[1]= 1;
>       dsp[1]= 1;
>       lng[2]= 0;
>       dsp[2]= i;
>
>       MPI_Type_indexed(3, lng, dsp, MPI_INTEGER, &filetype);
>       MPI_Type_commit(&filetype);
>       MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_RDONLY ,  
> MPI_INFO_NULL, &fh);
>       MPI_File_set_view(fh, 0, MPI_INTEGER, filetype,"native",  
> MPI_INFO_NULL);
>       MPI_File_read(fh, buffer, 5, MPI_INTEGER, &status);
>
>       printf("data read with view for i=%d => lng[0]=%d dsp[0]=%d  
> lng[1]=%d dsp[1]=%d lng[2]=%d dsp[2]=%d :",
>             i, lng[0], dsp[0], lng[1], dsp[1], lng[2], dsp[2]);
>       for (j=0 ; j<5 ; j++) printf("%x ", buffer[j]);
>       if (buffer[1] != (i+2)) printf("\n =======>  test KO for i= 
> %d : buffer[1]=%d instead of %d \n", i, buffer[1], i+2);
>       else printf("\n =======> test OK for i=%d\n", i);
>       MPI_Type_free(&filetype);
>       MPI_File_close(&fh);
>    }
> }
> MPI_Barrier(MPI_COMM_WORLD);
> MPI_Finalize();
> }
> _______________________________________________
> mpich-discuss mailing list
> mpich-discuss at mcs.anl.gov
> https://lists.mcs.anl.gov/mailman/listinfo/mpich-discuss



More information about the mpich-discuss mailing list