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

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

Войти
Регистрация
Восстановить пароль
 
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

25.01.2014, 22:54. Просмотров 525. Ответов 12
Метки нет (Все метки)

Здорова господа!

Только что у меня прога глючила и вылетала я от не заметил она именно в дебаг режиме вылетала и медленно работала, а в релиз все норм, от когда она медлено начала работать, я от подумал, а неплохо было бы на потоки разбить задачи и что б они не по порядку выполнялись, а параллельно. Прога парсер 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++
Добрый вечер! Есть файл txt, состоит из символов, чисел, необходимо его открыть, упорядочить некоторым образом и записать, начал с...

Работа с потоками - C++
Нужно посчитать сумму элементов в матрице nxn написал а она мне выдаёт ошибку. и теперь не знаю что надо делать. ...

Работа с потоками. - C++
Здравствуйте. Есть программа реализующая перебор вариантов размена суммы (к примеру 100 = 100, 100 = 50 + 50 т.д.) #include...

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

Работа с потоками - C++
Поток main должен выполнить следующие действия: создать массив, размерность и элементы которого вводятся пользователем с консоли; ...

Работа с потоками - C++
Задание Разработать программу, реализующую многопочность средствами среды Win32. Программа должна обеспечивать: Отображение списка...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
25.01.2014, 23:02 #2
Цитата Сообщение от ninja2 Посмотреть сообщение
Только что у меня прога глючила и вылетала я от не заметил она именно в дебаг режиме вылетала и медленно работала, а в релиз все норм,
это плохо. В дебаге скорее всего был какой-то дополнительный код (например для проверки целостности стека) и программа у тебя крэшилась. В релизе этого кода нет и по несчастливой случайности программа выполняется без креша. Советую разобраться с этим.
Дальше читать сложно.

Не по теме:

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

gromo
370 / 269 / 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
231 / 187 / 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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
26.01.2014, 00:35 #5
Цитата Сообщение от ninja2 Посмотреть сообщение
а ты хоть разобрался с потоками?
так а че там разбираться запускай да и все
там другие косяки есть
во первых если будет однопроцессорная машина то выигрыша не получишь а даже тормоза(не заметные но будут) потокам нужно переключатся
но это так мелочи
самое главное спланировать потоки
например у тебя два потока обращаются к одному блоку памяти, возможен вариант один пишет другой читает и все крах,нет доступа
приходится делать всякие семафоры, мютексы, чтобы один поток ждал пока другой закончит работу с памятью
и здесь возможна засада, взаимоблокировка потоков, оба выставили семафоры и ждут пока другой освободит
или другой вариант ( не такой страшный) один поток записывает второй ждет и считывает, и никакого выигрыша не получишь, второй поток будет ждать пока отработает первый
короче почитай Рихтера( не который пианист) по моему очень доступно

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

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

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
во первых если будет однопроцессорная машина то выигрыша не получишь а даже тормоза(не заметные но будут) потокам нужно переключатся
А как однопроцессорный, мб. одноядерный? А если будет два ядра то что я только два потока смогу создать?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.01.2014, 01:09  [ТС] #8
Цитата Сообщение от ValeryS Посмотреть сообщение
в свете твоего цикла можно попытаться ускорить так
по времени оно одинаково будет работать - ПОСЛЕДОВАТЕЛЬНО.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
26.01.2014, 01:18 #9
Цитата Сообщение от ninja2 Посмотреть сообщение
по времени оно одинаково будет работать - ПОСЛЕДОВАТЕЛЬНО.
не факт
как оптимизатор поработает
ну это уже в листинг надо залазить и смотреть
у современных процессоров есть два контейнера (или конвеера) на одном ядре и может одновременно умножать
плюс развертывание цикла
вместо 100 переходов 50
а как работает современный процессор? закачивает в кэш последовательность команд и выполняет их встречает ветвление, которое он не угадал выкидывет все из кэша и загружает заново
и чем меньше будет этих выгрузок тем быстрее будет работать
в идеале вообще линейная программа нужна
развертывание циклов дает большой выигрыш в производительности, но проигрываем в памяти вечная дилемма
Croessmah
26.01.2014, 01:23
  #10

Не по теме:

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

ninja2
231 / 187 / 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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
26.01.2014, 01:58 #12
Цитата Сообщение от ninja2 Посмотреть сообщение
короче в дебаг прога ну очень медленно работает, что так и должно быть?
ежли ты сильно с памятью завязан то да
дебажный new намного тормознутей

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

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

Добавлено через 4 минуты
Регулярных выражений очень много, я не знаю мб штук 100 - 200 выражений разных, мб из за этого в дебаге сильно тормозит, если честно если б это был пхп, то он бы не потянул такое количество РВ, там бы стразу висяк был, пхп от 20 РВ уже виснет, а С++ в релизе очень шустро работает . В пхп каждое приходилось оптимизировать чтоб скорость не падала, там одно кривое РВ все висяк, а в С++ вообще не беспокоишься какое не напишешь хоть оптимизированное хоть кривое изменение скорости не заметно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2014, 02:07
Привет! Вот еще темы с ответами:

Работа с потоками - C++
Пишу простой RSS агрегатор и уже практически доделал его в программе параллельно устанавливается соединение и потом извлекаем данные из...

Парсинг потоками - C++
Здравствуйте. У меня есть текстовый файл объёмом где-то 10-50 мегобайт. В нём в текстовом виде хранятся числа и строки в известном мне...

проблема с потоками - C++
Ребят при написании программы появилась проблема, опишу вкратце. пишу интерфейс WTL шаблонами. В MainWindow класса есть метод обработки...

Работа с потоками - C++
Добрый вечер. Возникла такая проблема: в консольном приложении воспроизводится музыка при помощи mciSendString(s.c_str(), NULL, 0,...


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

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

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