2

我在带有 Cygwin 的 Windows 上使用 MPI。我尝试使用临界区来写一些日志,但我不会做的总是得到一个混合日志。

setbuf(stdout, 0);
int totalProcess;
MPI_Comm_size(MPI_COMM_WORLD, &totalProcess);
int processRank;
MPI_Comm_rank(MPI_COMM_WORLD, &processRank);
int rank = 0;
while (rank < totalProcess) {
   if (processRank == rank) {
       printf("-----%d-----\n", rank);
       printf("%s", logBuffer);
       printf("-----%d-----\n", rank);
       //fflush(stdout);
   }
   rank ++;
   MPI_Barrier(MPI_COMM_WORLD);
}

我在单机上运行 mpi(仿真模式):
mpirun -v -np 2 ./bin/main.out
我想要每个进程的专用空间日志,我做错了什么?
(当我写它时,我认为它不能正常工作......)

4

1 回答 1

2

这是这里问的同样的问题;在各个不同的层都有足够的缓冲,因此无法保证最终输出将反映各个进程写入的顺序,尽管实际上它可以用于“足够小”的输出。

但是,如果目标是类似于日志文件的东西,MPI-IO 提供机制让您以完全这样的方式写入文件 - MPI_File_write_ordered,它按照处理器的顺序将输出写入文件。举个例子:

#include <string.h>
#include <stdio.h>
#include "mpi.h"

int main(int argc, char** argv)
{
    int rank, size;
    MPI_File logfile;

    char mylogbuffer[1024];
    char line[128];

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);


    MPI_File_open(MPI_COMM_WORLD, "logfile.txt", MPI_MODE_WRONLY | MPI_MODE_CREATE,
                   MPI_INFO_NULL, &logfile);

    /* write initial message */

    sprintf(mylogbuffer,"-----%d-----\n", rank);
    sprintf(line,"Message from proc %d\n", rank);

    for (int i=0; i<rank; i++)
        strcat(mylogbuffer, line);

    sprintf(line,"-----%d-----\n", rank);
    strcat(mylogbuffer, line);

    MPI_File_write_ordered(logfile, mylogbuffer, strlen(mylogbuffer), MPI_CHAR, MPI_STATUS_IGNORE);

    /* write another message */

    sprintf(mylogbuffer,"-----%d-----\nAll done\n-----%d-----\n", rank, rank);
    MPI_File_write_ordered(logfile, mylogbuffer, strlen(mylogbuffer), MPI_CHAR, MPI_STATUS_IGNORE);

    MPI_File_close(&logfile);

    MPI_Finalize();
    return 0;
}

编译和运行给出:

$ mpicc -o log log.c -std=c99 
$ mpirun -np 5 ./log
$ cat logfile.txt    
-----0-----
-----0-----
-----1-----
Message from proc 1
-----1-----
-----2-----
Message from proc 2
Message from proc 2
-----2-----
-----3-----
Message from proc 3
Message from proc 3
Message from proc 3
-----3-----
-----4-----
Message from proc 4
Message from proc 4
Message from proc 4
Message from proc 4
-----4-----
-----0-----
All done
-----0-----
-----1-----
All done
-----1-----
-----2-----
All done
-----2-----
-----3-----
All done
-----3-----
-----4-----
All done
-----4-----
于 2013-07-18T21:00:27.670 回答