2017-09-26 13 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

、あなたが書いたように一部が

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); } 

ようになっているはず受け取ります並列ソートを実装しようとしていますか? – savram

+0

いいえ、ベクトルの要素を並列に合計するのは単純な演習です。 –

答えて

3

sub_vecはゼロ以外のランクには割り当てられません。 これはあなた次第です(たとえば、MPIは受信バッファを割り当てません)。

インクルードは、自然な方法でMPI_Scatter()経由で(そして再び、それは散布を開始する前に、受信バッファを割り当てるためにあなた次第です。

関連する問題