【发布时间】:2014-12-18 18:23:53
【问题描述】:
假设我们有 T 个线程,我们想将大小为 N 的问题分配给这些线程。每个线程都会选择该问题的一部分来执行它。每个线程将使用 thread_id(从 0 到 T-1 的数字)、T 和 N 来计算子问题的范围。假设子问题的范围是[S, E),其中S和E属于[0, N]。
例如。假设我们有一个整数数组。数组的大小为 10。我们希望将该数组的每个元素增加 1,并且我们希望使用 4 个线程并行执行此操作。
- thread_id==0 的第一个线程将使用范围 [0, 3)
- thread_id==1 的第二个线程将使用范围 [3, 6)
- thread_id==2 的第三个线程将使用范围 [6, 8)
- thread_id==3 的第 4 个线程将使用范围 [8, 10)
有人知道计算这些范围的快速算法吗?最好没有原子或分支。
【问题讨论】:
-
实际上,创建线程比任何合理的计算范围慢一千倍。别担心。
-
@MooingDuck 你能详细说明一下吗?我是误读了问题还是遗漏了什么?该操作不要求调度,只是范围的划分。
-
你对这些确切的范围有多挑剔?如果一个不同的线程的范围稍微小一点,而不是总是最后一个,那可以吗?
-
@ciamej:我的观点是,如果我使用一种速度极慢的算法来计算范围,它不会对整个代码的性能产生可衡量的影响,从而使整个问题变得毫无意义。有点像“嘿,我要把我所有的东西从 A 家搬到 B 家;我应该把闹钟放在一边以减轻体重吗?”
-
@潘。 Christopouls Charit:对于你的例子,如果你得到一个不同的范围,但仍然是一个公平的范围——比如 [0,2)、[2,5)、[5,7)、[7,10),这有关系吗?