我写了一个简单的矩阵向量乘法运算。 在这段代码中,矩阵是矩阵的集合,向量是向量的集合,可以通过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;
}
我想获得与pragma openMP(并行于pragma openmp)的行为,其中for循环被拆分为多个进程并针对每个乘法运算并行执行。