我试图在文件上写入不同的矩阵,每个矩阵由不同的MPI进程处理,如下图所示,对其内容进行合并:
有什么办法可以使用合适的MPI-View获得所需的输出? 为了帮助回答这个问题,我附上了一个简单的代码 在上一个图像中,白色列也包含在输出文件中。
#include <mpi.h>
#define N 6
int main(int argc, char **argv) {
double A[N*N];
int mpi_rank, mpi_size;
MPI_File file;
MPI_Status status;
MPI_Init(NULL, NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
MPI_File_open(MPI_COMM_WORLD, "test.dat", MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &file);
MPI_Datatype my_type;
MPI_Type_vector(N, N, N*mpi_size, MPI_DOUBLE, &my_type);
MPI_Type_commit(&my_type);
MPI_Offset disp = mpi_rank*N*sizeof(double);
MPI_File_set_view(file, disp, MPI_DOUBLE, arr_type, "native", MPI_INFO_NULL);
MPI_Datatype row_type;
MPI_Type_contiguous(N, MPI_DOUBLE, &row_type);
MPI_Type_commit(&row_type);
MPI_File_write(file, A, N, row_type, &status);
MPI_File_close(&file);
MPI_Finalize();
return 0;
}
答案 0 :(得分:1)
我很欣赏你的行业重新发明MPI_TYPE_SUBARRAY,但你肯定可以这样做而不是创建重叠矢量?
你是如此亲密。为了省略输出中的ghost单元格,我只想定义一个不描述它们的子数组内存类型。
我认为可以用N-1代替N来完成矢量块长度...但只需使用子阵列并使其更清晰。很久以前,像这样的矢量确实是惯用的MPI,但MPI-2在1995年引入了子阵列类型,所以我认为你可以使用这个&#34; newfangled&#34;特征
您确实可以使用offset参数移动文件视图。您也可以让每个文件从偏移0开始,而不是改变子文件中的参数。所有过程都将具有相同的&#34;全局数组&#34;值。你可以为每个处理器调整start []和可能的count []。