在线程之间划分工作

时间:2012-03-14 00:45:29

标签: multithreading algorithm boost-thread

我知道有类似的问题,但没有人回答我的问题。

我正在尝试将一个大循环(2 ^ 60)分成几个在线程中分布的较小循环。环的范围可以从(2 ^ 4)到(2 ^ 60)变化。我的问题是如何确定线程的最佳数量(max = 8,min = 1)以及如何在它们之间划分工作。如果有人可以展示一个很棒的例子。

例如..我试图在8个线程中划分2 ^ 32。所以每个线程都会做2 ^ 29的工作量吧?但我如何划分范围? (0 ... 2 ^ 29),(2 ^ 29 .... 2 ^ 30)......?对不起,如果这是不好的数学,但我的思想不再正常工作。

3 个答案:

答案 0 :(得分:0)

2E29的间隔时间如下:

0 * 2E29 ~ 1 * 2E29    =     0           ~ 2E29
1 * 2E29 ~ 2 * 2E29    =     2E29        ~ 2E30
2 * 2E29 ~ 3 * 2E29    =     2E30        ~ 2E30 + 2E29
3 * 2E29 ~ 4 * 2E29    =     2E30 + 2E29 ~ 2E31

答案 1 :(得分:0)

简单的事情就是将数字除以线程数并使用它。设m = floor(n / k)。 0 ..(m-1),m ..(2m-1)....是循环的开始和结束。

不确定为什么要迷恋2^a。有什么具体原因吗?否则就像对待任何其他范围一样。平分。

答案 2 :(得分:0)

以下是我的间隔

(0, 2^29 - 1)

(2^29, 2^30 - 1)

(2^30, 2^30 + 2^29 -1)

(2^30 + 2^29, 2^31 - 1)

(2^31, 2^31 + 2^29 - 1)

(2^31 + 2^29, 2^31 + 2^30 - 1)

(2^31 + 2^30, 2^31 + 2^30 + 2^29 - 1)

(2^31 + 2^30 + 2^29, 2^32 - 1)
你可能很困惑因为2^29 + 2^29 = 2^30(一个单项式的)。但是2^30 + 2^29无法添加到单项