我有一个MPI代码,其中进程读取二进制文件,然后再次写回。数据的分发方式是进程0读取(然后写入)文件的前半部分,而进程1读取(然后写入)文件的后半部分。现在的问题是输入文件和输出文件不匹配(差异显示它们不同)。如果只有一个进程,则一切正常。有人可以指出出什么问题了吗?

使用OpenMPI,编译为:mpicc -Wall test_mpi.c -o test_mpi
运行方式:mpirun -np 2 ./test_mpi

提前致谢。

#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);
}

最佳答案

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

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

关于c - 用简单的MPI代码读取和写入测试文件时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7603916/

10-11 22:59
查看更多