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
posted @ 2019-04-06 17:16  e-yi  阅读(54)  评论(0)    收藏  举报  来源