MPI pi计算中的节点计数无效

时间:2016-10-22 11:41:35

标签: c parallel-processing openmp openmpi

我正在尝试并行化以下代码来计算pi。

我的方法是使用scatter来并行化for,然后使用reduce来计算总和值,最后显示pi。

我的代码如下

#include <stdio.h>
#include <mpi.h> 

long num_steps = 100000;
double step = 1.0/100000.0;

int main() {

int i, myid, size;
double x, pi, local_sum = 0.0, sum=0.0;
double send_vec[num_steps], recv_vect[num_steps]; 

// Initialize the MPI environment 
MPI_Init(NULL, NULL); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 
MPI_Comm_rank(MPI_COMM_WORLD,&myid);

if (myid ==0){
    int i=0; 
    for (i=0; i<num_steps;i++){
        send_vec[i]=i;
    }
}

MPI_Scatter(send_vec, num_steps/size, MPI_INT, recv_vect, 
    num_steps, MPI_INT, 0, MPI_COMM_WORLD);

for(i = 0; i < num_steps; ++i) {
    x = (recv_vect[i]-0.5)*step;
    local_sum += 4.0/(1.0+x*x);
}

MPI_Reduce(&local_sum, &sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if (myid == 0){
    pi = step*sum;
    printf("PI value = %f\n", pi);  
 }

// Finalize the MPI environment. 
MPI_Finalize();
}

当我使用选项-np 1和2运行程序时 我确实得到了理想的结果。

然而,当我以3,4和更高版本运行时,我收到以下错误:

PIC_Send(284).........: Negative count, value is -240000
Fatal error in PMPI_Scatter: Invalid count, error stack

1 个答案:

答案 0 :(得分:2)

要更正对MPI_Scatter()的来电:

MPI_Scatter(send_vec, num_steps/size, MPI_INT, recv_vect, 
num_steps, MPI_INT, 0, MPI_COMM_WORLD);
  • 要发送double,请使用MPI_DOUBLE
  • 中的数据类型MPI_Reduce()
  • 由于sendtyperecvtype类似,因此发送到每个流程sendcount的项目数必须等于每个流程recvcount收到的项目数。在本案例中,它是num_steps/size

最后,对MPI_Scatter()的调用如下:

MPI_Scatter(send_vec, num_steps/size, MPI_DOUBLE, recv_vect, 
num_steps/size, MPI_DOUBLE, 0, MPI_COMM_WORLD);

最后,动态内存分配可用于避免使用堆栈存储大型数组。此外,可以减少分配的空间,以减少内存占用:

num_steps=(num_steps/size)*size;
double* send_vec=NULL;
double* recv_vec=NULL;
if(rank==0){
   send_vec=malloc((num_steps/size)*sizeof(double));
   if(send_vec==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
}
recv_vec=malloc(num_steps*sizeof(double));
if(recv_vec==NULL){fprintf(stderr,"malloc failed\n");exit(1);}

...

if(rank==0){
   free(send_vec);
}
free(recv_vec);