今天是并行计算的第一节课,在介绍完重要性和历史后,老师提了一个问题,作为我们了解并行计算的开始
如何并行地尽快求解
个元素的最大值或排序?老师讲解了求最大值的方法,我觉得挺有趣的,在此做个记录
朴素的串行算法
遍历即可,时间复杂度
,需要一个处理器一般的并行算法
类似淘汰赛的方式,每两个数用一个处理器进行比较,选出较大的数,在所有选出的数中重复该操作
时间复杂度
,需要处理器个数不计代价的并行算法
对于
个数的数组,使用个处理器:
- 第1步, 每个处理器,比较第和第个数的大小,得到结果方阵
第2步, 再使用一个列向量
,处理器初始化每个分量为第3步, 如果
,处理器置 (此处可能有写冲突,但不影响结果)第4步,处理器
对的对应分量进行检测。如此,只有最大的那个数对应的行全为,即对应的分量为时间复杂度为
伪代码如下
begin for 1 ≤ i, j ≤ p par-do //工作量O(p2); 时间O(1),因为允许同时读 if A[i] ≥ A[j] then B[i, j]=1 else B[i, j]=0 end if end for for 1 ≤ i ≤ p par-do //工作量O(p2); 时间O(1),因为允许同时写 M[i] = B[i,1] ∧ B[i,2] ∧ … ∧ B[i,p] end for end
举例如下:
A 3 5 8 4
B 1 0 0 0 1 1 0 1 1 1 1 1 1 0 0 1
M 0 0 1 0 最大数为
更新
布置了作业
改写求最大值问题的并行算法,要求不使用数组M。
很简单,不使用
数组,就直接在上修改第3步,处理器
置 ,修改为置第4步,处理器
对进行检测,修改为对进行检测