并行计算初探
		 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步,处理器对进行检测,修改为对进行检测