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