Использование ввода-вывода MPI с пользовательским типом данных - PullRequest
0 голосов
/ 04 марта 2019

Я должен впервые использовать функциональные возможности 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]);
}
...