прыгая, вы и ваша семья отлично справляетесь с ситуацией.
Я работаю над программой для умножения матрицы и вектора, используя многопоточность (MPI) в C. Вот оно:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int rank, size;
int mat[2][3] = {{1, 2, 3}, {4, 5, 6}};
int vector[3] = {7, 8, 9};
int vecRes[3] = {50, 122};
int nbLigMat = sizeof(mat) / sizeof(mat[0]);
int nbColMat = sizeof(mat[0]) / sizeof(int);
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int sendbuf[sizeof(vector) / sizeof(mat[0])], recvbuf, recvcounts[size];
if (size == nbColMat)
{
for (int i = 0; i < nbLigMat; i++)
sendbuf[i] = mat[i][rank] * vector[rank];
for (int i = 0; i < size; i++)
recvcounts[i] = 1;
MPI_Reduce_scatter(sendbuf, &recvbuf, recvcounts, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
if (rank < nbLigMat)
printf("Processeur num %d / outputVector[%d] : %d\n", rank, rank, recvbuf);
}
else
{
if (rank == 0)
{
printf("Le nombre de processeurs necessaires est : %d\n", nbColMat);
}
}
MPI_Finalize();
return 0;
}
Это работает для следующих пар матрица / вектор: {{1, 2}, {3, 4}} и {5, 6}; {{1, 2, 3}, {4, 5, 6}} и {7, 8, 9}; {{1, 2, 3, 4}, {5, 6, 7, 8}} и {9, 10, 11, 12}, но, например, с {{1, 2, 3}, {4, 5, 6 }, {7, 8, 9}} и {10, 11, 12}, результат должен быть {68, 167, 266}, но мой выходной вектор равен {68, 167, 476}.
Я понял, что, я не знаю, по какой причине, элементы в моем входном векторе меняются между началом и первым для l oop для каждого процесса, даже если я не взаимодействую с ним :
В процессе 0 мой входной вектор стал {40, 11, 12} в первом l oop и {40, 280, 12} в конце. В процессе 1, {55, 11, 12}, а затем {55, 88, 12}. В р2, {72, 11, 12}, а затем {72, 108, 12}. Эти числа соответствуют номерам результатов вычисления mat [i] [rank] * vector [rank] в первом l oop, но я не понимаю, как они попадают в мой входной вектор.
Возможно, я неправильно понял, как работает MPI, но мне не удается выяснить, как эти числа попадают туда, и перезаписать мой входной вектор. Прыгающий объяснение достаточно ясно ..