首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在简单MPI代码中读写测试文件时出错

在简单MPI代码中读写测试文件时出错
EN

Stack Overflow用户
提问于 2011-09-30 06:05:42
回答 3查看 2.9K关注 0票数 2

我有一个MPI代码,其中进程读取二进制文件并将其重新写回。数据的分布方式是,进程0读取(然后写入)文件的前半部分,而进程1读取(然后写入)文件的后半部分。现在的问题是输入和输出文件不匹配(diff表明它们不同)。如果只有一个进程,则一切正常。有人能指出哪里出了问题吗?

使用OpenMPI,编译为: mpicc -Wall test_mpi.c -o test_mpi

运行方式: mpirun 2./ -np _mpi

提前谢谢。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

int main(int argc, char** argv) {

    int rank, np, i;  //np = no. of processes
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &np);

    int filesize = 48*1048576;  //input filesize 48MB

    double *data = (double*) malloc (filesize/np);
    FILE* fpa;
    fpa = fopen ( "512_featurevec.out", "rb");
    fseek(fpa, filesize/np*rank, SEEK_SET);
    printf("read: %d\n", (int)fread(&data[0], sizeof(double), filesize/(np*sizeof(double)), fpa));
    fclose(fpa);

    char* outfile = "outfile.txt";
    for(i=0; i<np; i++) {
        if(rank == i) {
            fpa = fopen ( outfile, "ab");
            fseek(fpa, filesize/np*rank, SEEK_SET);
            fwrite ( &data[0], sizeof(double), filesize/(np*sizeof(double)), fpa);
            fclose ( fpa );
        }   
    }   

    free(data);
    MPI_Finalize();
    exit(0);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-01 02:03:38

回答我自己的问题,但这是有效的:

代码语言:javascript
复制
char* outfile = "outfile.txt";
    for(i=0; i<np; i++) {
        if(rank == i) {
            fpa = fopen ( outfile, "ab");
            fseek(fpa, filesize/np*rank, SEEK_SET);
            fwrite ( &data[0], sizeof(double), filesize/(np*sizeof(double)), fpa);
            fclose ( fpa );
        } 
        MPI_Barrier(comm);  
    } 

出于某种原因,如果proc 1在proc 0之前到达,并将一个空文件查找到某个值,它会将文件指针定位到正确的偏移量(由ftell验证),但仅从偏移量0开始写入。(我肯定做错了什么,但不管怎样)。

票数 0
EN

Stack Overflow用户

发布于 2011-09-30 07:09:27

看起来这个问题是由于每个孩子都在打开文件进行写入,这导致了争用。

尝试让文件名取决于等级(例如,写入out file.txt.(rank)并查看是否所有输出都匹配)。

票数 3
EN

Stack Overflow用户

发布于 2011-10-01 04:56:30

如果您已经在使用MPI,并且不厌其烦地使用seek对文件进行分区,而不是使用POSIX,我建议您使用MPI-IO (作为MPI2的标准部分,大约1996年左右):

  • http://www.mhpcc.edu/training/workshop2/mpi_io/MAIN.html
  • http://beige.ucs.indiana.edu/B673/node179.html

在我们的中心,我们有这个的第一部分,我认为这是非常好的:

上面代码的MPI-IOed版本如下:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

int main(int argc, char** argv) {

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

    const int filesize = 48*1048576;  //input filesize 48MB
    const int ndoubles = filesize/(sizeof(double)*np);
    double *localdata = malloc(ndoubles*sizeof(double));

    /* create a type which describes our view of the file --
     * in particular, just our subarray of the global array
     */
    int globalsizes[1] = {filesize};
    int localsizes[1] = {ndoubles};
    int starts[1] = {ndoubles*rank};

    MPI_Datatype fileview;
    MPI_Type_create_subarray(1, globalsizes, localsizes, starts, MPI_ORDER_C, MPI_DOUBLE, &fileview);
    MPI_Type_commit(&fileview);

    /* read in only our data */
    MPI_File fpa;
    MPI_Status status;
    MPI_File_open(MPI_COMM_WORLD, "512_featurevec.out", MPI_MODE_RDONLY, MPI_INFO_NULL, &fpa);

    /* note could use MPI_File_seek instead of file set view */
    MPI_File_set_view(fpa, (MPI_Offset)0, MPI_DOUBLE, fileview, "native", MPI_INFO_NULL);
    MPI_File_read_all(fpa, localdata, ndoubles, MPI_DOUBLE, &status);
    MPI_File_close(&fpa);

    /* write out data - it will have same layout, we're just writing instead of erading*/

    MPI_File_open(MPI_COMM_WORLD, "output.dat", MPI_MODE_WRONLY|MPI_MODE_CREATE, MPI_INFO_NULL, &fpa);

    /* note could use MPI_File_seek instead of file set view */
    MPI_File_set_view(fpa, (MPI_Offset)0, MPI_DOUBLE, fileview, "native", MPI_INFO_NULL);
    MPI_File_write_all(fpa, localdata, ndoubles, MPI_DOUBLE, &status);
    MPI_File_close(&fpa);

    free(localdata);
    MPI_Type_free(&fileview);
    MPI_Finalize();

    return 0;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7603916

复制
相关文章

相似问题

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