鉴于未排序的数组,我在一篇文章中读到,可以使用n平方处理器以O(1)复杂度获得数组的最大元素。任何人都可以解释它背后的机制吗?
答案 0 :(得分:3)
算法背后的机制基于我只能称之为肮脏的技巧。也就是说,我们允许所有处理器同时写入相同的共享内存位置。如果它们都写入相同的值,则结果被认为是明确定义的。
这可用于实现并行AND和并行OR运算符。这是例如parallel-OR:
result := false
for i in 0 to N-1 parallel do
if a[i] then
result := a[i]
我们也允许同时阅读。
这是MAX算法:
N := a.length
for i in 0 to N-1 parallel do
m[i] := true
for i in 0 to N-1 parallel do
for j in 0 to N-1 parallel do
if a[i] < a[j] /* dirty trick: simultaneous read by many processors */
then m[i] := false /* dirty trick: many processors write to m[i] at once */
for i in 0 to N-1 parallel do
if m[i]
then max := a[i] /* dirty trick: many processors write to max at once */
return max
允许这些技巧的抽象体系结构称为CRCW PRAM。
答案 1 :(得分:0)
这是| V | ad的答案(已删除)的后续行动,
您使用另一个大小为n
的数组(让我们称之为B),
现在,您使用n-1
处理器将任何元素a[i], i=0,...,n-1
与所有其他元素a[0],...,a[i-1],a[i+1],...,a[n-1]
进行比较,找到j={1,...,n-1}
的每个处理器a[0] > a[j]
都将适用B[i]=B[i]+1
,此外,它会检查是否B[i]=n-1
,如果是,它会宣布该元素i是最大元素。