MPI: широковещательная передача длинной строки int

Эта программа оценивает Pi , бросая случайные «дротики» (точки отбора) на круг или радиус = 1, вписанные внутри квадратной доски длины = 2. Используя соотношение

 Area of circle / Area of Square = Pi/4 

мы можем оценить Pi, используя ту же зависимость, что и

 Darts Inside Circle / Darts Outside Circle = Pi/4 

Программа отлично работает, когда я указываю NDARTS в #define , но при попытке транслировать его как 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, когда он попытается написать ему.