数值计算
- 矩阵
- 矩阵乘法
- 串行
- 并行
- 划分
- 直接并行实现
- 递归实现
- Cannon 算法
- Systolic 算法
- 求解线性方程组
- 高斯消去法
- 迭代方法
- 稀疏线性方程组及雅可比迭代
- 高斯-塞德尔松驰
- 红黑排序法
- 高阶差分法
- 过度松驰法
矩阵乘法-并行
- 使用n个处理器,
- 每个处理A阵的一行,与B阵的每一列相乘,得到C的一行。 或者:每个处理B阵的一列,与A阵的每一行相乘,得到C的一列
- 复杂度为O(n2)
- 使用n2个处理器
- 每个处理A的一行与B的一列相乘,得到C的一个点。
- 复杂度为O(n)。
- 使用n3个处理器
- 用n个处理器来完成A的一行与B的一列的乘积,然后要相加。
- 需要并行化内层的循环。
- 复杂度为O(logn)。注意不是O(1),也不是O(n)。
效率分析
- 进一步增加处理器的数目不能提高其效率。 O(logn)是下界。
- 以上未考虑通信的开销。
矩阵乘法-划分
for (p = 0; p < s; p++)
for (q = 0; q < s; q++)
{
Cp,q = 0; /* clear elements of submatrix */
for (r = 0; r < m; r++) /* submatrix multiplication &*/
Cp,q = Cp,q + Ap,r * Br,q; /*add to accum. submatrix*/
}
直接实现:
- 通信:
- 每个从进程:收到一行和一列,以及要返回一个结果。有n^2个从进程
- 所以tcomm=n^2(2tstartup+2ntdata)+n^2(tstartup+tdata)
- 利用广播可以减少tstartup时间。
- Tcomm=(tstartup+n^2tdata)+n^2(tstartup +tdata)
- 时间主要消耗在数据返回上,因为tstartup 较大。
- <b>用gather 表面上可以简化,实际上是一样的。</b>
- 计算:
- Tcomp=2n
- 划分为子矩阵的复杂度分析,与之类似。
递归
Canon算法
-
- 所有块Aij(0≤i,j≤sqrt(p) - 1)向左循环移动i步;
- 所有块Bij(0≤i,j≤sqrt(p) - 1))向上循环移动j步;
- 所有处理器Pi,j做执行Ai,j和Bi,j的乘-加运算;
-
- A的每个块向左循环移动一步;
- B的每个块向上循环移动一步;
- 转2执行sqrt(p)-1次;
矩阵乘法-Systolic乘法
求解线性方程组
- 稠密方程
- 高斯消元法
- 转化为三角方程组
- 串行复杂度O(n3)
- 并行复杂度O(n2)
- 稀疏方程
- 取决于迭代方法和迭代次数,典型复杂度O(log n)
- Jacobi 迭代
- Gauss-Seidel relaxation (not good for parallelization)
- Red-Black ordering
- Multigrid