Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Многопоточное программирование


Автор: Annuta 2.2.2013, 10:21
Привет всем!
Такой вопрос: есть задача, которая очень долго считается. Хочу разбить её на части и считать параллельно.
Есть два вариант: 
1- открыть 10 консолей и параллельно запустить в в каждой свой кусок;
2- написать на С++ программу, которая создаст 10 потоков для каждого куска.

Дорогие форумчане, скажите, какой способ более рационален ? Что по вашему мнению, даст больший выигрыш в производительности и времени ? 


Спасибо! 

Автор: Фантом 2.2.2013, 13:27
Если задача действительно допускает разбиение на независимые блоки, то с точки зрения быстродействия собственно программы разница будет невелика, но вот на реализацию первого варианта Вы сами, скорее всего, потратите заметно меньше времени.

Автор: DProf 8.2.2013, 17:53
Цитата(Фантом @ 2.2.2013,  13:27)
Если задача действительно допускает разбиение на независимые блоки, то с точки зрения быстродействия собственно программы разница будет невелика

С чего это вдруг такое решение? Если задача А начинает работать только когда закончатся независимые задачи Б, С, Д, Е, Ж, то запараллелить Б, С, Д, Е, Ж милое дело.

10 консолей - это не для программиста )
А если потом придется еще 10 раз эту же задачу решать? 100 консолей в сумме откроете? а если 100 раз ?

Автор: Фантом 8.2.2013, 19:05
Цитата(DProf @  8.2.2013,  18:53 Найти цитируемый пост)
С чего это вдруг такое решение? Если задача А начинает работать только когда закончатся независимые задачи Б, С, Д, Е, Ж, то запараллелить Б, С, Д, Е, Ж милое дело.


Прочитайте выше (и внимательно) вопрос, на который я давал ответ.  smile 

Цитата(DProf @  8.2.2013,  18:53 Найти цитируемый пост)
А если потом придется еще 10 раз эту же задачу решать? 100 консолей в сумме откроете? а если 100 раз ?

А это надо в условии оговаривать, а в среднем такая ситуация менее вероятна. К тому же открыть сколько угодно консолей (а точнее, запустить сколько угодно независимых процессов) можно с помощью простейшего внешнего скрипта.

Автор: Annuta 28.2.2013, 10:47
ОК, спасибо за обсуждение! 

Автор: baldina 5.3.2013, 10:36
Цитата(DProf @  8.2.2013,  17:53 Найти цитируемый пост)
10 консолей - это не для программиста )

консоль - условность. поиск оптимального пути решения задачи (в т.ч. по времени реализации) вполне инженерная, программистская задача.

Автор: svlary 14.3.2013, 12:37
Цитата(Annuta @  2.2.2013,  10:21 Найти цитируемый пост)
есть задача, которая очень долго считается.


Если проблема в том, что задача долго именно СЧИТАЕТСЯ (т.е. занимает процессор), то хоть как Вы её разбивайте, хоть на консоли, хоть на нитки, хоть на процессы, хоть вдоль, хоть поперек : результат будет один с очень небольшими отклонениями.

Для того, что бы задача, критическая по вычислительной мощности считалась быстрее, надо поднять вычислительную мощность ПРОЦЕССОРА. 

Проще говоря, в поллитровую бутылку не налить литр пива, хоть как её разбивай на части...

Автор: xvr 14.3.2013, 13:30
Цитата(svlary @  14.3.2013,  12:37 Найти цитируемый пост)
Если проблема в том, что задача долго именно СЧИТАЕТСЯ (т.е. занимает процессор), то хоть как Вы её разбивайте, хоть на консоли, хоть на нитки, хоть на процессы, хоть вдоль, хоть поперек : результат будет один с очень небольшими отклонениями.
Не всегда. Если в машине больше одного процессорного ядра (а их сейчас практически везде больше одного), то процесс ускорится.

Цитата(svlary @  14.3.2013,  12:37 Найти цитируемый пост)
Проще говоря, в поллитровую бутылку не налить литр пива, хоть как её разбивай на части... 

Угу, но можно взять еще несколько бутылок  smile 

Автор: bsa 14.3.2013, 16:14
svlary, все зависит от задачи. Есть задачи, которые легко распараллеливаются (единообразная обработка кучи несвязанных данных), а есть которые в принципе не параллелятся (когда способ обработки i-го значения зависит от результата обработки i-1), но такое встречается значительно реже.

Автор: mkvih 16.6.2014, 21:33
Хотелось бы добавить, что можно выделить 2 технологии многопоточности.

Первый вариант классический - несколько потоков - стартуют одновременно, выполняют какие-то свои задачи и потом "складывают" свои результаты.

Второй вариант - организовать конвейер. Такая техника используется, например в графических приложениях. Несколько "работников" по цепочке передают некоторые данные. Такая техника позволяет повысить количество кадров в секунду. Если важна частота "продуктов" в единицу времени - хорош этот вариант. 
http://www.youtube.com/watch?v=Sk4puph6GCI

Вроде бы ещё шаблоны существуют...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)