2011-12-10 51 views
2

該方案通過將隨機「飛鏢」(採樣點)投擲到長度爲2的方形棋盤內的圓或半徑= 1來估計Pi。使用關係MPI:廣播長整型

Area of circle/Area of Square = Pi/4 

,我們可以使用相同的關係估計丕表示

當我在 #define指定 NDARTS,而是試圖播放它作爲一個 long long int時,讀
Darts Inside Circle/Darts Outside Circle = Pi/4 

程序工作正常從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 <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#include <mpi.h> 


#define MASTER 0 
#define PI 3.1415926535 




d ouble pseudo_random (double a, double b) { 



    double r; 


    r = ((b-a) * ((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; 
} 

回答

2

您沒有使用正確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。

+0

謝謝,這確實解決了運行時問題,但現在我的程序被困在多個進程中: - /。我將在單獨的問題上發佈該問題。 – andandandand