Все здесь в основном правы, но вот быстрый и грязный способ разделить работу и сохранить занятость всех процессоров.Это работает лучше всего, когда 1) создание потоков стоит дороже по сравнению с работой, выполняемой на итерации 2) большинство итераций занимает примерно одинаковое количество времени для завершения
Во-первых, создайте 1 поток на процессор / ядро.Это ваши рабочие темы.Они бездействуют, пока им не скажут что-то сделать.
Теперь разделите свою работу так, чтобы работать так, чтобы данные, которые необходимы одновременно, были близко друг к другу.Под этим я подразумеваю, что если бы вы обрабатывали массив из десяти элементов на двухпроцессорном компьютере, вы бы разбили его так, чтобы одна группа составляла элементы 1,2,3,4,5, а другая - 6,7, 8,9,10.Возможно, у вас возникнет соблазн разделить его на 1,3,5,7,9 и 2,4,6,8,10, но тогда вы вызовете еще больше ложного обмена (http://en.wikipedia.org/wiki/False_sharing) в вашем кеше.
Так что теперь, когда у вас есть поток на процессор и группа данных для каждого потока, вы просто указываете каждому потоку работать с независимой группой этих данных.
Так что в вашем случае я бы сделалчто-то вроде этого.
for (int t=0;t<n_processors;++t)
{
thread[t]=create_thread();
datamin[t]=t*(i_max/n_processors);
datamax[t]=(t+1)*(i_max/n_processors);
}
for (int t=0;t<n_processors;++t)
do_work(thread[t], datamin[t], datamax[t], j_max)
//wait for all threads to be done
//continue with rest of the program.
Конечно, я пропустил такие вещи, как работа с вашими данными, которые не являются целым кратным числом процессоров, но это легко исправить.
Кроме того, еслиВы не противостоите сторонним библиотекам, Intel TBB (многопоточные строительные блоки) отлично справляется с абстрагированием от вас и позволяет вам приступить к реальной работе, которую вы хотите сделать.