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

搜索
背景设置