mpi独立进程间的通信无法实现

客户端检测不到服务端发布的服务名
源代码:
客户端程序:
#include
#include
#include
#include

int main(int argc, wchar_t **argv)
{
int errs = 0;
wchar_t port_name[MPI_MAX_PORT_NAME], port_name_out[MPI_MAX_PORT_NAME];
wchar_t serv_name[256];
int merr, mclass;
wchar_t errmsg[MPI_MAX_ERROR_STRING];
char outstr[1024];
char sb[1024];
char rb[1024];
int msglen;
MPI_Status stat;
int rank, newrank, flag;
MPI_Comm newcomm;

MPI_Init(&argc, &argv);

flag = 123; 
wcscpy_s(serv_name, L"MyTest");

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Barrier(MPI_COMM_WORLD);
merr = MPI_Lookup_name(serv_name, MPI_INFO_NULL, port_name_out);
if (merr)
{
    errs++;
    MPI_Error_string(merr, errmsg, &msglen);
    printf("Error in Lookup name:\"%ls\"\n", errmsg);
    fflush(stdout);
}
else
{
    sprintf_s(outstr, "rank:%d,looked service for:%ls", rank, port_name_out);
    fprintf(stdout, "l%s\n", outstr);
}
sprintf_s(outstr, "Grank:%d,Trying connecting to server", rank);
fprintf(stdout, "%ls\n", outstr);
MPI_Comm_connect(port_name_out, MPI_INFO_NULL, 0, MPI_COMM_SELF, &newcomm);

MPI_Comm_rank(newcomm, &newrank);
sprintf_s(outstr, "Grank:%d,Lrank%d,connected to server", rank, newrank);
fprintf(stdout, "%ls\n", outstr);

sprintf_s(outstr, "Grank:%d,Lrank%d,requesting service...", rank, newrank);
fprintf(stdout, "%ls\n", outstr);
sprintf_s(sb, "Grank:%d,Lrank%d,require", rank, newrank);
msglen = strlen(sb);
MPI_Send(sb, msglen, MPI_CHAR, 0, flag, newcomm);

MPI_Barrier(MPI_COMM_WORLD);
MPI_Comm_disconnect(&newcomm);
MPI_Finalize();
return 0;

}
服务端程序:
#include
#include
#include
#include

int main(int argc, wchar_t *argv[])
{
int errs = 0;
wchar_t port_name[MPI_MAX_PORT_NAME], port_name_out[MPI_MAX_PORT_NAME];
wchar_t serv_name[256];
int merr, mclass;
wchar_t errmsg[MPI_MAX_ERROR_STRING];
char outstr[1024];
char sb[1024];
char rb[1024];
int msglen;
MPI_Status stat;
int rank, newrank, flag;
MPI_Comm newcomm;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
wcscpy_s(serv_name, L"MyTest");
MPI_Comm_set_errhandler(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
flag = 123;
newrank = 0;
sprintf_s(sb, "Grank:%d,Lrank:%d,require", rank, newrank);
msglen = strlen(sb);
fprintf(stdout, "process:%d,opening port....\n", rank);
merr = MPI_Open_port(MPI_INFO_NULL, port_name_out);
fprintf(stdout, "process:%d,port opened,with<%ls>\n", rank, port_name_out);
merr = MPI_Publish_name(serv_name, MPI_INFO_NULL, port_name_out);
if (merr)
    {
        errs++;
        MPI_Error_string(merr, errmsg, &msglen);
        printf("Error in publish_name:\"%ls\"\n", errmsg);
        fflush(stdout);
    }
MPI_Barrier(MPI_COMM_WORLD);


fprintf(stdout, "process:%d,accepting connection on :%ls\n", rank, port_name_out);
merr = MPI_Comm_accept(port_name_out, MPI_INFO_NULL, 0, MPI_COMM_SELF, &newcomm);
fprintf(stdout, "process:%d,accepted a connection on %ls\n", rank, port_name_out);

MPI_Comm_rank(newcomm, &newrank);
sprintf_s(outstr, "Grank:%d,Lrank%d,receiving", rank, newrank);
fprintf(stdout, "%s\n", outstr);
MPI_Recv(rb, msglen, MPI_CHAR, 0, flag, newcomm, &stat);
sprintf_s(outstr, "Grank:%d,Lrank%d,received<--%ls", rank, newrank, rb);
fprintf(stdout, "%s\n", outstr);

MPI_Barrier(MPI_COMM_WORLD);
fprintf(stdout, "server barrier after receiving passed\n");
merr = MPI_Unpublish_name(serv_name, MPI_INFO_NULL, port_name_out);
fprintf(stdout, "server after unpublish name\n");
if(merr)
    {
        errs++;
        MPI_Error_string(merr, errmsg, &msglen);
        printf("Error in Unpublish name:\"%ls\"\n", errmsg);
        fflush(stdout);
    }
    MPI_Comm_disconnect(&newcomm);
    fprintf(stdout, "server after disconnect\n");
MPI_Finalize();
return 0;

}

mpi

1个回答

我试验了一下你的程序,也连不上,我也是初学者.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MPI打印来自进程的问候,wmpiexec启用多个进程就无法实现

MPI代码如下。 #include "stdafx.h" #include<stdio.h> #include<string.h> #include"mpi.h" const int MAX_STRING = 100; int main(void) { char greeting[MAX_STRING]; int comm_sz; int my_rank; MPI_Init(NULL, NULL); MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); if (my_rank != 0) { sprintf(greeting, "if Greeting from process %d of %d!", my_rank, comm_sz); MPI_Send(greeting, strlen(greeting) + 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD); } else { printf("else Greetings from process %d of %d!\n", my_rank, comm_sz); for (int q = 1; q<comm_sz; q++) { MPI_Recv(greeting, MAX_STRING, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); printf("%s\n", greeting); } } MPI_Finalize(); return 0; } 启用一个进程结果。 ![图片说明](https://img-ask.csdn.net/upload/201611/05/1478358312_359586.png) 启用多个进程结果。 ![图片说明](https://img-ask.csdn.net/upload/201611/05/1478358337_7620.png)

MPI子域通信问题,划分的子域不能模拟MPI_Bcast发送和接收数据

原题如下: 设计 MPI 程序模拟广播( MPI_Bcast)操作:将每个 MPI 进程按照所在节点名称建立 node 通信子域分组;再将各个 node 子通信域的 0 号进程再次组成一个名为 head 的通信域; 在进行广播时,首先由 root 进程将消息在 head 通信子域内广播,然后,再由 head 子域内各 进程在其所在的 node 子域内进行广播 按照题目要求,我把所有的进程划分成了两个子域,一个是head,另一个是在每个node作为一个子域。 head部分划分代码如下: MPI_Group cpworld; MPI_Comm_group(MPI_COMM_WORLD,&cpworld); int ranks[10]={0,1,2,3,4,5,6,7,8,9}; MPI_Group head_comm; MPI_Group_incl(cpworld,10,ranks,&head_comm); MPI_Comm head; MPI_Comm_create(MPI_COMM_WORLD,head_comm,&head); 只是划分的话运行也是正常的,但是当尝试在head内利用MPI_Send和MPI_Recv进行模拟MPI_Bcast发送数据就会出错。发送代码如下: int head_rank=-1,head_size=-1; if(MPI_COMM_NULL!=head){ MPI_Comm_rank(head,&head_rank); MPI_Comm_size(head,&head_size); } //first time to send message int i; char message[100]; MPI_Status status; if(head_rank==0){ strcpy(message,"Hello,the message is from process root!\n"); for(i=0;i<head_size;i++) MPI_Send(message,strlen(message),MPI_CHAR,i,1,head); } else{ MPI_Recv(message,100,MPI_CHAR,0,1,head,&status); printf("In communicators recieve message: %s",message); } 错误提示如下: ![图片说明](https://img-ask.csdn.net/upload/201612/02/1480685751_883416.jpg) 尝试了查了很多资料也没彻底搞明白,请问这是什么原因?该怎么解决啊? 期待答复~

MPI通信问题,哪儿出错了,大神帮着看看

#include <stdio.h> #include <stdlib.h> #include <mpi.h> #define ARRAY_LENGTH 10 void Create_Array(int* arr,int len) { int i,j; printf("\nCreating Array."); for(i=0;i<len;i++) { arr[i] = random() % (ARRAY_LENGTH * 10); if((i%(ARRAY_LENGTH/10)) == 0) printf("."); } printf("DONE!\n"); } int main(int argc,char* argv[]) { int myid; int numprocs; MPI_Status status; int i,j; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); int len = ARRAY_LENGTH / numprocs; int* array = (int *)malloc(sizeof(int) * ARRAY_LENGTH); if(myid == 0) { Create_Array(array,ARRAY_LENGTH); //产生待排序数组 for(i=0;i<10;i++) printf(" %d ",array[i]); for(i=1;i<numprocs;i++) { MPI_Send((array+(i-1)*len), len, MPI_INT, i, 99, MPI_COMM_WORLD); printf("\nmyid is %d \n",myid); for(j=0;j<len;j++) printf(" %d ",array[j + (i-1)*len]); printf("\n"); } //printf("here!"); MPI_Barrier(MPI_COMM_WORLD); //quicksort(array,(numprocs-1)*len,ARRAY_LENGTH-1); MPI_Barrier(MPI_COMM_WORLD); } if(myid != 0) { int* buffer = (int *)malloc(sizeof(int) * len); MPI_Recv(&buffer, len, MPI_INT, myid, 99, MPI_COMM_WORLD, &status); printf("here!");//MPI_Barrier(MPI_COMM_WORLD); printf("myid is %d",myid); for(j=0;j<len;j++) printf(" %d ",buffer[j]); printf("\n"); } MPI_Finalize(); return 0; } ``` ``` 我的MPI_Send和MPI_Recv哪儿不对啊?

MPI并行冒泡二路归并排序问题

我思路是想吧随机产生的数组a 按照总进程数分s份 然后分到别的进程冒泡排序,然后在聚集回来 二路归并下边是代码 求大神帮忙改改~~~ // mpi.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "mpi.h" #include <ctime> #include <stdio.h> #include <math.h> #include <iostream> #include <windows.h> using namespace std; void merge(int x[],int z[],int s,int u,int v) //2-路·归并排序 { int i,j,q; i=s; j=u+1; q=s; while(i<=u&&j<=v) { if(x[i]<=x[j]) z[q++]=x[i++]; else z[q++]=x[j++]; } while(i<=u) //将X中剩余元素X[i..u]复制到Z z[q++]=x[i++]; while(j<=v) //将X中剩余元素X[j..v]复制到Z z[q++]=x[j++]; } void bubble(int a[],int n) { int i,j,t; for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(a[j]>a[j+1]) { t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } void main(int argc, char* argv[]) { MPI_Comm comm=MPI_COMM_WORLD; int n,m,rank,size,i,r,s,step; int *a,*b,*c,*d,*e; a=(int *)malloc(n*sizeof(int)); e=(int *)malloc(n*sizeof(int)); double startwtime,endwtime; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); if(rank==0){ cout<<"输入数列上限:"; cin>>n; cout<<"输入整数范围:"; cin>>m; srand(unsigned(time(0))); cout<<"产生的随机数列:"; s=n/size;r=n%size; b=(int *)malloc(n+rank-r*sizeof(int)); for(i=0;i<n;i++) { a[i]=rand()%m; b[i]=a[i]; cout<<a[i]<<" "; } cout<<endl; if(r!=0) { for(i=n;i<n+rank-r;i++) { b[i]=0; } s=s+1; } startwtime=MPI_Wtime(); MPI_Scatter(a,s,MPI_INT,b,s,MPI_INT,0,comm); bubble(b,s); } else { c=(int *)malloc(s*sizeof(int)); MPI_Scatter(a,s,MPI_INT,c,s,MPI_INT,0,comm); bubble(c,s); } if(rank!=0) { d=(int *)malloc(n*sizeof(int)); MPI_Gather(d,s,MPI_INT,b,s,MPI_INT,0,comm); MPI_Gather(d,s,MPI_INT,c,s,MPI_INT,0,comm); merge(d,e,0,n/2-1,n-1); } if(rank==0){ cout<<"排序结果:"; for(i=0;i<n;i++) { cout<<e[i]<<" "; } cout<<endl; endwtime=MPI_Wtime(); cout<<"wall clock time="<<endwtime-startwtime<<endl; } MPI_Finalize(); }

mpi的sendrecv函数实现雅可比迭代出错,小弟初学,跪求指教。

//一维泊松方程 u(x)=x^3,cpu为四核 #include "stdio.h" #include "math.h" #define MPICH_SKIP_MPICXX //没有这句就会出现overriding virtual function differs from 'MPI::的编译错误 #include "mpi.h"//将函数库包含进来 #include <stdio.h> #pragma comment (lib, "mpi.lib")//没有这句就会出现unresolved external symbol _MPI_Finalize的连接错误。 double f(double x) {double y; y=6*x; return y; } int main( int argc, char *argv[]) { double l=1;//长度 double w=0,e=1;//左右边界条件 int num=2;//进程数 int n=5;//网格数 double dd=l/n/num;//网格大小 double u[7],u0[7]; double eps=0; int i,j; int myid, numprocs, namelen;//定义进程号、进程数、进程名 double startwtime, endwtime;//定义起止时间,为了计算效率 char processor_name[MPI_MAX_PROCESSOR_NAME];//用进程名最长的作为长度 MPI_Init(&argc,&argv);//初始化语句,每个程序都一模一样 MPI_Status status; startwtime = MPI_Wtime();//得到开始时间 MPI_Comm_size(MPI_COMM_WORLD,&numprocs);//得到进程数 MPI_Comm_rank(MPI_COMM_WORLD,&myid);//得到进程号 MPI_Get_processor_name(processor_name,&namelen);//得到进程名,其实进程名不是必须的 for(j=0;j<n+2;j++){ u[j]=0; u[0]=0; u[n+1]=1;}//初始化 te: eps=0; for(j=1;j<n+1;j++){ u0[j]=u[j];} //for(j=0;j<n+2;j++){ //u0[j]=pow(((j-0.5)*dd+myid*n*dd),3); //u0[j]=u[j];} int up=myid-1; if (up<0) {up=MPI_PROC_NULL;} int down=myid+1; if (down>1){ down=MPI_PROC_NULL;} //if(myid<3) { //MPI_Recv(&u[n+1],1,MPI_DOUBLE,myid+1,1000,MPI_COMM_WORLD,&status); //MPI_Send(&u[n],1,MPI_DOUBLE,myid+1,1000,MPI_COMM_WORLD);} //if (myid>0) { //MPI_Send(&u[1],1,MPI_DOUBLE,myid-1,1000,MPI_COMM_WORLD); //MPI_Recv(&u[0],1,MPI_DOUBLE,myid-1,1000,MPI_COMM_WORLD,&status);} //if(myid>0&&myid<1){ MPI_Sendrecv(&u[1],1,MPI_DOUBLE,down,1000,&u[n+1],1,MPI_DOUBLE,myid,1000,MPI_COMM_WORLD,&status); MPI_Sendrecv(&u[n],1,MPI_DOUBLE,up,1000,&u[0],1,MPI_DOUBLE,myid,1000,MPI_COMM_WORLD,&status); for(i=1;i<=n;i++) { double t=(i-0.5)*dd+myid*n*dd; if(i==1){ u[i]=(u[i+1]+2*u[0]-f(t)*dd*dd)/3.0; continue;} if(i==(n)){ u[i]=(2*u[n+1]+u[i-1]-f(t)*dd*dd)/3.0; continue;} u[i]=(u[i-1]+u[i+1]-f(t)*dd*dd)/2; } //if(myid<num-1){u[myid][n+1]=/*u[myid+1][0];}*/(u[myid+1][1]+u[myid][n]-f((myid+1)*n*dd)*dd*dd)/2; //u[myid+1][0]=u[myid][n+1];} //if(myid>0){u[myid][0]=/*u[myid-1][n+1];}*/(u[myid][1]+u[myid-1][n+1]-f(myid*n*dd)*dd*dd)/2; //u[myid-1][n+1]=u[myid][0];} for(j=1;j<n+1;j++){ eps=eps+fabs(u0[j]-u[j]);} if(eps>0.1){goto te;} endwtime = MPI_Wtime();//得到终止时间 printf("wall clock time = %f\n", endwtime-startwtime);//得到墙上时间 MPI_Finalize();//关闭MPI for(j=1;j<n+1;j++){ printf("u[%d]=%f\n",j,u[j]);} return 0; }

用c语言,实现mpi中矩阵加法的并行处理

如何在VC中用mpi定义二维数组,实现数组相加的并行处理?希望高手们可以指点一二,感激不尽

如果我想在vs2010上运行mpi程序时控制用多少个进程运行,应该怎么做?

是在vs2010上直接控制,不是在mpich2上通过wmpiexe.exe程序控制,十分感谢!。。。。。。。。。

我想用MPI+OpenMP混合编程模型实现中国象棋博弈树并行搜索可以吗?怎么实现呢?

对于中国象棋的博弈树怎样用MPI+OpenMP混合编程模型分解,MPI是进程级的,OpenMP是线程级的,两者混合可以实现博弈树的并行搜索吗

cuda+mpi混合编程的函数调用和编译问题

我现在想用mpi实现两块GPU之间的数据通信,请问在cuda源文件里(xxx.cu)如果包含了<mpi.h>头文件,可以调用mpi函数(如mpi_send),并用nvcc正确编译吗。

MPI 求π的程序,谢谢大神

``` int main(argc,argv) int argc; char *argv[]; { int done = 0, n, myid, numprocs, i, rc; double PI25DT = 3.141592653589793238462643; double mypi, pi, h, sum, x, a; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); while (!done) { if (myid == 0) { printf("Enter the number of intervals: (0 quits) "); scanf("%d", &n); } //root MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); if (n == 0) break; h = 1.0 / (double) n; // width of each sub sum = 0.0; for (i = myid + 1; i <= n; i += numprocs) // **这个 for-loop 里面的为什么是 i <= n; i += numprocs? 怎么理解这里?** { x = h * ((double)i - 0.5); sum += 4.0 / (1.0 + x*x); } mypi = h * sum; MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (myid == 0) printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT)); } MPI_Finalize(); } ``` 哪个大神可以给我解释下这个算法的原理吗? 就好像哪个 for loop 为什么是 i += numprocs, 还有我不是很了解 MPI_BCAST AND MPI_REDUCE 在这里是怎么运行的。谢谢啦

mpi并行计算矩阵转置时间远慢于串行 为什么

如题,进行并行计算课程实验时利用mpi编程在学校服务器上进行程序运行计算10000*10000矩阵转置计算 代码如下 ``` #include "stdio.h" #include "stdlib.h" #include "mpi.h" #include "math.h" #define E 0.0001 #define a(x,y) a[x*m+y] #define b(x,y) b[x*m+y] #define A(x,y) A[x*size+y] #define B(x,y) B[x*size+y] #define intsize sizeof(int) #define floatsize sizeof(float) #define charsize sizeof(char) int size,N; /* size:±£´æ¾ØÕóÐÐÊý;N:±£´æ¾ØÕóÁÐÊý */ int m; /* ±£´æ×Ó·½ÕóµÄ³ß´ç */ int t; /* ÆåÅÌ»®·ÖµÄ·Ö¸îÊý */ float *A, *B; /* A:±£´æÔ­¾ØÕó;B:±£´æתÖúóµÄ¾ØÕó */ double starttime; /* ±£´æ¿ªÊ¼Ê±¼ä */ double time1; /* ±£´æ·Ö·¢Êý¾ÝµÄ½áÊøʱ¼ä */ double time2; /* ±£´æÔËÐеĽáÊøʱ¼ä */ int my_rank; /* ±£´æµ±Ç°½ø³ÌµÄ½ø³ÌºÅ */ int p; /* ±£´æ½ø³ÌÊý */ MPI_Status status; /* ±£´æMPI״̬ */ FILE *fdA; /* ÊäÈëÎļþ */ /* ÔËÐнáÊøÇ°,µ÷Óñ¾º¯ÊýÊÍ·ÅÄÚ´æ¿Õ¼ä */ void Environment_Finalize(float *a,float *b) { free(a); free(b); } int main(int argc, char **argv) { int i,j,k,my_rank,group_size; float *a,*b; int u,v; float temp; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&group_size); MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); p=group_size; /* Èç¹ûÊÇÖ÷½ø³Ì(rank=0µÄ½ø³Ì),Ôò½øÐжÁÎļþµÄ²Ù×÷, ½«´ýתÖõľØÕó¶ÁÈëÄÚ´æ,±£´æµ½È«¾Ö±äÁ¿AÖÐ */ if(my_rank==0) { starttime=MPI_Wtime(); fdA=fopen("mat_data.txt","r"); /* ¶ÁÈë¾ØÕóµÄÐÐÊýºÍÁÐÊý,²¢±£´æµ½sizeºÍNÖÐ */ fscanf(fdA,"%d %d", &size, &N); /* ÅжÏÊÇ·ñÊÇ·½Õó,Èç¹û²»ÊÇ,³ÌÐòÍ˳ö */ if(size != N) { puts("The input is error!"); exit(0); } A=(float*)malloc(floatsize*size*size); B=(float*)malloc(floatsize*size*size); /* ½«¾ØÕóµÄËùÓÐÖµ¶ÁÈë,±£´æµ½AÖÐ */ for(i = 0; i < size; i ++) { for(j = 0; j < size; j ++) fscanf(fdA, "%f", A+i*size+j); } fclose(fdA); } /* ¹ã²¥¾ØÕóµÄ³ß´ç */ MPI_Bcast(&size,1,MPI_INT,0,MPI_COMM_WORLD); /* »ñµÃÆåÅÌ»®·ÖµÄÊýÄ¿ */ t=(int)sqrt(p); if (t>size) t=size; if(size%t!=0) for(;;) { t--; if(size%t==0) break; } /* »ñµÃʵ¼ÊÀûÓõĴ¦ÀíÆ÷¸öÊý */ p=t*t; /* ÿ¸ö×Ó·½ÕóµÄ³ß´ç */ m=size/t; /* a±£´æ×Ó·½Õó,bÊÇÁÙʱ¾ØÕó,ÊÇÖ÷½ø³ÌÓÃÀ´±£´æ´ý·¢Ë͸ø±ðµÄ½ø³ÌµÄ×Ó·½Õó */ a=(float *)malloc(floatsize*m*m); b=(float *)malloc(floatsize*m*m); if (a==NULL||b==NULL) printf("allocate space fail!"); /* ¶ÔÖ÷½ø³Ì,»ñµÃ×Ô¼ºµÄ×Ó·½Õó(¼´×óÉϽǵÄ×Ó·½Õó) */ if (my_rank==0) { for(i=0;i<m;i++) for(j=0;j<m;j++) a(i,j)=A(i,j); } /* Ö÷½ø³ÌÏòÆäËû½ø³Ì·¢ËÍÊý¾Ý */ if (my_rank==0) { for(i=1;i<p;i++) { v=i/t; /* ×Ó·½ÕóµÄÐкŠ*/ u=i%t; /* ×Ó·½ÕóµÄÁкŠ*/ for(j=v*m;j<(v+1)*m;j++) for(k=u*m;k<(u+1)*m;k++) b((j%m),(k%m))=A(j,k); /* ½«×Ó·½ÕóÔÝ´æÔÚbÖÐ */ /* ½«×Ó·½Õó·¢Ë͵½ÏàÓ¦µÄ½ø³Ì */ MPI_Send(b,m*m,MPI_FLOAT,i,i,MPI_COMM_WORLD); } } else if (my_rank<p) /* ¶ÔÆäËû½ø³Ì,´ÓÖ÷½ø³Ì½ÓÊÕÊý¾Ý */ MPI_Recv(a,m*m,MPI_FLOAT,0,my_rank,MPI_COMM_WORLD,&status); time1=MPI_Wtime(); /* ¶ÔÏÂÈý½ÇµÄ×Ó·½Õó½øÐд¦Àí */ if ((my_rank/t)>(my_rank%t)&&my_rank<p) { v=my_rank/t; /* ÐкŠ*/ u=my_rank%t; /* ÁкŠ*/ /* ·¢ËÍ×Ó·½Õóµ½Î»ÓÚÏàÓ¦ÉÏÈý½ÇλÖõĽø³Ì */ MPI_Send(a,m*m,MPI_FLOAT,(u*t+v),(u*t+v),MPI_COMM_WORLD); /* ´ÓÏàÓ¦ÉÏÈý½ÇλÖõĽø³Ì½ÓÊÕÊý¾Ý */ MPI_Recv(a,m*m,MPI_FLOAT,(u*t+v),my_rank,MPI_COMM_WORLD,&status); } /* ¶ÔÉÏÈý½ÇµÄ×Ó·½Õó½øÐд¦Àí */ if ((my_rank/t)<(my_rank%t)&&my_rank<p) { v=my_rank/t; /* ÐкŠ*/ u=my_rank%t; /* ÁкŠ*/ /* ½«×Ó·½ÕóÔªËظ´ÖƵ½b */ for(i=0;i<m;i++) for(j=0;j<m;j++) b(i,j)=a(i,j); /* ´ÓÏàÓ¦ÏÂÈý½ÇλÖõĽø³Ì½ÓÊÕÊý¾Ý */ MPI_Recv(a,m*m,MPI_FLOAT,(u*t+v),my_rank,MPI_COMM_WORLD,&status); /* ×Ó·½Õó·¢Ë͵½Î»ÓÚÏàÓ¦ÏÂÈý½ÇλÖõĽø³Ì */ MPI_Send(b,m*m,MPI_FLOAT,(u*t+v),(u*t+v),MPI_COMM_WORLD); } /* ¶Ôÿһ¸ö×Ó·½Õó½øÐÐתÖà */ for(i=1;i<m;i++) for(j=0;j<i;j++) { temp=a(i,j); a(i,j)=a(j,i); a(j,i)=temp; } /* Ö÷½ø³Ì¿ªÊ¼½«×ªÖõĽá¹û½øÐÐ×éºÏ ÏȽ«Ö÷½ø³ÌµÄ½á¹û×éºÏµ½BÖÐ×óÉÏ½Ç */ if (my_rank==0) { for(i=0;i<m;i++) for(j=0;j<m;j++) B(i,j)=a(i,j); } /* Ö÷½ø³Ì´ÓÆäËû½ø³Ì½ÓÊÕ½á¹û,×éºÏµ½BµÄÏàӦλÖà */ if (my_rank==0) { for(i=1;i<p;i++) { /* ´ÓÆäËû½ø³Ì½ÓÊÕ½á¹û */ MPI_Recv(a,m*m,MPI_FLOAT,i,i,MPI_COMM_WORLD,&status); v=i/t; /* ½á¹ûµÄÐкŠ*/ u=i%t; /* ½á¹ûµÄÁкŠ*/ for(j=v*m;j<(v+1)*m;j++) for(k=u*m;k<(u+1)*m;k++) B(j,k)=a((j%m),(k%m)); /* ½á¹û×éºÏµ½BµÄÏàӦλÖà */ } } else if(my_rank<p) /* ÆäËû½ø³Ì·¢Ëͽá¹ûµ½Ö÷½ø³Ì */ MPI_Send(a,m*m,MPI_FLOAT,0,my_rank,MPI_COMM_WORLD); /* ÓÉÖ÷½ø³Ì´òÓ¡¼ÆËã½á¹û */ // if (my_rank==0) // { // printf("Input of file \"dataIn.txt\"\n"); // printf("%d\t%d\n", size, size); // for(i=0;i<size;i++) // { // for(j=0;j<size;j++) printf("%f\t",A(i,j)); // printf("\n"); // } // printf("\nOutput of Matrix AT\n"); // for(i=0;i<size;i++) // { // for(j=0;j<size;j++) printf("%f\t",B(i,j)); // printf("\n"); // } // } time2=MPI_Wtime(); /* ÓÉÖ÷½ø³Ì´òӡʱ¼äÐÅÏ¢ */ if (my_rank==0) { printf("\n"); printf("Whole running time = %f seconds\n",time2-starttime); printf("Distribute data time = %f seconds\n",time1-starttime); printf("Parallel compute time = %f seconds\n",time2-time1); } MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); Environment_Finalize(a,b); return(0); } ``` 增加进程数时间总体是增大的 如图![图片说明](https://img-ask.csdn.net/upload/201704/05/1491395111_19254.png) 请问为什么

MPI并行计算时报错“由于目标计算机积极拒绝,无法连接”,此种情况是什么原因,怎么解决呢?

我在做优化设计时,优化程序经其他人测试没有问题,可以并行计算。但是在去哦自己电脑上运行时总是出现错误,我是使用.bat控制MPI并行计算的,.bat文件和运行报错截面如下: ![图片说明](https://img-ask.csdn.net/upload/201911/05/1572919953_575300.png)![图片说明](https://img-ask.csdn.net/upload/201911/05/1572920000_218929.png) 在尝试过网上相应的解决方法后依然无效,比如尝试打开MPICH2 Process Manager, Argonne National Lab 服务,但是发现服务一直是开启状态,开启服务业无法运行。 MPI安装好后用安装位置自带的测试程序对MPI进行了测试,发现MPI没有问题。 求各位大神指导,是什么原因导致此现象的,该怎么解决这个问题呢

mpi配置问题显示mpi. h有语法错误

vs2010+mpi10+win0 64,按照网上的方法进行了配置,现在编译的时候会显示mpi.h有语法错误,有没有大神可以解答

MP标准模式模式与阻塞

如下代码 start = MPI_Wtime(); if (myid == 0){ MPI_Send(a, 1000, MPI_DOUBLE, 1, 4, MPI_COMM_WORLD); } else{ MPI_Recv(b, 1000, MPI_DOUBLE, 0, 4, MPI_COMM_WORLD, &status); } end = MPI_Wtime(); 测试发送时间小于接收时间。把这一代码复制多次,发现第一次通信时间开销大于后几次的通信时间开销。对这一现象是否应该如下理解: 1、标准通信是阻塞通信,所以0号进程只有发送操作结束才可以执行接下来的代码,1号进程只有接收操作执行完才可以执行后续代码。 2、发送结束并不意味着这一次通信结束,所以才会有发送操作的时间开销小于接收操作。 是否正确? 疑问: 1、发送操作和接收操作的时间差来源于何处? 2、都志辉等《高性能计算之并行编程》中MPI标准通信会由MPI决定发送数据是否进行缓存,上例是否进行了缓存?如果MPI没有申请缓冲区,为什么同样的通信第2次时间开销会远小于第1次? 3、如果MPI自行申请了缓冲区,那么MPI建立缓冲区有什么原则规律?

大神们帮帮我吧,小白求助MPI问题,一用MPI_Scatterv,就报错。

我的意图是1加到100,c数组保存每个进程收到的数,d数组是 保存偏移量。 代码: #include<stdio.h> #include <mpi.h> int main(void){ int c[200]; int i; int n; int d[200]; int x[100]; int x1[200]; int z[200]; int z1[200]; int size; int rank; int t; int sum=0; MPI_Init(NULL,NULL);//MPI_COMM_WORLD; MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); //建立数组存放给进程处理数据的个数 n=100; if(rank==0){ for(i=0;i<100;i++) x[i]=i+1; } for(i=0;i<size;i++){ c[i]=n/size; t=n%size; } for(i=0;i<t;i++){ c[i]=c[i]+1; } //建立数组存放进程处理数据的偏移量 d[0]=0; for(i=0;i<=rank;i++) { if(i!=0) d[i]=c[i-1]+d[i-1]; } printf("%d \n",rank); printf("%d \n",c[rank]); printf("%d \n",d[rank]); printf("********************************** \n"); printf("x[2]是 %d \n",x[2]); //零进程获取数据 //进行数据分发 MPI_Scatterv(x,c,d,MPI_INT,x1,c[rank],MPI_INT,0,MPI_COMM_WORLD); /* for(i=0;i<c[rank];i++){ z1[rank]=z1[rank]+x1[i]; } printf("%d \n",rank); for(i=0;i<c[rank];i++) printf("%d \n",x1[i]); printf("%d \n",c[rank]); printf("********************************** \n"); //数据处理 /* MPI_Gatherv(z1,c[rank],MPI_INT,z,c,d,MPI_INT,0,MPI_COMM_WORLD); if(rank==0){ for(i=0;i<size;i++){ sum=sum+z[i]; } printf("%d",sum); } */ //汇总结果 MPI_Finalize(); }

怎么样可以在mpi中传类型是string的vector?vecor<string>

现有程序如下: vector<string> vec; //初始化mpi if(myid == 0) { vec.push_back("d:/mpi/01.las"); vec.push_back("d:/mpi/02.las"); vec.push_back("d:/mpi/03.las"); vec.push_back("d:/mpi/04.las"); MPI_Send(&vec[0], vec.size(), MPI_CHAR, 1, 1, MPI_COMM_WORLD); } else { vec.resie(4); MPI_Rec(&vec[0], 4, MPI_CHAR, 0, 1, MPI_COMM_WORLD, &status); } //MPI 结束 //以上代码简化版,就是想请教,我这样写了之后,接收到的vec 没有内容输出,应该是没有接收到东西。可能是MPI_char用错了,但是没有MPI_String类型,所以并不知道如何解决了。 没有查到相关怎么解决此类问题资料,望大神们指教~ 谢谢!

MPI并行程序运行时报错,自己无法解决,求助

请教各位关于MPI并行的一个错误:op_read error on left context: Undefined dynamic error code unable to read the cmd header on the left context, Undefined dynamic error code. 请问这种MPI并行程序运行时报的错误可能是由什么原因造成的,程序本身的原因还是运行环境有问题,或者其它?之前自己遇到过一次,也是停在13000步左右,但是又运行程序侥幸算完了。这次在计算到4000步左右的时候停了,重开程序只算到14000步这里就停了(总共要算16384步)。

MPI 矩阵分块 数据类型设计

4*4矩阵分成2*2的块矩阵,怎么用MPI_Type_vector 设计块

mpi 可以编译 但是运行会出错

因为要上并行计算的课程安装了msmpi 测试代码如下 ``` #include<stdio.h> #include<mpi.h> int main(int argc, char* argv[]) { int myid, numprocs; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); printf("%d Hello world from process %d \n", numprocs, myid); MPI_Finalize(); return 0; } ``` 适用vs编译得到的exe文件可以执行并打印 但是用g++编译的话,编译成功,但是运行出错 错误代码exit code 3221225477 控制台不打印任何东西 请问各位有遇到过这个问题的吗?

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。Java 8 新增的 Stream 是为...

立即提问
相关内容推荐