mpi矩阵转置

本文详细解析使用MPI进行矩阵转置的过程,特别是针对MPI_Type_hvector与MPI_Type_vector的区别进行了说明,并通过具体代码示例展示了如何正确配置数据类型。

 

下面程序中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();



}


 

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值