/*
主要功能:
用于解决MPI无法传递类的对象的问题。
*/
#include <stdio.h>
#include <mpi.h>
class Student{
public:
int id;
char *name;
char *addr;
Student(){}
Student(int id,char *name,char *addr){
this->id = id;
this->name = name;
this->addr = addr;
}
void showInfo(int rank){
printf("rank = %d, id=%d,name=%s,addr=%s\n",rank,id,name,addr);
}
};
/*
主要流程:
在根节点内,生成一个类的对象,然后改变其内容,
最后将改变后的类对象广播到通信组的所有节点。
实现步骤:
在每个类中声明与类的属性相对应的临时变量,用于接收根进程分发的数据,
收到数据后,使用临时变量重新构造类的对象。
*/
int main(int argc,char *argv[]){
int rank,nproc;
char *node_name,*node_addr; //声明每个节点的临时变量
int node_id;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&nproc);
int len;
char proc_name[MPI_MAX_PROCESSOR_NAME];
//获取处理器名字
MPI_Get_processor_name(proc_name,&len);
Student *stu;
stu = new Student(10,proc_name,"www.g00gle.com");
stu->showInfo(rank);
//为每个节点的临时变量分配空间
node_name = (char *)malloc(sizeof(char)*20);
node_addr = (char *)malloc(sizeof(char)*20);
if(rank == 0){
stu->name = "zhangsan";
stu->addr = "nowYao";
node_id = stu->id + 1;
strcpy(node_name,stu->name);
strcpy(node_addr,stu->addr);
}
//将更新后的数据广播到所有节点
MPI_Bcast(&node_id,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(node_name,20,MPI_CHAR,0,MPI_COMM_WORLD);
MPI_Bcast(node_addr,20,MPI_CHAR,0,MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
//重新构造新的对象
Student *stu2 = new Student(node_id,node_name,node_addr);
stu2->showInfo(rank);
MPI_Finalize();
return 0;
}
使用MPI传递类的对象
最新推荐文章于 2022-11-19 07:16:15 发布