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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.63
Predlegion
3 / 3 / 0
Регистрация: 21.01.2011
Сообщений: 27
#1

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

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

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

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

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

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

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

Вопрос про палиндромы - C++
Такая вот задачка по програмированию С++: Ввести рядок символов и составить масив слов-палиндромов (читаются одинаково с права на лево и...

Вопрос про ф-ию mul - C++
Расскажите пожалуйста про ф-ию mul, перегружаемую в классе. Что она делает?

Вопрос про указатели - C++
#include <iostream.h> int main() { int x; int *Pointer; pointer = &x; cout << pointer; cout << *ponter; return 0; ...

Вопрос про outtextxy() - C++
Если в графическом режиме выводить текст с помощью функции outtextxy() поверх другого текста, то новый текст сливается со старым. Прошу...

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

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

Не по теме:

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



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

Добавлено через 2 минуты
Цитата Сообщение от Predlegion Посмотреть сообщение
2)Например есть программный код. Можно ли каким-нибудь образом, используя определенные средства отладки, посмотреть сколько системных ресурсов(а именно загрузка ЦП) едят отдельные куски этого кода? Т.е узнать, на сколько цикл грузит систему или часть определенной подпрограммы?
профилировщики например
0
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
28.10.2011, 23:42 #13
Цитата Сообщение от Predlegion Посмотреть сообщение
Правда ли,что многопоточность в программе позволяет увеличить производительность программы, т.е снизить загрузку ЦП
я короче делал один поток запись в файл и тысячу потоков, один поток работал быстрее тысячи
0
Revol'veR
23 / 23 / 2
Регистрация: 05.11.2010
Сообщений: 134
29.10.2011, 00:28 #14
Van111, На каком процессоре вы это проверяли?
Если брать сравнивать одноядерный процессор, который работает по очереди с потоками, или несколько ядерный процессор, где каждое ядро обрабатывает по два потока за единицу времени, то спорить бесполезно. Просто вы задали для вашего процессора тяжёлую задачу. Есть такие параллельные алгоритмы, которые гораздо лучше срабатывают по времени на многопроцессорной системе, нежели на наших обычных машинах. А многоядерные процессоры - это уже одна из технологий параллельных алгоритмов работы с потоками.
Многоядерные процессоры работают быстрее даже с меньшей тактовой частотой, нежели одноядерный процессор с большей тактовой частотой
1
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.10.2011, 07:26 #15
Ответ будет зависеть от архитектуры приложения.
На ОДНО процессорном компьютере потоки МОГУТ выполняться ПАРАЛЛЕЛЬНО в некоторых ситуациях. Как раз такая ситуация и была упомянута: обработка нескольких файлов. Один поток считывает файл, другой В ЭТО ЖЕ ВРЕМЯ обрабатывает файл, который был считан до этого. И т.д.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2011, 07:26
Привет! Вот еще темы с ответами:

Вопрос про наследование. - C++
Добрый день всем! Возможно ли создать производный класс в который будут помещены 2 объекта базового класса с возможностью...

Вопрос про реестр - C++
Здравствуйте господа програмисты!У меня есть программа,честно сознаюсь скачал с интернета и переделал не много,поэтому не доконца...

вопрос про скобки - C++
Здравствуйте, получил задание написать программу, смысл которой заключается в умножении матрицы на столбец. Матрица статическая, функция...

Вопрос про char - C++
Пожалуйста обьясните доступным языком в чем разница между объявлениями, и какие когда лучше использовать char a; char *c; char b=new...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.10.2011, 07:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru