Доброго времени суток!
Расскажите плз с чего начать выполнять задание:
Есть программа, написанная на С++ с использованием объектов.
Есть компьютер: 2 2х ядерных процессора.
ОС: Linux oSuSe 10.3
Вопрос:
Можно ли вручную распараллелить программу между 4мя ядрами?
Можно ли вручную распараллелить программу между 2мя процессорами?
Какие средства посоветуете для выполнения задачи?
Посоветуйте литературу.
становится понятно - код придется менять, или даже переписывать
а раз уж так, то стоит оглянутся в сторону более универсальных средств
MPI например розпаралелит ваши счисления не только на локальном процессоре, но и между несколькими машинами (т.н. кластер), при чем прозрачно
литературу не берусь советовать, так как непосредственно дела не имел
в универе когда проходили советовали начинать отсюда http://parallel.ru/tech/tech_dev/mpi.html
а в общем, если это вам подойдет то в сети примеров и документации достаточно
Проще всего, если я правильно понял задачу, -- отфоркануть четыре процесса в твоей программе. Потом приписать каждый из них к отдельному ядру. Это тоже потребует переписывания кода, но не столь глобального. И только тогда у тебя будет возможность вручную распорядиться, какой процесс идет на какой CPU. Threads тебе такой возможности не дадут, ядро будет само решать, что куда отправить.
Если я понял задачу неправильно -- сформулируй ее четче.
Bombers launch with no recall + Minutes warning of the missile fall
Take a look at your last sky + Guessing you won't have the time to cry
--- Iron Maiden (Brouther Than A Thousand Suns, 2006)
А что за задача, можно по-подробнее?
Например, для распараллеливания вычислительных задач хорошо подходит OpenMP, поддержка которого появилась в GCC, начиная с версии 4.2.
В программе расставляются специальные директивы, анализируя которые, компилятор САМ распараллеливает программу на потоки, т.е. не нужно явно использовать pthreads, fork и т.д.
Проще всего, если я правильно понял задачу, -- отфоркануть четыре процесса в твоей программе. Потом приписать каждый из них к отдельному ядру. Это тоже потребует переписывания кода, но не столь глобального. И только тогда у тебя будет возможность вручную распорядиться, какой процесс идет на какой CPU.
то есть делаем 4 процесса и потом просто их развешиваем по ядрам? я правильно понял?
А что за задача, можно по-подробнее?
Задача вычислительная. Много частиц летят в пространстве. Необходимо считать взаимодействие частиц друг с другом. Хочется использовать паралельные алгоритмы для оптимизации расчетов.
Как раз должно легко получиться с OpenMP.
Тем более, что тут нужны потоки, а не процессы, т.к. данные о координатах и импульсах (или чего у вас там) удобнее хранить в общей памяти, а не передавать каким-либо образом между процессами. Наверное, внешний цикл для данного момента времени будет по частицам, тогда его то и следует распараллеливать. Либо распараллеливать ту часть, которая будет считать взаимодействие данной частицы с остальными.
"Развешивание" по ядрам/процессорам -- задача ОС. Как только у вас появится несколько вычислительных процессов/потоков, они распределятся по ядрам автоматически. При этом ядро linux должно быть собрано с поддержкой smp, что имеет место в большинстве современных дистрибутивов. Ничего особенного для распределения задач по ядрам одного многоядерного процессора делать не нужно, т.к. с точки зрения ОС два процессора по два ядра и один процессор с 4мя ядрами (или 4 одноядерных процессора) ничем не отличаются.
Я делал задачку (считались численно интегралы для набора точек) с OpenMP -- на двуядерной машине ускорение было в 1.95-1.97 раза, при этом в код программы было добавлено всего несколько директив.