mpi矩阵转置

 

下面程序中MPI_Type_hvector改为MPI_Type_vector 就错了,我以为是这样的,因为这时是用的新类型stype构造ntype。stype为矩阵的一列数据的类型。ntype为整个转置后的矩阵类型。

MPI_Type_vector第三个参数stride代表的是number of elements between start of each block (integer) 。

而这时的数据类型是stype,不是MPI_INT,两者之间隔的元素个数自然不是1了。而MPI_Type_hvector

stride 为 number of bytes between start of each block (integer) ,自然没问题了。

 

 

//转置
//默认运行进程数为2

#include "mpi.h"
#include<stdio.h>

int main(int argc,char **argv){
	int rows=6,cols=5;
	int tag=0;
	MPI_Init(&argc,&argv);
	int rank;
	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
	int A[rows][cols];
	int B[cols][rows];
	MPI_Datatype stype,ntype;
	MPI_Type_vector(rows,1,cols,MPI_INT,&stype);
	//MPI_Type_vector(cols,1,1,stype,&ntype);
	MPI_Type_hvector(cols,1,sizeof(int),stype,&ntype);
	MPI_Type_commit(&ntype);
	MPI_Status sta;

	if(rank==0){
		for(int i=0;i<rows;i++){
			for(int j=0;j<cols;j++){
			A[i][j]=i*cols+j;
			printf("%d ",A[i][j]);
			}
		printf("\n");
		}
		printf("\n");
		MPI_Send(A,1,ntype,1,tag,MPI_COMM_WORLD);
	}
	else{
		MPI_Recv(B,rows*cols,MPI_INT,0,tag,MPI_COMM_WORLD,&sta);
		for(int i=0;i<cols;i++){
			for(int j=0;j<rows;j++)
				printf("%d ",B[i][j]);
			printf("\n");
		}
	}
	MPI_Type_free(&ntype);
	MPI_Finalize();



}


 

你可能感兴趣的:(vector,Integer,each)