2017-09-26 29 views
1

我想創建一個正則C中的程序,它可以在任意數量的進程之間平等地分配一個整數數組。爲了進行調試,我使用了一個12數字整數數組,並且只有2個進程,以便主進程擁有[1,2,3,4,5,6],slave1將擁有[7,8,9,10 ,11,12]。不過,我收到一條錯誤消息:MPI_ERR_BUFFER: invalid buffer pointer如何通過MPI_Send發送整數數組?

經過一番研究,我發現有一個函數可以做到這一點(MPI_Scatter)。不幸的是,自從我學習MPI以來,實現僅限於MPI_SendMPI_Recv。無論如何,MPI_SendMPI_Recv都使用void *,並且我發送了一個int *,所以它應該可以工作。任何人都可以指出我做錯了什麼?謝謝。

int* create_sub_vec(int begin, int end, int* origin); 
void print(int my_rank, int comm_sz, int n_over_p, int* sub_vec); 

int main(void){ 

    int comm_sz; 
    int my_rank; 

    int vec[12] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
    int* sub_vec = NULL; 
    int n_over_p; 

    MPI_Init(NULL, NULL); 
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);  

    n_over_p = 12/comm_sz; 
    printf("Process %d calcula n_over_p = %d\n", my_rank, n_over_p); 

    if (my_rank != 0) { 
     MPI_Recv(sub_vec, n_over_p, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     print(my_rank, comm_sz, n_over_p, sub_vec); 

    } else { 

     printf("Distribuindo dados\n"); 
     for (int i = 1; i < comm_sz; i++) { 
      sub_vec = create_sub_vec(i*n_over_p, (i*n_over_p)+n_over_p, vec); 
      MPI_Send(sub_vec, n_over_p, MPI_INT, i, 0, MPI_COMM_WORLD); 
     } 
     printf("Fim da distribuicao de dados\n"); 

     sub_vec = create_sub_vec(0, n_over_p, vec); 

     print(my_rank, comm_sz, n_over_p, sub_vec); 
    } 

    MPI_Finalize(); 
    return 0; 

} 

int* create_sub_vec(int begin, int end, int* origin){ 
    int* sub_vec; 
    int size; 
    int aux = 0; 
    size = end - begin; 
    sub_vec = (int*)malloc(size * sizeof(int)); 
    for (int i = begin; i < end; ++i) { 
     *(sub_vec+aux) = *(origin+i); 
     aux += 1; 
    } 
    return sub_vec; 
} 

void print(int my_rank, int comm_sz, int n_over_p, int* sub_vec){ 
    printf("Process %d out of %d received sub_vecotr: [ ", my_rank, comm_sz); 
    for (int i = 0; i < n_over_p; ++i) 
    { 
     printf("%d, ", *(sub_vec+i)); 
    } 
    printf("]\n"); 
} 
+0

您是否嘗試實施並行排序? – savram

+0

不,這是一個簡單的練習,可以並行地對矢量的元素進行求和。 –

回答

3

問題是sub_vec未分配在非零級別上。 您可以這樣做(例如,MPI不分配接收緩衝區)。

接收部分應該像

if (my_rank != 0) { 
    sub_vec = (int *)malloc(n_over_p * sizeof(int));  
    MPI_Recv(sub_vec, n_over_p, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
} 

當你寫的,自然的方式是通過MPI_Scatter()(並再次,它是由你開始分散之前分配的接收緩衝區。