Разделение работы между потоками

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

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

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


person questions    schedule 14.03.2012    source источник


Ответы (3)


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

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

person ElKamina    schedule 14.03.2012
comment
@Elkamina- Вопрос в том, как определить количество потоков на основе диапазона, который не слишком высок и не слишком мал. - person questions; 16.03.2012
comment
@questions Это зависит от множества других вещей! Сколько ядер у вас есть, как долго вы можете позволить себе ждать, сколько у вас памяти, сколько памяти потребляет каждый поток, каково время ввода-вывода для каждого потока... В простом сценарии с интенсивными вычислениями, который не требует много RAM Я бы сказал, запускайте столько потоков, сколько ядер в вашем компьютере. - person ElKamina; 16.03.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
person Community    schedule 14.03.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 нельзя добавить в моном

person Wilmer E. Henao    schedule 14.03.2012