并行计算初探
2019-02-25
今天是并行计算的第一节课,在介绍完重要性和历史后,老师提了一个问题,作为我们了解并行计算的开始
如何并行地尽快求解个元素的最大值或排序?
老师讲解了求最大值的方法,我觉得挺有趣的,在此做个记录
朴素的串行算法
遍历即可,时间复杂度,需要一个处理器
一般的并行算法
类似淘汰赛的方式,每两个数用一个处理器进行比较,选出较大的数,在所有选出的数中重复该操作
时间复杂度,需要处理器个数
不计代价的并行算法
对于个数的数组,使用个处理器:
- 第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步,处理器对进行检测,修改为对进行检测