【发布时间】:2017-10-12 03:35:03
【问题描述】:
我正在做一个大学作业,其中有一个问题是使用单列策略进行矩阵向量乘法,基本上每个进程都会得到矩阵的一列 - 我们称之为 A - ,因为矩阵 -向量定义每个进程都获得向量的一个元素-我们称之为x-,这是我拥有的函数:
double *mpiSingleColumn(const double *A,const double *x,const int size,const int rank){
double *col=calloc(size,sizeof(double)),xi=0.0,*cols=calloc(size,sizeof(double)),*y=NULL;
MPI_Request request;
MPI_Iscatter(x,1,MPI_DOUBLE,&xi,1,MPI_DOUBLE,0,MPI_COMM_WORLD,&request);
MPI_Datatype vectype,resizedvectype;
MPI_Type_vector(size,1,size,MPI_DOUBLE,&vectype);
MPI_Type_commit(&vectype);
MPI_Type_create_resized(vectype,0,sizeof(double),&resizedvectype);
MPI_Type_commit(&resizedvectype);
MPI_Scatter(A,1,resizedvectype,col,size,MPI_DOUBLE,0,MPI_COMM_WORLD);
MPI_Type_free(&vectype);
MPI_Type_free(&resizedvectype);
MPI_Wait(&request,MPI_STATUS_IGNORE);
for(int i=0;i<size;i++)
cols[i]=xi*col[i];
free(col);
if(rank==0)
y=calloc(size,sizeof(double));
MPI_Reduce(cols,y,size,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
free(cols);
return y;
}
A 是矩阵,x 是向量,size 是 A 的维度,它等于 x 的大小,对于这个问题等于进程数,rank 是进程的等级。
上述功能完美运行并产生所需的结果。但是,现在我将x 和A 分散在两条消息中,我希望(如果可能的话)将它们分散在一个中,是的,我知道第一个分散是异步的,但它仍然是一条消息.
我想到了派生类型,特别是MPI_Type_create_struct,但是当我有一个我没有的结构数组时,它会起作用。
我还研究了MPI_Scatterv,它也适用于一个数组,我研究了MPI_Pack,这似乎与我想要的最接近,但我不知道如何将它与Scatter ,不过我知道怎么写Send。
我知道 MPI-2 RMA 和 MPI-3 共享内存,但我想知道是否有办法以消息传递方式进行。
那么怎么做(如果可能的话)?
顺便解释一下上面的函数,每一列都乘以x[i],其中i是列数,然后将结果列相加,如果你做数学你会发现结果确实是@ 987654339@ :) .
【问题讨论】:
-
附带说明,您确实不需要需要
MPI_Type_commit(&vectype);