Форум программистов, компьютерный форум CyberForum.ru

Вопрос про многопоточность и производительность - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.63
Predlegion
3 / 3 / 0
Регистрация: 21.01.2011
Сообщений: 27
28.10.2011, 02:03     Вопрос про многопоточность и производительность #1
Здравствуйте!
Подскажите пожалуйста ответы на следующие вопросы:

1) Правда ли,что многопоточность в программе позволяет увеличить производительность программы, т.е снизить загрузку ЦП?

2)Например есть программный код. Можно ли каким-нибудь образом, используя определенные средства отладки, посмотреть сколько системных ресурсов(а именно загрузка ЦП) едят отдельные куски этого кода? Т.е узнать, на сколько цикл грузит систему или часть определенной подпрограммы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 02:03     Вопрос про многопоточность и производительность
Посмотрите здесь:

Вопрос про указатели C++
C++ Вопрос про __function
Вопрос про память... C++
вопрос про скобки C++
Вопрос про реестр C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.10.2011, 02:39     Вопрос про многопоточность и производительность #2
подозреваю что при увеличении количества потоков загрузка процессора в единицу времени не снижается а увеличивается. с увеличением числа потоков вы можете ускорить работу вашей программы. но не уменьшить загрузку процессора. например у вас есть 100 файлов которые надо прочитать. если вы будете читать файлы в одном потоке то потратите ( в среднем )времени 100*t. Если вы будете делать чтение в 10 потоков. и каждый из потоков будет читать свои 10 файлов то вы теоретически увеличите скорость работы в 10 раз. Теоретически.. это потому что с увеличением загрузки процессора возможно скорость обработки одного файла в отдельно взятом потоке может увеличиться. Конечно в случае с 10тью небольшими файлами это будет незаметно а вот например с парой сотен достаточно больших файлов разницу можно будет увидеть невооружённым глазом.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.10.2011, 06:00     Вопрос про многопоточность и производительность #3
Приложения, работающие быстрее, далеют это за счёт большей нагрузки на ЦП. Если эту нагрузку снизить, то приложение будет работать медленнее. Фокус в том, что приложение в любом случае должно выполнить определённую работу, состоящую из определённого числа операций. Каждый ЦП способен выполнить некоторое количество n операций в единицу времени. Нагрузка на ЦП - это количество операций, фактически выполняемых процессором в единицу времени. Чем больше операций ЦП выполняет в единицу времени, тем быстрее о выполнит те операции, из которых состоит его работа по исполнению приложения. Многопоточные же приложения могут работать быстрее только на многоядерных процессорах. Причём, есть определённый придел, до которого чем больше в приложении потоков, тем быстрее оно исполняется. Этот придел у каждого ЦП свой и равен количеству ядер. Если потоков слишком много, то несколько потоков выполняются фактически последовательно одним ядром вместо распараллеливания по индивидуальным ядрам для каждого потока. А в последовательном режиме не имеет значения, один поток выполнять, или несколько, за исключением одного нюанса - на переключение между потоками тоже тратится время. Но этот обратный эффект мал до незаметности.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.10.2011, 06:06     Вопрос про многопоточность и производительность #4
Неправильно. Скорость при чтении 100 файлов десятью потоками ВООБЩЕ не увеличится (исключение: двухъядерный процессор, но мы этот случай щас не рассматриваем). В среднем, конечно. А потому, что потоки выполняются не параллельно, на самом деле, а ПСЕВДОПАРАЛЛЕЛЬНО. Для этого примера можно сказать, что потоки будут выполняться последовательно, один за другим. Часть первого потока, часть второго, часть третьего, часть первого и так далее. Так что никакого выигрыша.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.10.2011, 06:56     Вопрос про многопоточность и производительность #5
Цитата Сообщение от kravam Посмотреть сообщение
исключение: двухъядерный процессор, но мы этот случай щас не рассматриваем
Почему? В контексте связи многопоточности и производительности должны быть рассмотрены в первую очередь именно многоядерные процессоры и многопроцессорные компьютеры.

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Часть первого потока, часть второго, часть третьего, часть первого и так далее. Так что никакого выигрыша.
Нет не так. Первый поток в первом ядре, второй - во втором, третий - в третьем, то есть параллельно, за исключением случаев, когда для этого не хватает ядер, тогда номинально параллельно с точки зрения самого приложения, но фактически последовательно, причём, если ядер больше одного, но меньше, чем потоков, то не все потоки исполняются фактически последовательно, а имеет место фактически последовательное исполнение потоков нескольких действительно параллельно исполняемых групп потоков, число таких групп равно числу ядер, исполняющих данное приложение (может часть ядер занято потоками других приложений?).
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.10.2011, 07:11     Вопрос про многопоточность и производительность #6
Ну вы же не будете возражать против тык скыть рассмотрения случая- даже отвечая на данный вопрос-, когда есть ОДИН ПРОЦЕССОР? А тогда получается:
1) В ПЕРВУЮ ОЧЕРЕДЬ рассматриваем работу потоков на нескольких процессорах
2) Во вторую очередь- потоки на одном процессоре
Сдаётся мне, кто-то из нас неправ.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
А вообще это не столь уж важно, я greeezz возражал если что. С вами-то я согласен. Надо уж сразу дополнить, что надо УМЕТЬ закрепить поток за определённым процессором (или ядром, не знаю, как сказать), ждать, что это сделает ось- нехорошо.

Не по теме:

Как сказал Ленин, мы не можем ждать милости от природы, взять их у неё- наша задача



Откровенно, говоря, я не знаю, возможно ли это в принципе, ещё не дошли руки уменя до этого.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
28.10.2011, 09:45     Вопрос про многопоточность и производительность #7
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет не так. Первый поток в первом ядре, второй - во втором, третий - в третьем, то есть параллельно, за исключением случаев, когда для этого не хватает ядер,
Это хорошо но не всё так просто как может показаться. Если есть общий ресурс связан с файлами(ж-диск), потоки будут читать файлы с диска не одновременно, просто в случае многоядерного процессора скорость обработки файлов будет быстрее но никак не считывания с диска.
Цитата Сообщение от taras atavin Посмотреть сообщение
на переключение между потоками тоже тратится время
И сколько времени тратится если они исполняются в одном адресном пространстве процесса( это если говорить про потоки создаваемые на уровне ядра), а здесь не так критично.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
28.10.2011, 18:25     Вопрос про многопоточность и производительность #8
Цитата Сообщение от kravam Посмотреть сообщение
Неправильно. Скорость при чтении 100 файлов десятью потоками ВООБЩЕ не увеличится (исключение: двухъядерный процессор, но мы этот случай щас не рассматриваем)
ну почему-же не рассматриваем. я думаю по умолчанию понятно что при наличии одного процессора в системе так или иначе процессы будут выполнятся синхронно.
И еще могу добавить, что ускорение работы программы во многом зависит от задачи и компонентов программы. К примеру при работе с базой данных при увеличении количества потоков вы можете существенно увеличить скорость обработки данных. но понятно что не до бесконечности.
Пример.
У вас есть таблица в которой есть пара сотен тысяч строк. Допустим вам надо сделать апдейт значения в каком то поле в большей половине строк. Если вы запустите программу в один поток то вы получите время выполнения t, а если вы сделаете два потока то время сократится раза в полтора. Попробуйте на досуге. Естественно что надо подумать о том что процессы не должны мешать друг другу делать апдейты чтобы не сработал дэдлок таблицы. Простейший способ избежать данной проблемы это наличие поля в таблице по которому вы будете разделять строки по потокам.
Revol'veR
 Аватар для Revol'veR
23 / 23 / 2
Регистрация: 05.11.2010
Сообщений: 134
28.10.2011, 18:36     Вопрос про многопоточность и производительность #9
Для проверки параллельного алгоритма лучше проверять его на многопроцессорной машине, нежели на обычном компе. А если процессор допотопный(как правильно сказали ребята), то параллельный алгоритм будет долгим. Как минимум необходим двухъядерный процессор. А лучше - кластерная система
Predlegion
3 / 3 / 0
Регистрация: 21.01.2011
Сообщений: 27
28.10.2011, 23:05  [ТС]     Вопрос про многопоточность и производительность #10
ОК, т.е многопоточные приложение едят столько же ресурсов системы как и однопоточные а может даже и чуть больше
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.10.2011, 23:23     Вопрос про многопоточность и производительность #11
Требуется более развёрнутый ответ, советую почитать Джефри Ритера. Там вопрос изучается тык скыть во всём его разнообразии.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.10.2011, 23:39     Вопрос про многопоточность и производительность #12
Цитата Сообщение от Predlegion Посмотреть сообщение
1) Правда ли,что многопоточность в программе позволяет увеличить производительность программы, т.е снизить загрузку ЦП?
Цитата Сообщение от kravam Посмотреть сообщение
Неправильно. Скорость при чтении 100 файлов десятью потоками ВООБЩЕ не увеличится (исключение: двухъядерный процессор, но мы этот случай щас не рассматриваем). В среднем, конечно. А потому, что потоки выполняются не параллельно, на самом деле, а ПСЕВДОПАРАЛЛЕЛЬНО. Для этого примера можно сказать, что потоки будут выполняться последовательно, один за другим. Часть первого потока, часть второго, часть третьего, часть первого и так далее. Так что никакого выигрыша.
Потоки используют не только ЦП, но и ввод/вывод
однопоточная система в общем случае неэффективна при работе с вводом/выводом, без ухищрений таких как асинхронный ввод, вывод итп

Добавлено через 2 минуты
Цитата Сообщение от Predlegion Посмотреть сообщение
2)Например есть программный код. Можно ли каким-нибудь образом, используя определенные средства отладки, посмотреть сколько системных ресурсов(а именно загрузка ЦП) едят отдельные куски этого кода? Т.е узнать, на сколько цикл грузит систему или часть определенной подпрограммы?
профилировщики например
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
28.10.2011, 23:42     Вопрос про многопоточность и производительность #13
Цитата Сообщение от Predlegion Посмотреть сообщение
Правда ли,что многопоточность в программе позволяет увеличить производительность программы, т.е снизить загрузку ЦП
я короче делал один поток запись в файл и тысячу потоков, один поток работал быстрее тысячи
Revol'veR
 Аватар для Revol'veR
23 / 23 / 2
Регистрация: 05.11.2010
Сообщений: 134
29.10.2011, 00:28     Вопрос про многопоточность и производительность #14
Van111, На каком процессоре вы это проверяли?
Если брать сравнивать одноядерный процессор, который работает по очереди с потоками, или несколько ядерный процессор, где каждое ядро обрабатывает по два потока за единицу времени, то спорить бесполезно. Просто вы задали для вашего процессора тяжёлую задачу. Есть такие параллельные алгоритмы, которые гораздо лучше срабатывают по времени на многопроцессорной системе, нежели на наших обычных машинах. А многоядерные процессоры - это уже одна из технологий параллельных алгоритмов работы с потоками.
Многоядерные процессоры работают быстрее даже с меньшей тактовой частотой, нежели одноядерный процессор с большей тактовой частотой
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.10.2011, 07:26     Вопрос про многопоточность и производительность #15
Ответ будет зависеть от архитектуры приложения.
На ОДНО процессорном компьютере потоки МОГУТ выполняться ПАРАЛЛЕЛЬНО в некоторых ситуациях. Как раз такая ситуация и была упомянута: обработка нескольких файлов. Один поток считывает файл, другой В ЭТО ЖЕ ВРЕМЯ обрабатывает файл, который был считан до этого. И т.д.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
29.10.2011, 07:56     Вопрос про многопоточность и производительность #16
Deviaphan, я всё время считал, что на однопроцессороном компьютере в один момент времени может выполняться один поток. Но вы меня переубедили. И всё бы ничего, но возник вопрос:

А на скольки процессорном компьютере может выполняться ТОЛЬКО один поток? На нолепроцессорном что ли?
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
29.10.2011, 08:17     Вопрос про многопоточность и производительность #17
kravam,к примеру ваш одноядерный процессор в состоянии выполнять N операций в секунду. к примеру для чтения файла ваш программа в один поток занимает n/10 операций в секунду. почему бы не добавить еще пару потоков которые займут образно говоря еще 2n/10 операций в секунду.
поправьте если я не ошибаюсь.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.10.2011, 08:17     Вопрос про многопоточность и производительность #18
Кстати, скорость именно множества файловых операций с одним физическим диском не зависит от числа потоков в любом случае, так как лимитируется характеристиками дисковода, а не процессора.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
29.10.2011, 08:21     Вопрос про многопоточность и производительность #19
greeezz, при всём уважении, подождём, что скажет девиапан.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2011, 08:26     Вопрос про многопоточность и производительность
Еще ссылки по теме:

Вопрос про табуляцию в C++ C++
C++ Производительность CPU, КЕШ, многопоточность
C++ Книга про многопоточность

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.10.2011, 08:26     Вопрос про многопоточность и производительность #20
Цитата Сообщение от kravam Посмотреть сообщение
А на скольки процессорном компьютере может выполняться ТОЛЬКО один поток?
Речь о том, что в процессе чтения файла процессор простаивает. Если приложение многопоточное, то второй поток может работать одновременно с чтением файла первым потоком.
Один поток может выполняться хоть на сколькипроцессорном компьютере. РЕчь о том, что на однопроцессорном компьютере может выполняться более одного потока в единицу времени.

Добавлено через 1 минуту
Как я сразу и сказал, ответ зависит от архитектуры приложения. Разделение на потоки не сделает программу быстрее автоматически. Нужно разделять на потоки с умом.
Yandex
Объявления
29.10.2011, 08:26     Вопрос про многопоточность и производительность
Ответ Создать тему
Опции темы

Текущее время: 16:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru