Вот есть у меня массив 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 элемента массива А, а все остальные -- по одному. Но как бы это алгоритмизировать? На остаток после деления смотреть?