Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/79: Рейтинг темы: голосов - 79, средняя оценка - 4.87
3 / 3 / 1
Регистрация: 21.01.2011
Сообщений: 27
1

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

28.10.2011, 02:03. Показов 14914. Ответов 40
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Подскажите пожалуйста ответы на следующие вопросы:

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

2)Например есть программный код. Можно ли каким-нибудь образом, используя определенные средства отладки, посмотреть сколько системных ресурсов(а именно загрузка ЦП) едят отдельные куски этого кода? Т.е узнать, на сколько цикл грузит систему или часть определенной подпрограммы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2011, 02:03
Ответы с готовыми решениями:

Производительность CPU, КЕШ, многопоточность
Доброго времени суток! Суть проблемы - есть курсовой по системному программированию но я не знаю...

Вопрос про многопоточность
В википедии написано: Одни и те же данные - это понятно (глобальные и/или статические...

Про многопоточность
Здравствуйте. Подскажите пожалуйста вот какой вопрос: когда выполняется программа в многопоточном(с...

моя первая плата, хедеры - вопрос про eagle или про пайку
До сих пор я паял платы на однослойных платах для прототипирования - примерно вот таких...

40
278 / 173 / 21
Регистрация: 10.07.2011
Сообщений: 441
28.10.2011, 02:39 2
подозреваю что при увеличении количества потоков загрузка процессора в единицу времени не снижается а увеличивается. с увеличением числа потоков вы можете ускорить работу вашей программы. но не уменьшить загрузку процессора. например у вас есть 100 файлов которые надо прочитать. если вы будете читать файлы в одном потоке то потратите ( в среднем )времени 100*t. Если вы будете делать чтение в 10 потоков. и каждый из потоков будет читать свои 10 файлов то вы теоретически увеличите скорость работы в 10 раз. Теоретически.. это потому что с увеличением загрузки процессора возможно скорость обработки одного файла в отдельно взятом потоке может увеличиться. Конечно в случае с 10тью небольшими файлами это будет незаметно а вот например с парой сотен достаточно больших файлов разницу можно будет увидеть невооружённым глазом.
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.10.2011, 06:00 3
Приложения, работающие быстрее, далеют это за счёт большей нагрузки на ЦП. Если эту нагрузку снизить, то приложение будет работать медленнее. Фокус в том, что приложение в любом случае должно выполнить определённую работу, состоящую из определённого числа операций. Каждый ЦП способен выполнить некоторое количество n операций в единицу времени. Нагрузка на ЦП - это количество операций, фактически выполняемых процессором в единицу времени. Чем больше операций ЦП выполняет в единицу времени, тем быстрее о выполнит те операции, из которых состоит его работа по исполнению приложения. Многопоточные же приложения могут работать быстрее только на многоядерных процессорах. Причём, есть определённый придел, до которого чем больше в приложении потоков, тем быстрее оно исполняется. Этот придел у каждого ЦП свой и равен количеству ядер. Если потоков слишком много, то несколько потоков выполняются фактически последовательно одним ядром вместо распараллеливания по индивидуальным ядрам для каждого потока. А в последовательном режиме не имеет значения, один поток выполнять, или несколько, за исключением одного нюанса - на переключение между потоками тоже тратится время. Но этот обратный эффект мал до незаметности.
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
28.10.2011, 06:06 4
Неправильно. Скорость при чтении 100 файлов десятью потоками ВООБЩЕ не увеличится (исключение: двухъядерный процессор, но мы этот случай щас не рассматриваем). В среднем, конечно. А потому, что потоки выполняются не параллельно, на самом деле, а ПСЕВДОПАРАЛЛЕЛЬНО. Для этого примера можно сказать, что потоки будут выполняться последовательно, один за другим. Часть первого потока, часть второго, часть третьего, часть первого и так далее. Так что никакого выигрыша.
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.10.2011, 06:56 5
Цитата Сообщение от kravam Посмотреть сообщение
исключение: двухъядерный процессор, но мы этот случай щас не рассматриваем
Почему? В контексте связи многопоточности и производительности должны быть рассмотрены в первую очередь именно многоядерные процессоры и многопроцессорные компьютеры.

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

Не по теме:

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



Откровенно, говоря, я не знаю, возможно ли это в принципе, ещё не дошли руки уменя до этого.
0
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
28.10.2011, 09:45 7
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет не так. Первый поток в первом ядре, второй - во втором, третий - в третьем, то есть параллельно, за исключением случаев, когда для этого не хватает ядер,
Это хорошо но не всё так просто как может показаться. Если есть общий ресурс связан с файлами(ж-диск), потоки будут читать файлы с диска не одновременно, просто в случае многоядерного процессора скорость обработки файлов будет быстрее но никак не считывания с диска.
Цитата Сообщение от taras atavin Посмотреть сообщение
на переключение между потоками тоже тратится время
И сколько времени тратится если они исполняются в одном адресном пространстве процесса( это если говорить про потоки создаваемые на уровне ядра), а здесь не так критично.
1
278 / 173 / 21
Регистрация: 10.07.2011
Сообщений: 441
28.10.2011, 18:25 8
Цитата Сообщение от kravam Посмотреть сообщение
Неправильно. Скорость при чтении 100 файлов десятью потоками ВООБЩЕ не увеличится (исключение: двухъядерный процессор, но мы этот случай щас не рассматриваем)
ну почему-же не рассматриваем. я думаю по умолчанию понятно что при наличии одного процессора в системе так или иначе процессы будут выполнятся синхронно.
И еще могу добавить, что ускорение работы программы во многом зависит от задачи и компонентов программы. К примеру при работе с базой данных при увеличении количества потоков вы можете существенно увеличить скорость обработки данных. но понятно что не до бесконечности.
Пример.
У вас есть таблица в которой есть пара сотен тысяч строк. Допустим вам надо сделать апдейт значения в каком то поле в большей половине строк. Если вы запустите программу в один поток то вы получите время выполнения t, а если вы сделаете два потока то время сократится раза в полтора. Попробуйте на досуге. Естественно что надо подумать о том что процессы не должны мешать друг другу делать апдейты чтобы не сработал дэдлок таблицы. Простейший способ избежать данной проблемы это наличие поля в таблице по которому вы будете разделять строки по потокам.
1
23 / 23 / 4
Регистрация: 05.11.2010
Сообщений: 134
28.10.2011, 18:36 9
Для проверки параллельного алгоритма лучше проверять его на многопроцессорной машине, нежели на обычном компе. А если процессор допотопный(как правильно сказали ребята), то параллельный алгоритм будет долгим. Как минимум необходим двухъядерный процессор. А лучше - кластерная система
1
3 / 3 / 1
Регистрация: 21.01.2011
Сообщений: 27
28.10.2011, 23:05  [ТС] 10
ОК, т.е многопоточные приложение едят столько же ресурсов системы как и однопоточные а может даже и чуть больше
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
28.10.2011, 23:23 11
Требуется более развёрнутый ответ, советую почитать Джефри Ритера. Там вопрос изучается тык скыть во всём его разнообразии.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.10.2011, 23:39 12
Цитата Сообщение от Predlegion Посмотреть сообщение
1) Правда ли,что многопоточность в программе позволяет увеличить производительность программы, т.е снизить загрузку ЦП?
Цитата Сообщение от kravam Посмотреть сообщение
Неправильно. Скорость при чтении 100 файлов десятью потоками ВООБЩЕ не увеличится (исключение: двухъядерный процессор, но мы этот случай щас не рассматриваем). В среднем, конечно. А потому, что потоки выполняются не параллельно, на самом деле, а ПСЕВДОПАРАЛЛЕЛЬНО. Для этого примера можно сказать, что потоки будут выполняться последовательно, один за другим. Часть первого потока, часть второго, часть третьего, часть первого и так далее. Так что никакого выигрыша.
Потоки используют не только ЦП, но и ввод/вывод
однопоточная система в общем случае неэффективна при работе с вводом/выводом, без ухищрений таких как асинхронный ввод, вывод итп

Добавлено через 2 минуты
Цитата Сообщение от Predlegion Посмотреть сообщение
2)Например есть программный код. Можно ли каким-нибудь образом, используя определенные средства отладки, посмотреть сколько системных ресурсов(а именно загрузка ЦП) едят отдельные куски этого кода? Т.е узнать, на сколько цикл грузит систему или часть определенной подпрограммы?
профилировщики например
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
28.10.2011, 23:42 13
Цитата Сообщение от Predlegion Посмотреть сообщение
Правда ли,что многопоточность в программе позволяет увеличить производительность программы, т.е снизить загрузку ЦП
я короче делал один поток запись в файл и тысячу потоков, один поток работал быстрее тысячи
0
23 / 23 / 4
Регистрация: 05.11.2010
Сообщений: 134
29.10.2011, 00:28 14
Van111, На каком процессоре вы это проверяли?
Если брать сравнивать одноядерный процессор, который работает по очереди с потоками, или несколько ядерный процессор, где каждое ядро обрабатывает по два потока за единицу времени, то спорить бесполезно. Просто вы задали для вашего процессора тяжёлую задачу. Есть такие параллельные алгоритмы, которые гораздо лучше срабатывают по времени на многопроцессорной системе, нежели на наших обычных машинах. А многоядерные процессоры - это уже одна из технологий параллельных алгоритмов работы с потоками.
Многоядерные процессоры работают быстрее даже с меньшей тактовой частотой, нежели одноядерный процессор с большей тактовой частотой
1
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
29.10.2011, 07:26 15
Ответ будет зависеть от архитектуры приложения.
На ОДНО процессорном компьютере потоки МОГУТ выполняться ПАРАЛЛЕЛЬНО в некоторых ситуациях. Как раз такая ситуация и была упомянута: обработка нескольких файлов. Один поток считывает файл, другой В ЭТО ЖЕ ВРЕМЯ обрабатывает файл, который был считан до этого. И т.д.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
29.10.2011, 07:56 16
Deviaphan, я всё время считал, что на однопроцессороном компьютере в один момент времени может выполняться один поток. Но вы меня переубедили. И всё бы ничего, но возник вопрос:

А на скольки процессорном компьютере может выполняться ТОЛЬКО один поток? На нолепроцессорном что ли?
0
278 / 173 / 21
Регистрация: 10.07.2011
Сообщений: 441
29.10.2011, 08:17 17
kravam,к примеру ваш одноядерный процессор в состоянии выполнять N операций в секунду. к примеру для чтения файла ваш программа в один поток занимает n/10 операций в секунду. почему бы не добавить еще пару потоков которые займут образно говоря еще 2n/10 операций в секунду.
поправьте если я не ошибаюсь.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.10.2011, 08:17 18
Кстати, скорость именно множества файловых операций с одним физическим диском не зависит от числа потоков в любом случае, так как лимитируется характеристиками дисковода, а не процессора.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
29.10.2011, 08:21 19
greeezz, при всём уважении, подождём, что скажет девиапан.
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
29.10.2011, 08:26 20
Цитата Сообщение от kravam Посмотреть сообщение
А на скольки процессорном компьютере может выполняться ТОЛЬКО один поток?
Речь о том, что в процессе чтения файла процессор простаивает. Если приложение многопоточное, то второй поток может работать одновременно с чтением файла первым потоком.
Один поток может выполняться хоть на сколькипроцессорном компьютере. РЕчь о том, что на однопроцессорном компьютере может выполняться более одного потока в единицу времени.

Добавлено через 1 минуту
Как я сразу и сказал, ответ зависит от архитектуры приложения. Разделение на потоки не сделает программу быстрее автоматически. Нужно разделять на потоки с умом.
0
29.10.2011, 08:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2011, 08:26
Помогаю со студенческими работами здесь

Вопрос про обратную связь, и про схемотехнику полумоста
Добрый день) Я сейчас делаю схему от уважаемого rost c форума http://www.psb-kots.ru/forum/ , и...

Книга про многопоточность
Добрый день, посоветуйте пожалуйста хорошую книгу по C#, где должным образом описана технология...

Книга про многопоточность
Подскажите пожалуйста, в какой книге лучше написано про многопоточность, синхронизацию. И где есть...

И снова про многопоточность
Доброго времени суток, форумчане, задался целью немного переделать программу для более быстрой...

вопрос про Sape, про поиск площадок
Делаю поиск площалок. В каждом пункте результатов поиска есть кнопки BL и GBL. Что они значат и...

Посоветуйте литературу про многопоточность
Читаю главу Шилдта про многопоточное программирование. Такое ощущение, что Шилдт начал сложно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru