我正在运行具有数千个 MPI 进程的模拟,并且需要将输出数据写入一小组文件。例如,即使我可能有 10,000 个进程,我只想写出 10 个文件,每个文件写入 1,000 个(在某个适当的偏移量处)。AFAIK 正确的方法是为将写入相同文件的进程组创建一个新的通信器,使用 为该通信器打开一个共享文件,MPI_File_open()
然后使用MPI_File_write_at_all()
. 那是对的吗?以下代码是我编写的一个玩具示例:
#include <mpi.h>
#include <math.h>
#include <stdio.h>
const int MAX_NUM_FILES = 4;
int main(){
MPI_Init(NULL, NULL);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int numProcs;
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
int numProcsPerFile = ceil(((double) numProcs) / MAX_NUM_FILES);
int targetFile = rank / numProcsPerFile;
MPI_Comm fileComm;
MPI_Comm_split(MPI_COMM_WORLD, targetFile, rank, &fileComm);
int targetFileRank;
MPI_Comm_rank(fileComm, &targetFileRank);
char filename[20]; // Sufficient for testing purposes
snprintf(filename, 20, "out_%d.dat", targetFile);
printf(
"Proc %d: writing to file %s with rank %d\n", rank, filename,
targetFileRank);
MPI_File outFile;
MPI_File_open(
fileComm, filename, MPI_MODE_CREATE | MPI_MODE_WRONLY,
MPI_INFO_NULL, &outFile);
char bufToWrite[4];
snprintf(bufToWrite, 4, "%3d", rank);
MPI_File_write_at_all(
outFile, targetFileRank * 3,
bufToWrite, 3, MPI_CHAR, MPI_STATUS_IGNORE);
MPI_File_close(&outFile);
MPI_Finalize();
}
我可以使用 编译mpicc file.c -lm
并运行 20 个进程mpirun -np 20 a.out
,并且我得到了预期的输出(四个文件,每个文件有五个条目),但我不确定这是否是技术上正确/最优化的方法。有什么我应该做的不同的事情吗?