MPI:广播一个很长的int

该程序通过将随机“飞镖”(采样点)投掷到圆形或半径= 1内切长度为2的方形板内来估计Pi 。 使用这种关系

 Area of circle / Area of Square = Pi/4 

我们可以用表达的相同关系来估计Pi

 Darts Inside Circle / Darts Outside Circle = Pi/4 

当我在#define指定NDARTS时程序工作正常,但是当尝试将它作为long long int广播时,从scanf读取,我得到以下执行错误:

 mpirun -np 4 ./pi_montecarlo.x ----------------------------------------------------------------------------- One of the processes started by mpirun has exited with a nonzero exit code. This typically indicates that the process finished in error. If your process did not finish in error, be sure to include a "return 0" or "exit(0)" in your C code before exiting the application. PID 10591 failed on node n0 (127.0.0.1) due to signal 11. 

为什么?

我的MPI_Bcast声明有什么问题吗?

 long long int *NDARTS=0; scanf("%Ld",NDARTS); MPI_Bcast(NDARTS, 1, MPI_LONG_LONG_INT, 0, MPI_COMM_WORLD); 

完整代码:

 /* mpicc -g -Wall -lm pi_montecarlo3.c -o pi_montecarlo.x mpirun -np 4 ./pi_montecarlo.x */ #include  #include  #include  #include  #include  #define MASTER 0 #define PI 3.1415926535 d ouble pseudo_random (double a, double b) { double r; r = ((ba) * ((double) rand() / (double) RAND_MAX)) +a; return r; } int main(int argc, char*argv[]){ long long int *NDARTS=0; int proc_id, n_procs, llimit, ulimit, n_circle, i; double pi_current, pi_sum, x, y, z, error, start_time, end_time; struct timeval stime; llimit = -1; ulimit = 1; n_circle =0; MPI_Init(&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &proc_id); MPI_Comm_size (MPI_COMM_WORLD, &n_procs); if (proc_id == MASTER){ printf("\nMonte Carlo Method to estimate Pi \n\n"); printf("Introduce Number of Darts \n"); scanf("%Ld",NDARTS); printf(" Number of processes: %d \n", n_procs); printf(" Number of darts: %Ld \n", *NDARTS); MPI_Bcast(NDARTS, 1, MPI_LONG_LONG_INT, 0, MPI_COMM_WORLD); start_time = MPI_Wtime(); } gettimeofday(&stime, NULL); srand(stime.tv_usec * stime.tv_usec * stime.tv_usec * stime.tv_usec); for (i=1; i<=*NDARTS;i++){ x = pseudo_random(llimit, ulimit); y = pseudo_random(llimit, ulimit); z = pow(x,2) + pow(y,2); if (z<=1.0){ n_circle++; } } pi_current = 4.0 * (double)n_circle / (double) *NDARTS; MPI_Reduce (&pi_current, &pi_sum, 1, MPI_DOUBLE, MPI_SUM, MASTER, MPI_COMM_WORLD); if (proc_id == MASTER) { pi_sum = pi_sum / n_procs; error = fabs ((pi_sum -PI) / PI) *100; end_time = MPI_Wtime(); printf("Known value of PI : %11.10f \n", PI); printf("Estimated Value of PI : %11.10f\n", pi_sum); printf("Error Percentage : %10.8f\n", error); printf("Time : %10.8f\n\n", end_time - start_time); } MPI_Finalize(); return 0; } 

您没有正确使用scanf() 。 它应该是这样的:

 long long int NDARTS; scanf("%lld",&NDARTS); MPI_Bcast(&NDARTS, 1, MPI_LONG_LONG_INT, 0, MPI_COMM_WORLD); 

在你当前的代码中, long long int *NDARTS=0; 有效地将NDARTS初始化为NULL指针。 所以scanf()在尝试写入时显然会出现seg-fault。