Разделение работы между потоками - PullRequest
0 голосов
/ 14 марта 2012

Я знаю, что есть похожие вопросы, но никто из них не ответил на мой вопрос.

Я пытаюсь разделить большой цикл (2 ^ 60) на несколько меньших циклов, распределенных по потокам. Диапазон петли может варьироваться от (2 ^ 4) до (2 ^ 60). Мой вопрос: как мне выбрать оптимальное количество (max = 8, min = 1) потоков и как распределить работу между ними. Если кто-то может показать пример, это было бы здорово.

Например .. Я пытался разделить 2 ^ 32 среди 8 потоков. Таким образом, каждый поток будет выполнять 2 ^ 29 объема работы, верно? но как мне разделить диапазон? (0 ... 2 ^ 29), (2 ^ 29 .... 2 ^ 30) ...? Извините, если это плохая математика, но мои умы больше не работают должным образом.

Ответы [ 3 ]

0 голосов
/ 14 марта 2012

Легко сделать, просто разделить число на количество потоков и использовать его.Пусть m = пол (н / к).0 .. (m-1), m .. (2m-1) .... - начало и конец цикла.

Не уверен, почему вы одержимы 2^a с.Есть ли какая-то конкретная причина?В противном случае делайте так, как вы делаете для любого другого диапазона.Разделите поровну.

0 голосов
/ 14 марта 2012

Вот интервалы, которые я получил

(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 нельзя добавить в моном

0 голосов
/ 14 марта 2012

Интервалы 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
...