MPI I / O与用户定义的数据类型一起使用

时间:2019-03-04 16:47:15

标签: c mpi custom-data-type mpi-io

我应该第一次使用MPI I/O功能,以便在磁盘上写入一些数据,但是我有一些疑问。

我已经阅读了很多关于它的内容,但是我仍然不知道如何将它与用户定义的MPI_Datatype一起使用。 特别是我不明白如何将etypedisplacementcounts与我已经定义的类型相关联。

此外,我不明白collective callindependent call之间有什么区别。

有人可以向我解释吗?

我在这里发布我的MPI_Datatype。我用它来生成要通过Alltoallw传播的任何尺寸的3D子阵列。希望能帮上忙

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]);
}

0 个答案:

没有答案