April 28th, 2015

про жизнь, охота

О Балтиморе и про ужасный расистский Юг

У большинства людей в голове, почему-то, существует убеждение, что Юг США -- это территория, где проживает огромное количество расистов. И что, мол, с чернокожими тут обращаются очень плохо. Ну, а как же, ведь Ку Клукс Клан был основан в городе Пуласки, штат Теннесси.

А между тем посмотрите на последние расовые волнения -- где они происходят? Вот то-то и оно, что на прекрасных человеколюбивых Северах и Западах.

А на Юге чёрные и белые живут бок о бок уже веками, и давно уже успели притереться друг к другу.

Многонитевой вопрос

Я достаточно давно не брал в руки эти шашки, так что нужен совет.

Вот есть у меня массив A, длиною в 96 элементов.

Каждый элемент массива -- ещё один массив B, с цифЫрками int, которые надо хитрым образом сгрызть и выдать результат. Затем результаты складываются, и получается то, что мне надо.

Ну, вот, например, для 8 нитей, обрабатывающих эти данные в массиве B, распределение работы кристально ясно и логично:

Делим 96 на 8, получаем, что каждой нити можно поручить обработку 12 элементов массива A (длину куска я храню в переменной int span).

Дальше нити №0 выдаём 0-11, нити №1 -- 12-23, и так далее. Последней нити выдаётся span + всё, что осталось (если бы массив был не 96, а 97 элементов, ей бы досталось 13 элементов).

Всё просто и понятно.

Но если я захочу сделать 64 нити (у меня тут завалился сервер с 64 процессорами), то получится дурево. Потому что 96 на 64 не делится. Вернее, делиться-то оно делится, но получается-то 1. Таким образом, 63 нити будут обрабатывать каждая по одному элементу массива A, а нити №63 достанется обработка 32 элементов массива А. Налицо перекос.

Как проще и лучше всего выйти из такого положения, как лучше всего распределить работу? То-есть, наиболее приближённой к идеалу я вижу следующую ситуацию -- нити с 0 по 31 получают по 2 элемента массива А, а все остальные -- по одному. Но как бы это алгоритмизировать? На остаток после деления смотреть?