Я попытался сделать сумму матрицы, используя MPI, чтобы сделать это, я не знаю, почему, но я не могу отправить какие-либо данные с помощью MPI_Send
, но что я пытаюсь я получаю сообщение об ошибке:C++ MPI: не удалось отправить что-либо
Sending 3 rows to task 1 offset=0
Sending 3 rows to task 2 offset=3
Sending 2 rows to task 3 offset=6
Sending 2 rows to task 4 offset=8
*** An error occurred in MPI_Send
*** reported by process [1047527425,0]
*** on communicator MPI_COMM_WORLD
*** MPI_ERR_RANK: invalid rank
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
*** and potentially your MPI job)
Вот мой код:
# include <mpi.h>
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <vector>
#define ROWS 10
#define COLONS 10
#define MASTER 0
using namespace std;
int main(int argc, char *argv[]) {
int rows;
int averow=0;
int extra=0;
int offset;
int numprocs;
MPI_Status status;
int matrixA[ROWS][COLONS];
int matrixB[ROWS][COLONS];
int matrixC[ROWS][COLONS];
for (int i = 0; i < COLONS; i++) {
for (int j = 0; j < ROWS; j++) {
matrixA[i][j] = rand() % 10;
matrixB[i][j] = rand() % 10;
}
}
int my_id;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
if (my_id == MASTER) {
averow = ROWS/numprocs;
extra = ROWS % numprocs;
offset = 0;
/* Send matrix data to the worker tasks */
for (int dest = 1; dest <= numprocs; dest++) {
rows = (dest <= extra) ? averow + 1 : averow;
printf("Sending %d rows to task %d offset=%d\n", rows, dest, offset);
MPI_Send(&offset, 1, MPI_INT, dest, 1, MPI_COMM_WORLD);
MPI_Send(&rows, 1, MPI_INT, dest, 1, MPI_COMM_WORLD);
MPI_Send(&matrixA[offset][0], rows * ROWS, MPI_DOUBLE, dest, 1,
MPI_COMM_WORLD);
MPI_Send(&matrixB, COLONS * COLONS, MPI_INT, dest, 1,
MPI_COMM_WORLD);
offset = offset + rows;
}
/* Receive results from worker tasks */
for (int i = 1; i <= numprocs; i++) {
int source = i;
MPI_Recv(&offset, 1, MPI_INT, source, 2, MPI_COMM_WORLD, &status);
MPI_Recv(&rows, 1, MPI_INT, source, 2, MPI_COMM_WORLD, &status);
MPI_Recv(&matrixC[offset][0], rows * COLONS, MPI_INT, source, 2,
MPI_COMM_WORLD, &status);
printf("Received results from task %d\n", source);
}
}
if (my_id != MASTER) {
MPI_Recv(&offset, 1, MPI_INT, MASTER, 1, MPI_COMM_WORLD, &status);
MPI_Recv(&rows, 1, MPI_INT, MASTER, 1, MPI_COMM_WORLD, &status);
MPI_Recv(&matrixA, rows * COLONS, MPI_DOUBLE, MASTER, 1, MPI_COMM_WORLD, &status);
MPI_Recv(&matrixB, COLONS * COLONS, MPI_DOUBLE, MASTER, 1,
MPI_COMM_WORLD, &status);
for (int k = 0; k < COLONS; k++) {
for (int i = 0; i < rows; i++) {
matrixC[k][i] = matrixA[k][i] + matrixB[k][i];
}
}
MPI_Send(&offset, 1, MPI_INT, MASTER, 2, MPI_COMM_WORLD);
MPI_Send(&rows, 1, MPI_INT, MASTER, 2, MPI_COMM_WORLD);
MPI_Send(&matrixC, rows * COLONS, MPI_DOUBLE, MASTER, 2,
MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
Я бег этой программы 8 процесса.
У вас есть представление, что я делаю неправильно здесь, ребята? Потому что я ничего не вижу.
Почти всегда нецелесообразно помечать вопрос как C, так и C++. Это программа на C++, хотя мне кажется, что она должна быть C-программой с тривиальными изменениями, и поэтому я удалил тег C. – zwol
Кстати, 'COLONS' должна быть' COLUMNS' на протяжении всей этой программы. – zwol
Я подтверждаю проблему, кстати. Я редактировал то, что программа печатает _before_ сообщение об ошибке, так как это показывает, что ошибка не возникает при первом вызове 'MPI_Send'. – zwol