我正在开发一个程序,用高斯消元法求解方程Ax = B.我有一个文件,其中我存储了一个double类型的矩阵(因为使用C,所以行主要顺序)。我正在尝试使用MPI提供的并行文件I / O函数并行读取文件。
我已经了解了MPI_File_set_view
以及它如何对共享文件进行逻辑分区,以便每个进程具有不同的文件视图。我也理解视图必须包含etype
,filetype
和位移。现在在我的情况下,我必须有一个循环行分布,为此,我有以下代码:
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?任何帮助将不胜感激。
感谢。
答案 0 :(得分:0)
etype
和ftype
仍然让我失望,我已经和MPI-IO合作了15年。这个概念并不是那么难,但由于某些原因,命名惯例并不适合我。
etype
或“基本类型”设置各种计数的基本单位。当您致电MPI_File_read_at_all
并提供偏移时,该偏移量为etype
。不是字节。
有两种方法可以读取文件的特定区域:您可以调整每个进程的文件视图以从您想要的位置开始,或者您可以使用显式偏移例程(例如MPI_File_read_at_all
)。如果要为每个进程构建文件视图,甚至可能不需要担心etype:将其设置为MPI_BYTE。