微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

进程数量在中途更改

如何解决进程数量在中途更改

我编写了一个简单的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 举报,一经查实,本站将立刻删除。