我应该第一次使用MPI I/O
功能,以便在磁盘上写入一些数据,但是我有一些疑问。
我已经阅读了很多关于它的内容,但是我仍然不知道如何将它与用户定义的MPI_Datatype
一起使用。
特别是我不明白如何将etype
,displacement
和counts
与我已经定义的类型相关联。
此外,我不明白collective call
和independent 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]);
}