写入登录标准(MPI)

时间:2013-07-18 17:15:20

标签: cygwin mpi

我在Windows上使用带有Cygwin的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
我想要每个进程专用的空间日志,我做错了什么? (当我写它时,我认为它不会正常工作......)

1 个答案:

答案 0 :(得分:2)

这与here提出的问题相同;在不同的层上有足够的缓冲,不能保证最终输出将反映各个进程写入的顺序,尽管在实践中它可以用于“足够小”的输出。

但如果目标类似于日志文件,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-----