I think there is still some problem.
I create different datatypes by resizing MPI_SHORT with
different negative lower bounds (depending on the rank)
and the same extent (only depending on the number of processes).
However, I get an error as soon as MPI_File_set_view is called with my new datatype:
Error: Unsupported datatype passed to ADIOI_Count_contiguous_blocks
[aim-nano_02:22229] MPI_ABORT invoked on rank 0 in communicator MPI_COMM_WORLD with errorcode 1
The same error occurs, if i set the lower bounds to 0.
Is it perhaps not possible to use resized datatypes in MPI_File_set_view?
Here's my code:
#include <stdio.h>
#include "
mpi.h"
//-----------------------------------------------------------------------------
// main
//
//
int main(int iArgC, char *apArgV[]) {
int iNumProcs;
int iID;
MPI_Init(&iArgC, &apArgV);
MPI_Comm_size(MPI_COMM_WORLD, &iNumProcs);
MPI_Comm_rank(MPI_COMM_WORLD, &iID);
// get the size of a MPI_SHORT
MPI_Aint lbs;
MPI_Aint exts;
MPI_Type_get_extent(MPI_SHORT, &lbs, &exts);
// resize the MPI_SHORT datatype
// same extent but differennt position of the MPI_SHORT
MPI_Datatype dtWHoles;
MPI_Aint lb = -iID * exts;
MPI_Aint ext = iNumProcs * exts;
MPI_Type_create_resized(MPI_SHORT, lb, ext, &dtWHoles);
// commit the datatype
MPI_Type_commit(&dtWHoles);
// open the file for writing
MPI_File fh;
MPI_File_open(MPI_COMM_WORLD, "testwrite.dat", MPI_MODE_WRONLY | MPI_MODE_CREATE, MPI_INFO_NULL, &fh);
// set the file view
MPI_File_set_view(fh, 0, MPI_SHORT, dtWHoles, "native", MPI_INFO_NULL);
// here we would do some writing
// close the file
MPI_File_close(&fh);
// clean up
MPI_Type_free(&dtWHoles);
MPI_Finalize();
}
MPI_LB and MPI_UB is what you're looking for. Or better, for MPI-2
compliant libraries such as Open MPI and MPICH2, you can use
MPI_Type_create_resized. This will allow you to create the gap at the
beginning and/or the end of a data-type description.
george.
On Jul 10, 2007, at 10:53 AM, jody wrote:
> hi
> I want to create datatypes of the form
> XX000000...
> 00XX0000...
> 0000XX00...
> etc.
>
> I tried MPI_Type_indexed(1, ais, ait, MPI_SHORT, &dtNewType)
> where ais= {2} and ait = {2} but this only gives me a datatype of
> the form
> 00XX, i.e. no holes at the end.
>
> I guess MPI_Type_vector won't work, because there seems to be
> no way to create holes at the beginning of the datatype
>
>
> I need these datatypes to let each process write its data into the
> file
> in the following way:
> XXYYZZXXYYZZXXYYZZ....
> (X is data from proc 0, Y is data from proc 1, Z is data from proc 2)
>
> My intended approach was to define datatypes of the form XX0000,
> 00XX00, 0000XX
> for the respective processors, and then call MPI_File_set_view
> with displacement 0 and the respective datatypes fo the "filetype"
> parameter,
> and finally let each processor write its stuff to file
> sequentially using MPI_File_write.
>
> However, my plan failed since i am unable to create datatypes with
> holes in front and at the end.
>
> What function should i use to create the desired datatypes?
>
> Thank You
>
> Jody
> _______________________________________________
> users mailing list
> users@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users
_______________________________________________
users mailing list
users@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users