使用MPI IO并行输出到单个文件

时间:2013-03-21 11:09:59

标签: io parallel-processing mpi output

我有一个非常简单的任务要做,但不知怎的,我仍然被卡住了。

我有一个BIG数据文件(“File_initial.dat”),应由群集上的所有节点读取(使用MPI),每个节点将对此BIG文件的一部分执行一些操作(File_size / number_of_nodes)和最后,每个节点都会将其结果写入一个共享的BIG文件(“File_final.dat”)。文件元素的数量保持不变。

  1. 通过谷歌搜索,我明白,将数据文件写为二进制文件(我在此文件中只有十进制数字)而不是* .txt“文件更好。因为没有人会读取此文件,但只有电脑。

  2. 我试图实现自己(但使用格式化的输出和非二进制文件),但我的行为不正确。

  3. 到目前为止我的代码如下:

    #include <fstream>
    #define NNN 30
    
    int main(int argc, char **argv)
    {   
        ifstream fin;
    
        // setting MPI environment
    
        int rank, nprocs;
        MPI_File file;
        MPI_Init(&argc, &argv);
        MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    
        // reading the initial file
    
        fin.open("initial.txt");
        for (int i=0;i<NNN;i++)
        {  
            fin  >> res[i];
            cout << res[i] << endl; // to see, what I have in the file
        }  
        fin.close();
    
        // starting position in the "res" array as a function of "rank" of process
        int Pstart = (NNN / nprocs) * rank ;
        // specifying Offset for writing to file
        MPI_Offset offset = sizeof(double)*rank;
        MPI_File file;
        MPI_Status status;
    
        // opening one shared file
        MPI_File_open(MPI_COMM_WORLD, "final.txt", MPI_MODE_CREATE|MPI_MODE_WRONLY,
                              MPI_INFO_NULL, &file);
    
        // setting local for each node array
    
        double * localArray;
        localArray = new double [NNN/nprocs];
    
        // Performing some basic manipulation (squaring each element of array)
        for (int i=0;i<(NNN / nprocs);i++)
        {
            localArray[i] = res[Pstart+i]*res[Pstart+i];
        }
    
        // Writing the result of each local array to the shared final file:
    
        MPI_File_seek(file, offset, MPI_SEEK_SET);
        MPI_File_write(file, localArray, sizeof(double), MPI_DOUBLE, &status);
        MPI_File_close(&file);
    
        MPI_Finalize();
    
        return 0;
    }
    

    我明白,在尝试将double写为文本文件时,我做错了。

    如何更改代码以便能够保存

    1. as .txt文件(格式输出)
    2. as .dat file(二进制文件)

1 个答案:

答案 0 :(得分:4)

您的二进制文件输出几乎是正确的;但是您对文件中的偏移量和要写入的数据量的计算是不正确的。您希望偏移量为

MPI_Offset offset = sizeof(double)*Pstart;

不是

MPI_Offset offset = sizeof(double)*rank;

否则你将每个等级覆盖彼此的数据,因为(比如)nprocs=5中的等级3开始在文件中以双倍数3写入,而不是(30/5)* 3 = 18。

此外,您希望每个排名都写NNN/nprocs双打,而不是sizeof(double)双打,这意味着您想要

MPI_File_write(file, localArray, NNN/nprocs, MPI_DOUBLE, &status);

如何写为文本文件是一个更大的问题;你必须在内部将数据转换为字符串,然后输出这些字符串,确保通过仔细格式化知道每行需要多少个字符。这在本网站的this answer中有所描述。