Я должен впервые использовать функциональные возможности MPI I/O
, чтобы записать на диск некоторые данные, но у меня есть некоторые вопросы.
Я много об этом читал, но все еще не могу понятькак использовать его с пользователем MPI_Datatype
.В частности, я не понимаю, как соотнести etype
, displacement
и counts
с моим уже определенным типом.
Более того, я не понимаю, в чем разница между collective call
иindependent call
.
Может кто-нибудь объяснить мне их, пожалуйста?
Я публикую здесь свой MPI_Datatype
.Я использую его для создания трехмерных подмассивов любых размеров, которые будут распространяться через Alltoallw
.Я надеюсь, что может помочь
int *contiguous_x = (int *) malloc(sizeof(int)*size);
int *contiguous_y = (int *) malloc(sizeof(int)*size);
int *sendcounts = (int *) malloc(sizeof(int)*size);
int *senddispls = (int *) malloc(sizeof(int)*size);
int *recvdispls = (int *) malloc(sizeof(int)*size);
int *recvcounts = (int *) malloc(sizeof(int)*size);
if (( contiguous_x||contiguous_y||senddispls||sendcounts||recvdispls||recvcounts ) == NULL) {
perror(".:Error while allocating memory for Alltoallw parameters:.\n");
abort();
}
MPI_Datatype recvtype[size];
contiguous_y[rank] = (in_jhi-in_jlo+1);
contiguous_x[rank] = (in_ihi-in_ilo+1);
for (int i = 0; i < size; i++){
sendcounts[i] = 0; recvdispls[i] = 0; recvcounts[i] = 0; recvtype[i] = MPI_DOUBLE;
}
if (rank == 0) {
for (int i = 0; i < size; i++){
sendcounts[i] = 1;
}
}
senddispls[rank] = (2*nz*in_ilo + 2*nz*nx*in_jlo )*sizeof(double);
recvcounts[0] = 2*nz*(in_jhi-in_jlo+1)*(in_ihi-in_ilo+1);
//printf("RECV COUNTS %d\n", recvcounts[0]);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Allgather(&contiguous_y[rank],1,MPI_INT,contiguous_y,1,MPI_INT, MPI_COMM_WORLD);
MPI_Allgather(&contiguous_x[rank],1,MPI_INT,contiguous_x,1,MPI_INT, MPI_COMM_WORLD);
MPI_Allgather(&senddispls[rank],1,MPI_INT,senddispls,1,MPI_INT, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Datatype vector[size], contiguous[size];
int bytes_stride = sizeof(double)*2*nz*nx;
for (int i = 0; i < size; i++) {
MPI_Type_contiguous(2*nz*contiguous_x[i], MPI_DOUBLE, &contiguous[i]);
MPI_Type_create_hvector(contiguous_y[i], 1, bytes_stride, contiguous[i], &vector[i]);
MPI_Type_commit(&vector[i]);
}