Матрица-вектор продукта с использованием MPI (C) - не работает должным образом - PullRequest
0 голосов
/ 05 апреля 2020

прыгая, вы и ваша семья отлично справляетесь с ситуацией.

Я работаю над программой для умножения матрицы и вектора, используя многопоточность (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, но мне не удается выяснить, как эти числа попадают туда, и перезаписать мой входной вектор. Прыгающий объяснение достаточно ясно ..

1 Ответ

0 голосов
/ 06 апреля 2020

Я думаю, что ошибка в измерении sendbuf. Если я приведу ваш пример с {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} и {10, 11, 12}, тогда:

sizeof(vector) / sizeof(mat[0]) = 1

что слишком мало, например, в вашем l oop вы присваиваете sendbuf значения от i = 0 до i = nbLigMat-1.

Если я заменю определение sendbuf следующим образом:

int sendbuf[nbLigMat], recvbuf, recvcounts[size];

тогда я получу правильный ответ:

Processeur num 0 / outputVector[0] : 68
Processeur num 1 / outputVector[1] : 167
Processeur num 2 / outputVector[2] : 266
...