假设您有两个无符号整数(在两个数组a,b中给出n个数字),并且您有p个处理器,每个处理器可以添加2个数字并计算进位(如果存在)。是否有可能在时间O(p + n/p)上计算a + b?我一直试图将输入分为每个(n/p)的p个区间,但我不知道如何处理进位。并行添加两个整数
Q
并行添加两个整数
1
A
回答
1
我相信这是可能的。我会假设n >= p
,并且您的p处理器被安排在一个无共享架构中,处理器通过消息传递进行通信。
如果你的数字还没有分布在p个处理器中,而是聚集在一个不参与计算的主处理器上,你只需分割a和b来创建p个连续数字的块,然后将它们发送给每个处理器。这需要消息复杂度O(p)
。
然后,每个处理器计算其数字块的两个和,假设其将从其前身接收进位1,即具有下一个较低有效位数的块的处理器,并且另一个假设进位将为0.它还将计算其两种情况下每种情况下的传出运载量。计算时间复杂度为O(ceil(n/p))
,因为每个处理器必须保存一个整数位数。
当然,具有最低有效位数的块的处理器只需要计算一个和。一旦它完成了计算,它就会将其所得数字的份额发送回主设备,并将其传出到携带下一个更高有效位数块的处理器。下一个处理器决定两个结果场景中的哪一个变为真,将合适的结果数字发送给主设备,并将其输出传送给下一个处理器。等等。
这将为结果和p-1消息携带进一步的p消息。所以消息的复杂性仍然是O(p)
。时间复杂度将为O(p + ceil(n/p))
,因为最后的处理器将不得不等待其前身的p-2
决定要转发两个结果中的哪一个。如果你假设n个数字可以在p个处理器中均匀分布(即n是p的倍数),那么你的建议时间复杂度为O(p + n/p)
就可以了。
这种通过推测计算两个可能结果进行相加的方法与Carry-select adder的工作方式非常相似。
相关问题
- 1. C#合并整数的两个字典,并添加重复
- 2. 添加两个整数变量并显示输出C
- 3. 比较两个numpy数组并添加相同的行
- 4. 在Flex3中添加两个数组整数值
- 5. C程序,其中添加两个整数作为分数
- 6. 添加两个数字
- 7. 两个数据表添加
- 8. 添加两个数字CUDA
- 9. 添加两个函数?
- 10. 添加两个数组
- 11. 并行添加到数组
- 12. 添加两个json对象并排序
- 13. 在两个Compiles中添加固定点整数
- 14. 添加链表所代表的两个整数
- 15. 在Python中添加包含整数的两个字符串值
- 16. 向数据表动态添加行添加两行
- 17. 接受两个整数数组并返回合并数组
- 18. 如何将点并行添加到两个地块? (在R)
- 19. VB.NET比较两个文本文件并添加不足的行
- 20. 比较两个整数并使用差异进行计算
- 21. Lisp两个列表相乘并添加两个值
- 22. 将两个整数添加到数组索引,而不加总它们
- 23. 增加了两个长整数用C
- 24. 我想逐行添加两个文件?
- 25. Datagridview一次添加两个新行
- 26. 添加两个NSDate
- 27. 添加两个表
- 28. 熊猫数据框:比较两个相邻行的值,并添加一列
- 29. 如何添加两个不同的数组并打印结果?
- 30. 通过添加它们的值来合并两个数组
太棒了,谢谢! – Shmoopy 2013-04-17 08:16:45
非常欢迎!感谢您的声音:) – Marcellus 2013-04-17 09:27:01