首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用MPI_File_open替换MPI中的现有文件

如何用MPI_File_open替换MPI中的现有文件
EN

Stack Overflow用户
提问于 2014-08-25 08:14:10
回答 1查看 1.3K关注 0票数 4

我正在阅读“使用MPI-2”,并尝试自己执行代码。我为MPI_MODE_CREATE指定了MPI_File_open,但实际上它并没有创建一个新文件,而是用相同的名称覆盖了前面的文件。当第一次使用更多的进程运行,然后以较少的进程运行时,我碰巧发现了这一点。我的MPI版本是openmpi 1.8.1。

这是代码

代码语言:javascript
复制
#include <stdio.h>
#include <mpi.h>
#define BUFSIZE 4
int main(int argc, char **argv)
{
    int map[BUFSIZE], i, rank , size;
    char buf[BUFSIZE];
    MPI_File fh;
    MPI_Datatype filetype;
    MPI_Status status;
    MPI_Offset disp=0;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    for(i=0;i<BUFSIZE;i++)
    {
//      buf[i]=size*i+rank+'0';
        buf[i]=size*i+rank+'A';
        map[i]=size*i+rank;
    }
    MPI_File_open(MPI_COMM_WORLD, "datafile4", MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
    MPI_Type_create_indexed_block(BUFSIZE, 1, map, MPI_CHAR, &filetype);
    MPI_Type_commit(&filetype);
    MPI_File_set_view(fh, disp, MPI_CHAR, filetype, "native", MPI_INFO_NULL);
    MPI_File_write_all(fh, buf, BUFSIZE, MPI_CHAR, &status);
    MPI_File_close(&fh);
    MPI_Type_free(&filetype);
    MPI_Finalize();
    return 0;
}

下面是我与6个进程一起运行时的文件内容

代码语言:javascript
复制
ABCDEFGHIJKLMNOPQRSTUVWX

然后我修改了一下。替身

代码语言:javascript
复制
buf[i]=size*i+rank+'A';

使用

代码语言:javascript
复制
buf[i]=size*i+rank+'0';

并与两个进程一起运行,文件如下

代码语言:javascript
复制
01234567IJKLMNOPQRSTUVWX
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-25 16:19:09

这是正确的行为-- MPI_MODE_CREATE "如果文件不存在,则创建该文件。",如果有,就没有效果;正如文档所述,与相应的POSIX CREAT完全一样。

无论出于什么原因,都没有一个与MPI_MODE_*等价的O_TRUNC,如果文件已经存在,就会关闭它;为此,您必须用MPI_MODE_CREATE|MPI_MODE_EXCL打开,检查打开是否失败,如果是,删除文件并重复(或者用MPI_MODE_DELETE_ON_CLOSE打开它,关闭它,然后重新打开它)

将其编码为两种方式:

代码语言:javascript
复制
#include <stdio.h>
#include <mpi.h>
#define BUFSIZE 4
int main(int argc, char **argv)
{
    int map[BUFSIZE], i, rank , size;
    char buf[BUFSIZE];
    MPI_File fh;
    MPI_Datatype filetype;
    MPI_Status status;
    MPI_Offset disp=0;

    if (argc != 3) {
        fprintf(stderr,"Usage: %s letters|numbers test|delete|none\n", argv[0]);
        exit(-1);
    }

    int letters=0;
    if (!strcasecmp(argv[1],"letters"))
        letters = 1;

    int test=0;
    if (!strcasecmp(argv[2],"test"))
        test = 1;
    int delete = 0;
    if (!strcasecmp(argv[2],"delete"))
        delete = 1;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    for(i=0;i<BUFSIZE;i++)
    {
        if (letters)
            buf[i]=size*i+rank+'A';
        else
            buf[i]=size*i+rank+'0';

        map[i]=size*i+rank;
    }

    if (test) {
        int err = MPI_File_open(MPI_COMM_WORLD, "datafile4", MPI_MODE_CREATE|MPI_MODE_EXCL|MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
        if (err != MPI_SUCCESS)  {
            if (rank == 0)
                MPI_File_delete("datafile4",MPI_INFO_NULL);
            MPI_File_open(MPI_COMM_WORLD, "datafile4", MPI_MODE_CREATE|MPI_MODE_EXCL|MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
        }
    } else if (delete) {
        MPI_File_open(MPI_COMM_WORLD, "datafile4", MPI_MODE_CREATE|MPI_MODE_DELETE_ON_CLOSE|MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
        MPI_File_close(&fh);
        MPI_File_open(MPI_COMM_WORLD, "datafile4", MPI_MODE_CREATE|MPI_MODE_EXCL|MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
    } else {
        MPI_File_open(MPI_COMM_WORLD, "datafile4", MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
    }

    MPI_Type_create_indexed_block(BUFSIZE, 1, map, MPI_CHAR, &filetype);
    MPI_Type_commit(&filetype);
    MPI_File_set_view(fh, disp, MPI_CHAR, filetype, "native", MPI_INFO_NULL);
    MPI_File_write_all(fh, buf, BUFSIZE, MPI_CHAR, &status);
    MPI_File_close(&fh);
    MPI_Type_free(&filetype);
    MPI_Finalize();
    return 0;
}

跑步意味着:

代码语言:javascript
复制
# just open CREATE|WRONLY, reproduce result above
$ mpirun -np 6 ./clobber letters none
$ cat datafile4
ABCDEFGHIJKLMNOPQRSTUVWX$
$ mpirun -np 2 ./clobber numbers none
$ cat datafile4
01234567IJKLMNOPQRSTUVWX$ 

# test for failed EXCL open, and if so, remove file:
$ mpirun -np 6 ./clobber letters test
$ cat datafile4
ABCDEFGHIJKLMNOPQRSTUVWX$
$ mpirun -np 2 ./clobber numbers test
$ cat datafile4
01234567$

# or always open delete-on-close, close, then re-open              
$ mpirun -np 6 ./clobber letters delete
$ cat datafile4
ABCDEFGHIJKLMNOPQRSTUVWX$
$ mpirun -np 2 ./clobber numbers delete
$ cat datafile4
01234567$
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25481661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档