如何解决进程数量在中途更改
我编写了一个简单的MPI程序,该程序接收一个输入文件,并提取其中的前99个数字,然后对其求和。实际上,它是this的略微修改版本。该程序有效。
#include "mpi.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 99 //line 5
void main(int argc,char **argv){
//int MAXSIZE = 6; //line 8
int myid,numprocs;
int data[MAXSIZE],i,x,low,high,myresult,result;
char fn[255];
FILE *fp;
//if (argc > 1) MAXSIZE = atoi(argv[1]); //line 14
MPI_Init (&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank (MPI_COMM_WORLD,&myid);
if (myid == 0){ //Open input file and initialize data
strcpy(fn,getenv("HOME"));
strcat (fn,"/MPI/rand_data.txt");
if ((fp = fopen(fn,"r")) == NULL){
printf("Can't open the input file: %s\n\n",fn);
exit (1);
}
for(i = 0; i < MAXSIZE; i++){
fscanf(fp,"%d",&data[i]);
}
}
//broadcast data
MPI_Bcast (data,MAXSIZE,MPI_INT,MPI_COMM_WORLD);
//Add my portion Of data
x = MAXSIZE/numprocs; //must be an integer
low = myid * x;
high = low + x;
myresult = 0;
for(i = low; i < high; i++){
myresult += data[i];
}
if (MAXSIZE % numprocs > myid)
myresult += data[x*numprocs+myid];
printf("I got %d from %d\n",myid);
//Compute global sum
MPI_Reduce(&myresult,&result,1,MPI_SUM,MPI_COMM_WORLD);
if (myid == 0) printf("The sum is %d.\n",result);
MPI_Finalize();
}
然后,我试图通过简单地注释掉第5行以及第8行和第14行的注释,使同一个程序接受参数(它读取并累加了多少个数字)。该程序可以与任何参数一起正常运行,但传递80或上面给出了奇怪的行为。我进行了printf样式的调试,发现numprocs
的值最初为4,在过程中途将更改为1。
这里发生了什么事?
解决方法
怪异的行为可能是由于在第8行(其中int data[MAXSIZE]
中设置了MAXSIZE
的情况下声明了6
的第10行)。这是因为第15行再次设置MAXSIZE
。如果它大于初始的MAXSIZE
,则可能导致未定义的行为(可能也是分段错误),因为现在将使用新的data
访问MAXSIZE
数组。因此,将int data[MAXSIZE]
从第10行移至第16行。
至于在执行过程中更改numprocs
的值,它完全不会发生。唯一分配了numprocs
值(write
)的实例是在MPI调用期间和其余时间仅被访问(read
)。因此,从理论上讲,这不应该发生。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。