私は、プロセスの任意の量の間で整数配列を等しく分割する通常の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_Send
とMPI_Recv
に限定されています。とにかく、MPI_Send
とMPI_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");
}
、あなたが書いたように一部が
ようになっているはず受け取ります並列ソートを実装しようとしていますか? – savram
いいえ、ベクトルの要素を並列に合計するのは単純な演習です。 –