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

Ускорение проги потоками - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
25.01.2014, 22:54     Ускорение проги потоками #1
Здорова господа!

Только что у меня прога глючила и вылетала я от не заметил она именно в дебаг режиме вылетала и медленно работала, а в релиз все норм, от когда она медлено начала работать, я от подумал, а неплохо было бы на потоки разбить задачи и что б они не по порядку выполнялись, а параллельно. Прога парсер html, щас вроде исправил в релиз переключил все заработало. Ну все рамно мне нужно с потоками ознакомится, я с потоками не знакомился вообще, но думаю они просто работают, допустим у нас есть массив из 100 элементов мы его делим на два создаем два потока и уже в циклах вычисляем параллельно по 50 элементов и заметно ускоряемся. Думаю писать для инета различных роботов поисковых, спам-ботов, сканеры и всякие проги по продвижению и рекламме проектов, так от все в одном потоке делать ну это фигня, очень все будет долго делаться, даже простой поисковый робот который будет набивать базу mail-лов нужно его сутками не выключать, потому что база урлов непосещенных будет расти очень быстро, а каждый урл будет обрабатываться в одном потоке, это фигня.

Мб. кто скинет пример работы двух потоков. Я от простейшую задачку приведу на умножение на 2 каждого элемента, у нас есть массив mas из 100 элементов и нужно каждый элемент умножить на 2
мы можем все это в одном цикле сделать отак например:
C++
1
2
3
4
for(int i=0;i<100;i++)
{
mas[i]=mas[i]*2;
}
но мы можем и в два цикла это все посчитать отак:
C++
1
2
3
4
5
6
7
8
for(int i=0;i<50;i++)
{
mas[i]=mas[i]*2;
}
for(int i=50;i<100;i++)
{
mas[i]=mas[i]*2;
}
но это фигня оно последовательно считает, в общем нужно как то открыть два потока и параллельно выполнить эти циклы.

Кто может это сделать?! Хелп помогите новичку!!!

Добавлено через 48 минут
Чо никто потоки не знает?

Задача ж простая посчитать не в одном цикле последовательно а создать два потока и выполнить параллельный подсчет, вроде ж все просто или нет?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 22:54     Ускорение проги потоками
Посмотрите здесь:

C++ Работа с потоками
C++ работа с потоками
Работа с потоками. C++
C++ Работа с потоками
C++ проблема с потоками
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
25.01.2014, 23:02     Ускорение проги потоками #2
Цитата Сообщение от ninja2 Посмотреть сообщение
Только что у меня прога глючила и вылетала я от не заметил она именно в дебаг режиме вылетала и медленно работала, а в релиз все норм,
это плохо. В дебаге скорее всего был какой-то дополнительный код (например для проверки целостности стека) и программа у тебя крэшилась. В релизе этого кода нет и по несчастливой случайности программа выполняется без креша. Советую разобраться с этим.
Дальше читать сложно.

Не по теме:

ninja2, как ты с "Гуру С++" до "нарушителя" докатился?

gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
25.01.2014, 23:16     Ускорение проги потоками #3
Цитата Сообщение от ninja2 Посмотреть сообщение
Хелп помогите новичку!!!
http://scrutator.me/post/2012/04/04/...-world-p1.aspx
Статься из трех частей про потоки в С++11. Именно эти статьи я не читал, но судя по остальным на этом сайте, они очень хорошие.

Не по теме:

Хотя вы все равно читать не будете, подозреваю. Гуру С++ все делают по-своему...

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.01.2014, 00:22  [ТС]     Ускорение проги потоками #4
Цитата Сообщение от Kastaneda Посмотреть сообщение
это плохо. В дебаге скорее всего был какой-то дополнительный код (например для проверки целостности стека) и программа у тебя крэшилась. В релизе этого кода нет и по несчастливой случайности программа выполняется без креша. Советую разобраться с этим.
Да смысла нету переделывать, я делал давно и тогда еще не знал что есть дебаг режим и релиз, щас нужно тогда все заново писать в дебаге и смотреть чо вылетает, там какой то итератор кудата выходит. под 4к строк-запутанного кода неохота искать где, в релизе работает и хай. Вылетает какой то асерт, щас напишу что за ошибка

Добавлено через 43 секунды
Цитата Сообщение от gromo Посмотреть сообщение
Статься из трех частей про потоки в С++11. Именно эти статьи я не читал, но судя по остальным на этом сайте, они очень хорошие.
Ок ок почитаю, а ты хоть разобрался с потоками?

Добавлено через 7 минут
Окно с ошибкой вылетает в дебаг режиме:

Debug Assertion Failed!

expression: string iterators incompatible
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
26.01.2014, 00:35     Ускорение проги потоками #5
Цитата Сообщение от ninja2 Посмотреть сообщение
а ты хоть разобрался с потоками?
так а че там разбираться запускай да и все
там другие косяки есть
во первых если будет однопроцессорная машина то выигрыша не получишь а даже тормоза(не заметные но будут) потокам нужно переключатся
но это так мелочи
самое главное спланировать потоки
например у тебя два потока обращаются к одному блоку памяти, возможен вариант один пишет другой читает и все крах,нет доступа
приходится делать всякие семафоры, мютексы, чтобы один поток ждал пока другой закончит работу с памятью
и здесь возможна засада, взаимоблокировка потоков, оба выставили семафоры и ждут пока другой освободит
или другой вариант ( не такой страшный) один поток записывает второй ждет и считывает, и никакого выигрыша не получишь, второй поток будет ждать пока отработает первый
короче почитай Рихтера( не который пианист) по моему очень доступно

Добавлено через 2 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
Окно с ошибкой вылетает в дебаг режиме:
А в чем пишешь?
На VS делается так, нажмешь "продолжить"
еще раз выскочит это окошко, тогда жмешь "остановить"
входишь в дебагер и в окне стека раскручиваешь функции, смотришь кто привел к этой гадости
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.01.2014, 00:40  [ТС]     Ускорение проги потоками #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ValeryS Посмотреть сообщение
короче почитай Рихтера( не который пианист) по моему очень доступно
Ок, токо с дебагом разберусь, нашол функцию где вылетает этот асер и тормозит, надо как то сделать что б и в дебаге работало, а то это не годится.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
А в чем пишешь?
На VS делается так, нажмешь "продолжить"
еще раз выскочит это окошко, тогда жмешь "остановить"
входишь в дебагер и в окне стека раскручиваешь функции, смотришь кто привел к этой гадости
Ок щас попробую, а то я хотел вручную искать, мб оно строку покажет где ошибка происходит, щас попробую дебаг запустить.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
во первых если будет однопроцессорная машина то выигрыша не получишь а даже тормоза(не заметные но будут) потокам нужно переключатся
А как однопроцессорный, мб. одноядерный? А если будет два ядра то что я только два потока смогу создать?
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
26.01.2014, 00:57     Ускорение проги потоками #7
Цитата Сообщение от ninja2 Посмотреть сообщение
А как однопроцессорный, мб. одноядерный?
ну в смысле одноядерный
Цитата Сообщение от ninja2 Посмотреть сообщение
А если будет два ядра то что я только два потока смогу создать?
создать то ты их можешь хоть сто
но одновременно будут работать два потока
но диспетчер их так будет быстро переключать что будет казаться все 100 работают

Добавлено через 7 минут
тут еще такая фишка появилась даже одно ядро распаралеливает свою работу( но это уже на уровне ассемблера) и современные оптимизаторы с этим неплохо справляются
например
A=B+C+D+E
если раньше все сложения делались последовательно
то на современных
B+C и D+E считаются одновременно
а потом складывается результат
в свете твоего цикла можно попытаться ускорить так
C++
1
2
3
4
5
for(int i=0;i<50;i++)
{
mas[i]=mas[i]*2;
mas[i+50]=mas[i+50]*2;
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.01.2014, 01:09  [ТС]     Ускорение проги потоками #8
Цитата Сообщение от ValeryS Посмотреть сообщение
в свете твоего цикла можно попытаться ускорить так
по времени оно одинаково будет работать - ПОСЛЕДОВАТЕЛЬНО.
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
26.01.2014, 01:18     Ускорение проги потоками #9
Цитата Сообщение от ninja2 Посмотреть сообщение
по времени оно одинаково будет работать - ПОСЛЕДОВАТЕЛЬНО.
не факт
как оптимизатор поработает
ну это уже в листинг надо залазить и смотреть
у современных процессоров есть два контейнера (или конвеера) на одном ядре и может одновременно умножать
плюс развертывание цикла
вместо 100 переходов 50
а как работает современный процессор? закачивает в кэш последовательность команд и выполняет их встречает ветвление, которое он не угадал выкидывет все из кэша и загружает заново
и чем меньше будет этих выгрузок тем быстрее будет работать
в идеале вообще линейная программа нужна
развертывание циклов дает большой выигрыш в производительности, но проигрываем в памяти вечная дилемма
Croessmah
26.01.2014, 01:23
  #10

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
по времени оно одинаково будет работать - ПОСЛЕДОВАТЕЛЬНО.
-50 прыжков назад!

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.01.2014, 01:55  [ТС]     Ускорение проги потоками #11
Заработало в дебаг режиме, там мелочь была, час ушло на исправление методом тыка. А кто знает должно так быть или нет, прога в дебаг режиме реально одну страницу обрабатывает секунд по 20, а в релиз быстро 5 - 10 секунд, короче в дебаг прога ну очень медленно работает, что так и должно быть?

Добавлено через 4 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
-50 прыжков назад!
Это по времени мелочь, этим пренебрегаем, мне нужно что б параллельно парсилось 5урлов или от есть у меня в базе 100 урлов, я взял разбил допустим по 10 создал 10 потоков и по 10 одновременно обрабатываю, автоматом разбивку делать в это не сложно. Щас не буду делать, потом полюбом нужно будет научится разбивать на потоки, а то очень долго будет поиск происходить.
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,066
26.01.2014, 01:58     Ускорение проги потоками #12
Цитата Сообщение от ninja2 Посмотреть сообщение
короче в дебаг прога ну очень медленно работает, что так и должно быть?
ежли ты сильно с памятью завязан то да
дебажный new намного тормознутей

плюс у каждой функции область локальных переменных заполняется волшебным числом при выходе проверяется
это они таким образом борются с утечками памяти и выходами за пределы массива

Добавлено через 1 минуту
можно отлаживать и релизную версию но для этого (речь веду о VS)
необходимо подключить отладочную информацию и убрать оптимизацию полностью
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2014, 02:07     Ускорение проги потоками
Еще ссылки по теме:

C++ Работа с потоками
Работа с потоками C++
C++ Работа с потоками

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

Или воспользуйтесь поиском по форуму:
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.01.2014, 02:07  [ТС]     Ускорение проги потоками #13
Цитата Сообщение от ValeryS Посмотреть сообщение
ежли ты сильно с памятью завязан то да
дебажный new намного тормознутей
нет у меня нету вообще указателей в проге, небыло необходимости, я в стиле высокоуровневого языка пишу, ну хз мб один есть, да скорее всего нету, я без указателей прогу писал, мб. в либах много new вызывается от оно и тормозит.

Добавлено через 4 минуты
Регулярных выражений очень много, я не знаю мб штук 100 - 200 выражений разных, мб из за этого в дебаге сильно тормозит, если честно если б это был пхп, то он бы не потянул такое количество РВ, там бы стразу висяк был, пхп от 20 РВ уже виснет, а С++ в релизе очень шустро работает . В пхп каждое приходилось оптимизировать чтоб скорость не падала, там одно кривое РВ все висяк, а в С++ вообще не беспокоишься какое не напишешь хоть оптимизированное хоть кривое изменение скорости не заметно.
Yandex
Объявления
26.01.2014, 02:07     Ускорение проги потоками
Ответ Создать тему
Опции темы

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