【问题标题】:Time complexity of Parallel Reduction Algorithm并行减少算法的时间复杂度
【发布时间】:2019-04-21 16:33:28
【问题描述】:
目前我正在研究 GPU 架构及其概念。在并行缩减技术中,在下面的 NVIDIA 指南中,第 29 张幻灯片中显示的时间复杂度如何达到 O(N/P + log N)?我知道对于 N 个线程,它将是 O(log N)。如果我们有 P 个并行线程可用,那么时间复杂度应该是 O((N/P)*log P)。正确的?我在这里错在哪里?
Parallel Reduction Techniques
【问题讨论】:
标签:
parallel-processing
cuda
time-complexity
gpu
reduction
【解决方案1】:
我想用一个例子来解释一下,考虑这个包含 N=8 个元素的数组
1 2 3 4 5 6 7 8
并行减少将在以下步骤中发生
1 2 3 4 5 6 7 8
3 7 11 15
10 26
36
如果计算归约操作的次数,我们在第一步、第二步和第三步分别有 4,2 和 1。所以我们的操作总数是 4+2+1=7=N-1 并且我们在 O(N) 中做了所有的减少,我们也有 log(8)=3(这是对基数为 2)步骤所以我们为执行这些步骤付出了代价,即 O(logN)。因此,如果我们使用单个线程以这种方式减少,我们将两个成本相加,因为它们彼此分开发生并且我们有 O(N+logN)。其中 O(N) 是执行所有操作的成本,O(logN) 是执行所有步骤的成本。现在没有办法并行化步骤的成本,因为它们必须按顺序发生。但是,我们可以使用多个线程来执行操作并将 O(N) 成本除以 O(N/P)。所以我们有
Total cost = O(N/P + logN)
【解决方案2】:
我不熟悉 cuda,但通常在你做的并行缩减中
- 首先在每个处理器上进行局部缩减,这将花费 O(N/P),然后
- 计算 P 个局部结果的缩减,这需要 O(log P) 步。
因此你得到 O(N/P + log P)。