2013-07-24 122 views
0

我試圖用MPI來做蒙特卡洛問題,我們生成了x的蘭特數。數字在0和1之間,然後將n長度的數字發送給每個處理器。我正在使用分散函數,但是我的代碼不能正確運行,它會編譯,但它不會要求輸入。我不明白MPI如何循環自己沒有循環,可以解釋一下,我的代碼有什麼問題?需要解釋MPI_Scatter()

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <time.h> 
#include <math.h> 
#include "mpi.h" 

main(int argc, char* argv[]) { 
int   my_rank;  /* rank of process  */ 
int   p;    /* number of processes */ 
int   source;  /* rank of sender  */ 
int   dest;   /* rank of receiver  */ 
int   tag = 0;  /* tag for messages  */ 
char  message[100]; /* storage for message */ 
MPI_Status status;  /* return status for */ 
double *total_xr, *p_xr, total_size_xr, p_size_xr; /* receive    */ 

/* Start up MPI */ 
MPI_Init(&argc, &argv); 

/* Find out process rank */ 
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 

/* Find out number of processes */ 
MPI_Comm_size(MPI_COMM_WORLD, &p); 

double temp; 
int i, partial_sum, x, total_sum, ratio_p, area; 
total_size_xr = 0; 
partial_sum = 0; 
if(my_rank == 0){ 
    while(total_size_xr <= 0){ 
     printf("How many random numbers should each process get?: "); 
     scanf("%f", &p_size_xr); 
    } 
    total_size_xr = p*p_size_xr; 
    total_xr = malloc(total_size_xr*sizeof(double)); 

    //xr generator will generate numbers between 1 and 0 
    srand(time(NULL)); 
    for(i=0; i<total_size_xr; i++) 
    { 
     temp = 2.0 * rand()/(RAND_MAX+1.0) -1.0; 
     //this will make sure if any number computer stays in the boundry of 0 and 1, doesn't go over into the negative 
     while(temp < 0.0) 
     { 
      temp = 2.0 * rand()/(RAND_MAX+1.0) -1.0; 
     } 
     //array set to total random numbers generated to be scatter into processors 
     total_xr[i] = temp; 
    } 

} 
else{ 
//this will be the buffer for the processors to hold their own numbers to add 
p_xr = malloc(p_size_xr*sizeof(double)); 
printf("\n\narray set\n\n"); 
//scatter xr into processors 
MPI_Scatter(total_xr, total_size_xr, MPI_DOUBLE, p_xr, p_size_xr, MPI_DOUBLE, 0, MPI_COMM_WORLD); 
//while in processor the partial sum will be caluclated by using xr and the formula sqrt(1-x*x) 
for(i=0; i<p_size_xr; i++) 
{ 
    x = p_xr[i]; 
    temp = sqrt(1 - (x*x)); 
    partial_sum = partial_sum + temp; 
} 
//} 


//we will send the partial sums to master processor which is processor 0 and add them and place 
//the result in total_sum 
MPI_Reduce(&partial_sum, &total_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); 

//once we have all of the sums we need to multiply the total sum and multiply it with 1/N 
//N being the number of processors, the area should contain the value of pi. 
ratio_p = 1/p; 
area = total_sum*ratio_p; 

printf("\n\nThe area under the curve of f(x) = sqrt(1-x*x), between 0 and 1 is, %f\n\n", area); 

/* Shut down MPI */ 
MPI_Finalize(); 
} /* main */ 
+0

一些變量沒有使用,因爲我忘了把它們從我上一個項目中拿出來,請幫忙。 – mctx3

回答

1

一般來說,它不太依賴STDIN/STDOUT來編寫MPI程序。有可能MPI的實現可能會在您啓動作業的節點以外的某個節點上放置0級。在這種情況下,您不得不擔心正確轉發。雖然這在大多數情況下都會起作用,但這通常不是一個好主意。

更好的做事方式是讓用戶輸入應用程序可以讀取的文件或通過命令行變量。這些將會更便攜。

我不確定MPI循環本身沒有循環意味着什麼。也許你可以澄清那個評論,如果你仍然需要一個答案。