У меня есть родительский процесс и матрица, и я хочу создать для каждой строки дочерний процесс и отправить ему соответствующую строку для процесса.
Код родительского процесса:
int tag = 0;
MPI_Status status;
int random(int n) {
return rand() % n;
}
float** generate_matrix(int n, int m) {
int i, j;
float **x;
x = (float **) malloc(m * sizeof(float));
for (i = 0; i < m; i++) {
x[i] = (float *) malloc(n * sizeof(float));
}
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
x[i][j] = random(100);
}
}
return x;
}
int main(int argc, char** argv) {
int my_rank;
int num_procs;
MPI_Comm workercomm;
int n = 4, m = 5;
float**matrix = generate_matrix(n, m);
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
MPI_Comm_spawn("C:/Users/colegnou/workspace/worker/Debug/worker.exe",
MPI_ARGV_NULL, m,
MPI_INFO_NULL, 0, MPI_COMM_SELF, &workercomm, MPI_ERRCODES_IGNORE);
for (int i = 0; i < m; i++) {
MPI_Bcast(matrix[i], n, MPI_FLOAT, MPI_ROOT, workercomm);
}
MPI_Finalize();
return 0;
}
И рабочий код:
int tag = 0;
MPI_Status status;
int main(int argc, char** argv) {
MPI_Init(&argc, &argv);
MPI_Comm parent;
MPI_Comm_get_parent(&parent);
int myid;
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
int n = 4;
float*vector = (float *) malloc(n * sizeof(float));
if (parent != MPI_COMM_NULL) {
MPI_Bcast(vector, n, MPI_FLOAT, MPI_ROOT, parent);
}
printf("%d ->", myid);
for (int i = 0; i < n; i++) {
printf("%f ", vector[i]);
}
printf("\n");
MPI_Comm_free(&parent);
free(vector);
MPI_Finalize();
return 0;
}
Но я ожидаю, что каждый дочерний процесс будет печатать свою соответствующую строку за строкой в матрице, вместо этого вывод: .................................................. ..................................
4 ->0.000000 0.000000 0.000000 0.000000
1 ->0.000000 0.000000 0.000000 0.000000
3 ->0.000000 0.000000 0.000000 0.000000
0 ->0.000000 0.000000 0.000000 0.000000
2 ->0.000000 0.000000 0.000000 0.000000
Спасибо !!





В рабочем коде вы должны использовать root=0 вместо MPI_ROOT.
Не стесняйтесь перечитать определение MPI_Bcast(), когда используется интеркоммуникатор.
https://www.open-mpi.org/doc/v2.1/man3/MPI_Bcast.3.php
Обратите внимание, что матрица размещена неправильно, вместо нее следует использовать malloc(m * sizeof(float *)).
Вы также должны выполнять широковещательные передачи m в воркере, если только MPI_Scatter() не является тем, что вы ищете (и в этом случае вам следует выделить непрерывную 2D-матрицу)
Это то, что делает MPI_Bcast(), и вам, вероятно, понадобится MPI_Scatter().
спасибо за помощь, но он отправляет только первую строку матрицы всем процессам: D