Предположим, у вас N одинаково мощных процессоров.
Если нет зависимостей, переносимых в цикле (например, ничто в итерации i не используется последующими итерациями), тогда вы можете просто запустить итерации цикла 0..X / N на ЦП 1 и итерации (X / N) +1 .. (2 * X / N) на ЦП 2 и т. Д., Предполагая, что каждая итерация занимает ровно одинаковое количество времени или, по крайней мере, среднее значение, которое не изменяется в широких пределах.
Если есть , переносятся ли петли
зависимости, у вас могут возникнуть проблемы, если итерация i зависит от всех предыдущих итераций. Если это зависит только от предыдущих k итераций, вы можете сделать так, чтобы CPU1 делал итерации 0..X / N, а CPU2 делал итерации X / Nk .. (2 * X / N), тратя впустую некоторую работу, но позволяя CPU2 собирать необходимые результаты и т. д. для всех процессоров.
Если итерации занимают сильно различающиеся промежутки времени, лучше настроить рабочий список, содержащий итерации,
и заставьте процессоры захватывать итерации из рабочего списка, когда они завершают предыдущие итерации. Таким образом, работа распределяется по мере появления спроса. Вы должны быть уверены, что время, затраченное на каждую единицу работы, намного больше, чем усилия, чтобы получить работу, иначе вы не получите параллельного преимущества; Одним из способов сделать это является получение небольшого диапазона итераций из рабочего списка, чтобы общая работа в этом диапазоне значительно превышала затраты на планирование.