Распараллеливание с использованием операции умножения матрицы на вектор OpenMpi - PullRequest
0 голосов
/ 27 апреля 2019

Я написал простую операцию умножения матрицы на вектор.В этом коде матрица - это набор матриц, вектор - это набор векторов, доступ к которым осуществляется через смещение к i * matrixSize или i * vectorSize.Теперь я хочу распараллелить эту задачу, используя OpenMpi, используя следующий подход: разделить количество всех входных матриц и векторов поровну между процессами и умножить их по отдельности в каждом, а в конце собрать результат в аналогичный равномерный результат.Я не очень хорош в C. Я не совсем понимаю, как обстоят дела с моей структурой, где набор матриц и векторов представлен одним беззнаковым указателем char *.Как распараллелить эту операцию?

Я подключил openmpi к своему проекту и выполнил несколько тестовых заданий в руководстве, но я не могу понять, как выполнить задачу с такой структурой.Возможно, есть и другие способы разбить данные?

unsigned int* multiplyMatrixColumn(unsigned char* matrix, unsigned char* vector, int partition) {

    int i, m, n;
    int rank, size;
    unsigned char rmatrixbuf[2500], rvectorbuf[2500];
    int * result = malloc(partition * rows * sizeof(int));
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    // What is the correct way to break the data?
    //MPI_Scatter(matrix, 2500, MPI_UNSIGNED_CHAR, rmatrixbuf, 2500, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
    //MPI_Scatter(vector, 2500, MPI_UNSIGNED_CHAR, rvectorbuf, 2500, MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD);
    for (i = 0; i < partition; i++)
    {
        for (m = 0; m < rows; m++) {
            result[(i % buffered) * rows + m] = 0;
            for (n = 0; n < columns; n++)
                result[(i % buffered) * rows + m] += matrix[(i % buffered) * rows * columns + m * columns + n]
                * vector[(i % buffered) * columns + n];
        }
    }
    //MPI_Gather(I can not understand how to aggregate data);

    return result;
}

Я хочу получить поведение как с прагмой openMP (прагма openmp параллельная для), где цикл for разбивается на несколько процессов и выполняется параллельно длякаждая операция умножения.

...