Parallel Architecture Lecture6
Parallel Architecture Lecture6
并行算法设计的例子
以计算矩阵乘法为例,普通的串行算法的复杂度为
void matrixMultiply(int n, int m, int p, int A[n][m], int B[m][p], int C[n][p]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < p; j++) {
C[i][j] = 0;
for (int k = 0; k < m; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
简单分块算法
流程
类比单个元素的计算,结果矩阵中对应的一个子矩阵也可以用两个矩阵的对应行列组成的矩阵相乘得到,这样就可以局部计算结果矩阵中的子矩阵:
分块算法首先把矩阵分块,有几块就用几个处理器,
计算阶段,每个处理器都把自己存的
之后,每个
算出
复杂度
空间复杂度
因为每个处理器只需要跑一轮循环即可,但要存3个矩阵的信息。
Question
它的时间复杂度是什么?(算上通信开销应该不是
Cannon算法
流程
初始化
先像上面一样把各个矩阵块分配给处理器:
只有颜色相同的才能相乘(其实就是上边提到的
重排
这样其实就是为了把所有能乘的
描述
① 对准:
所有块
所有块
② 所有处理器
③ 移位:
④ 转②执行
例
以处理器
计算完执行 ③:
i
可以看出,这个处理器上算的所有小矩阵,头尾的数都是12,比如
后面两次位移:
伪代码
输入:
Cannon Algorithm |
---|
Begin for for all if endif if endif endfor endfor for all for for all endfor endfor |
复杂度
算法有
i
这里主要是对计算阶段说的。
计算阶段复杂度:
在每个循环中,每个处理器发送和接收两个大小为
每个处理器的通信复杂度:
并行开销:
DNS
结果矩阵有几个元素就用几个处理器,总共用
TODO
细节待补充。