cannon算法的原理及MPI C语言实现
前提(可以看了下面回来再看):
1. 矩阵A是一个n*n方阵
2. 有p个处理器,每个处理器得到n/sqrt(p)个数据,(注意:此处好像要求n是一个平方数。因为cannon要求每个分块大小一样)
3. 一个高效的串行矩阵乘法算法(dgemm,sgemm),用于计算块与块之间相乘
看下面链接
https://blog.csdn.net/u013720726/article/details/70667697
关于对齐再补充一点方便理解:
...对齐的目的就是对齐,不对齐就没法算

实现见下,缺陷有:
1. 没有实现读入数据和数据的分发
2. 没有实现数据的收集和整合(或者好看的打印)
3. 使用的串行矩阵计算代码效率较低
注意:processor数目要求是平方数,n要求是可以被sqrt(processor数量)乘除的数
另外我的分块方式是(数字为rank)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "mpi.h"
#define DEBUG 1
void MatrixMultiplyAgg(int n, double *a, double *b, double *c);
main(int argc, char *argv[])
{
int i, j, k, m, p;
int n, nlocal;
d

浙公网安备 33010602011771号