MPI_Bcast 广播向量

9 篇文章 0 订阅

#include <mpi.h>
#include<vector>

void t12(int argumentcount, char* argumentvector[]) {

    int myid, numprocs;
	int namelen;

	char processor_name[MPI_MAX_PROCESSOR_NAME];
	MPI_Init(&argumentcount, &argumentvector);
	MPI_Comm_rank(MPI_COMM_WORLD, &myid);
	MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
	MPI_Get_processor_name(processor_name, &namelen);
	MPI_Status status;

	std::vector<int> vec;
    int vec_size;
	if (myid == 0) {
        vec = { 1, 2 }; //进程0赋值
        vec_size = vec.size();
    }
    
    MPI_Bcast(&vec_size, 1 * sizeof(int), MPI_BYTE, 0, MPI_COMM_WORLD);
	if (myid > 0)
		vec.resize(vec_size);
	MPI_Bcast(vec.data(), 
              vec.size() * sizeof(int),
              MPI_BYTE, 
              0,                
              MPI_COMM_WORLD);
      
}

这是一重向量

下面是2重向量


#include <mpi.h>
#include<vector>
#include<iostream>

void t2(int argumentcount, char* argumentvector[]) {
	int myid, numprocs;
	int namelen;

	char processor_name[MPI_MAX_PROCESSOR_NAME];
	MPI_Init(&argumentcount, &argumentvector);
	MPI_Comm_rank(MPI_COMM_WORLD, &myid);
	MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
	MPI_Get_processor_name(processor_name, &namelen);
	MPI_Status status;

	std::vector<std::vector<int>> inds;
	int inds_size;
	std::vector<int> inds_i_size;
	if (myid == 0) {
        //在进程0里获取inds
		for (int i1 = 0; i1 < 2; ++i1) {
			for (int i3 = 0; i3 < 4; ++i3) {
				std::vector<int> ind{ i1, i3 };
				inds.emplace_back(ind);
			}
		}
		inds_size = inds.size();
		inds_i_size.resize(inds.size());
		for (int i = 0; i < inds.size(); ++i) {
			inds_i_size[i] = inds[i].size();
			for (int j = 0; j < inds[i].size(); ++j) {
				std::cout << "inds[" << i << "][" << j << "]=" << inds[i][j] << ", ";
			}
			std::cout << std::endl;
		}
	}
	MPI_Bcast(&inds_size, 1 * sizeof(int), MPI_BYTE, 0, MPI_COMM_WORLD);
    //先广播inds的外层的大小
	if (myid > 0)
		inds_i_size.resize(inds_size);
    //再广播inds的内层的向量的大小
	MPI_Bcast(inds_i_size.data(), inds_i_size.size() * sizeof(int), MPI_BYTE, 0,                     
              MPI_COMM_WORLD);
    //然后在其他进程里开辟外层向量的空间大小,然后再开辟内层的向量的空间
	if (myid > 0) {
		inds.resize(inds_size);
		for (int i = 0; i < inds.size(); ++i)
			inds[i].resize(inds_i_size[i]);
	}
    //然后在其他进程里广播内层向量
	for (int i = 0; i < inds.size(); ++i) {
		MPI_Bcast(inds[i].data(), inds[i].size() * sizeof(int), MPI_BYTE, 0, 
        MPI_COMM_WORLD);
	}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
if(my_rank==0) { fdA=fopen("dataIn.txt","r"); fscanf(fdA,"%d %d",&size,&N); if(size !=N-1) { printf("the input is wrong\n"); exit(1); } A=(float*)malloc(floatsize*size*size); B=(float*)malloc(floatsize*size); V=(float*)malloc(floatsize*size); for(i=0;i<size;i++) { for(j=0;j<size;j++) fscanf(fdA,"%f",A+i*size+j); fscanf(fdA,"%f",B+i); } for(i=0;i<size;i++) fscanf(fdA,"%f",V+i); fclose(fdA); printf("input of file\"dataIn.txt\"\n"); printf("%d\t%d\n",size,N); for(i=0;i<size;i++) { for(j=0;j<size;j++) printf("%f\t",A(i,j)); printf("%f\n",B(i)); } printf("\n"); for(i=0;i<size;i++) printf("%f\t",V(i)); printf("\n\n"); printf("\nOutput of result"); } MPI_Bcast(&size,1,MPI_INT,0,MPI_COMM_WORLD); m=size/p;if(size%p!=0)m++; v=(float*)malloc(floatsize*size); a=(float*)malloc(floatsize*m*size); b=(float*)malloc(floatsize*m); sum=(float*)malloc(floatsize*m); if(a==NULL||b==NULL||v==NULL) printf("allocate space fail!"); if(my_rank==0) { for(i=0;i<size;i++) v(i)=V(i); } MPI_Bcast(v,size,MPI_FLOAT,0,MPI_COMM_WORLD); if(my_rank==0) { for(i=0;i<m;i++) for(j=0;j<size;j++) a(i,j)=A(i,j); for(i=0;i<m;i++) b(i)=B(i); for(i=1;i<p;i++) { MPI_Send(&(A(m*i,0)),m*size,MPI_FLOAT,i,i,MPI_COMM_WORLD); MPI_Send(&(B(m*i)),m,MPI_FLOAT,i,i,MPI_COMM_WORLD); } free(A);free(B);free(V); } else { MPI_Recv(a,m*size,MPI_FLOAT,0,my_rank,MPI_COMM_WORLD,&status); MPI_Recv(b,m,MPI_FLOAT,0,my_rank,MPI_COMM_WORLD,&status); } for(i=0;i<m;i++) { sum[i]=0.0; for(j=0;j<size;j++) if(j>(my_rank*m+i)) sum[i]=sum[i]+a(i,j)*v(j); } while(total<size) { iteration=0; total=0; for(j=0;j<size;j++) { r=j%m;q=j/m; if(my_rank==q) { temp=v(my_rank*m+r); for(i=0;i<r;i++) sum[r]=sum[r]+a(r,my_rank*m+i)*v(my_rank*m+i); v(my_rank*m+r)=(b(r)-sum[r])/a(r,my_rank*m+r); if(fabs(v(my_rank*m+r)-temp)<E) iteration++; MPI_Bcast(&v(my_rank*m+r),1,MPI_FLOAT,my_rank,MPI_COMM_WORLD); sum[r]=0.0; for(i=0;i<r;i++) sum[i]=sum[i]+a(i,my_rank*m+r)*v(my_rank*m+r); } else { MPI_Bcast(&v(q*m+r),1,MPI_FLOAT,q,MPI_COMM_WORLD); for(i=0;i<m;i++) sum[i]=sum[i]+a(i,q*m+r)*v(q*m+r); } } MPI_Allreduce(&iteration,&total,1,MPI_FLOAT,MPI_SUM,MPI_COMM_WORLD); loop++; if(my_rank==0) printf("in the %d times total vaule=%d\n",loop,total); } if(my_rank==0) { for(i=0;i<size;i++) printf("x[%d]=%f\n",i,v(i)); printf("\n"); } printf("Iteration num=%a\n",loop); MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); Environment_Finalize(a,b,v); return 0; }
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值