并行读取存储在文件中的nxn矩阵

时间:2016-11-13 04:11:45

标签: file parallel-processing mpi

我正在开发一个程序,用高斯消元法求解方程Ax = B.我有一个文件,其中我存储了一个double类型的矩阵(因为使用C,所以行主要顺序)。我正在尝试使用MPI提供的并行文件I / O函数并行读取文件。

我已经了解了MPI_File_set_view以及它如何对共享文件进行逻辑分区,以便每个进程具有不同的文件视图。我也理解视图必须包含etypefiletype和位移。现在在我的情况下,我必须有一个循环行分布,为此,我有以下代码:

int count, blksize, stride,lb,extent;
    MPI_File fh;
    MPI_Offset of;
    /* Define types for etype, ftype
      etype: Type of data stored in the file. 
      ftype: Description of HOW the data is stored in the file.
       */
    MPI_Datatype etype, ftype,mpi_vect;
    /* etype:

     */
    count = (n + (size -1))/size; blksize = n;
    stride = size;
    lb = 0; extent = n*sizeof(double);
    MPI_Type_vector(count,blksize,stride,MPI_DOUBLE,&mpi_vect);
    MPI_Type_create_resized(mpi_vect,lb,extent,&etype);
    MPI_Type_commit(&etype);    

    /* ftype: Describes the logical division of file.
      A strided vector of blocksize 1 and count n/size.
      Stride is size
    */
     MPI_Type_vector(count,1,stride, MPI_DOUBLE, &ftype);
     MPI_Type_commit(&ftype);
    MPI_File_open(MPI_COMM_WORLD,filename,MPI_MODE_RDONLY,MPI_INFO_NULL,&fh);
    MPI_File_set_view(fh,0,etype,ftype,native,MPI_INFO_NULL);
    /* Assume buf is allocated as an mpi_vector with blocksize equal to row size and stride equal to number of processors */
    MPI_File_read(fh,buf,count,mpi_vec,MPI_STATUS_IGNORE);

我的问题是,如何确定正确的etype和ftype?任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:0)

etypeftype仍然让我失望,我已经和MPI-IO合作了15年。这个概念并不是那么难,但由于某些原因,命名惯例并不适合我。

etype或“基本类型”设置各种计数的基本单位。当您致电MPI_File_read_at_all并提供偏移时,该偏移量为etype。不是字节。

有两种方法可以读取文件的特定区域:您可以调整每个进程的文件视图以从您想要的位置开始,或者您可以使用显式偏移例程(例如MPI_File_read_at_all)。如果要为每个进程构建文件视图,甚至可能不需要担心etype:将其设置为MPI_BYTE。