Как понять что программа работает в двух потоках? |
Здравствуйте, гость ( Вход | Регистрация )
Как понять что программа работает в двух потоках? |
Алексей1153 |
19.10.2010, 6:43
Сообщение
#41
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
RazrFalcon,
если хочешь выжать из процессора максимальную скорость, то: - обеспечь, что запущено только твоё приложение. - не используй дополнительных потоков. Поток создаёт удобство в разбивании задачи на параллельные процессы, но скорости не добавляет, а убавляет. а такой алгоритм, как вы написали, не очень то похож на высокопроизводительный зато он проверен временем и поддаётся отладке и регулированию - не используй дополнительных потоков. а вот тут я немного наврал. Использование потоков имеет-таки смысл на многоядерных процессорах. Так что, может и скорость выше получится, чем с одним потоком потока намечается 3, поэтому шустрее всего будет работать на 3+ ядерном процессоре. Сообщение отредактировал Алексей1153 - 19.10.2010, 6:45 |
|
|
RazrFalcon |
19.10.2010, 8:49
Сообщение
#42
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Ладно, буду пробовать.
А то что, больше потоков, больше мороки, я уже вижу |
|
|
Алексей1153 |
19.10.2010, 8:56
Сообщение
#43
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
Iron Bug |
19.10.2010, 9:28
Сообщение
#44
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
я бы так сделал: 1) первый поток - захват, помещение в очередь обработки 2) второй поток - извлечение из очереди обработки, обработка, отправка в БД/ОЗУ/файл 3) основной поток - отображение из БД/ОЗУ/файла чтение/запись надо синхронизировать - тут наблюдается две таких точки (запись в очередь/извлечение из очереди , запись в хранилище/извлечение из хранилища) такой алгоритм, как вы написали, не очень то похож на высокопроизводительный алгоритм вполне нормальный. просто пункт 2 ты можешь размножить до количества процессоров (но помни, что у тебя ещё приём и итоговое отображение где-то должны крутиться!). а что касается распараллеливания в QT - тут я не спец. наверняка можно указать номер проца. но это, опять же, через класс потока, а не потом, при его работе. а с потоками, как видно, ничего тебе не понятно. так что читай матчасть основательно и про реализацию потоков в QT. благо, тут добрые люди вроде как даже занимаются переводом этого добра на русский язык, если вдруг по-английски непонятно. Сообщение отредактировал Iron Bug - 19.10.2010, 9:29 |
|
|
RazrFalcon |
19.10.2010, 10:53
Сообщение
#45
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Что именно пробовать будешь ? )) Что значит "что"?Пытаться разобраться с потоками, попробую разные варианты использования потоков и тд. алгоритм вполне нормальный. просто пункт 2 ты можешь размножить до количества процессоров У меня 1-н процессор и 2-а ядра а что касается распараллеливания в QT - тут я не спец. А чем вы пользуетесь?если вдруг по-английски непонятно. Прекрасно понятно, толку правда пока не очень, все равно Вы о кьютешном распараллеливании говорите или вообще? Сообщение отредактировал RazrFalcon - 19.10.2010, 10:58 |
|
|
Алексей1153 |
19.10.2010, 11:33
Сообщение
#46
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
RazrFalcon, поток - это понятие ОС (и даже - процессора) .
|
|
|
Iron Bug |
19.10.2010, 13:03
Сообщение
#47
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
У меня 1-н процессор и 2-а ядра для ОС количество ядер и есть количество "процессоров". ибо для неё важен вычислитель, а не внутренняя архитектура чипа. А чем вы пользуетесь? для меня графика не важна, в основном консольные приложения и boost, а если кое-где требуется графика, то wxWidgets. он значительно легче и может компилиться статически, что важно для переносимости с машины на машину под одной системой. у меня часто случается, что программы используются "в поле" и лучше иметь один переносимый исполняемый файл, чем поставлять кучу библиотек. |
|
|
RazrFalcon |
4.11.2010, 18:41
Сообщение
#48
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Разобрался с потоками в общем.
Но теперь другая проблема. Сделал обработку в 2-х потоках. Все хорошо. Грузит оба ядра на ~90%. Но если считать время обработки общее, то оно практически на 10-15% ниже чем у однопоточной версии. Пробовал делать ввод-вывод в главном потоке, обработка во втором, вроде шустрее, но совсем незначительно, иногда даже медленней. пример
Код сырой конечно, но тут скорее ошибка в фундаментальных основах. Иначе чем объяснить то что в двух потоках виснет намного хуже чем в одном. |
|
|
Iron Bug |
4.11.2010, 18:57
Сообщение
#49
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
а зачем ты в цикле создаёшь и убиваешь стопицот потоков?
понятно, что на создание потока и контекста требуется дофига процессорного времени. или QThread::start не создаёт контекст? не проще ли в рабочих потоках сделать циклическую обработку данных из какого-то буфера (только аккуратно, с защитой данных между потоками)? по-хорошему, там при этом ещё нужно бы прикрутить какие-то события, что буфер непуст - чтобы потоки спали, когда не требуется выполнять никаких действий. и, кстати, не забывай про многопотчность! дожидается ли QThread::start завершения потока? я не спец в QT, но есть подозрение, что нет. а если нет, то в случае, когда у тебя основной цикл будет читать кадры быстрее, чем рабочие потоки смогут их обрабатывать, то у тебя просто затрётся рабочий указатель на данные и ты получишь ошибку рантайма или просто кривое изображение. а в случае, если QThread::start дожидается окончания потока - то у тебя нет никакой параллельности вообще. Сообщение отредактировал Iron Bug - 4.11.2010, 19:08 |
|
|
RazrFalcon |
4.11.2010, 19:16
Сообщение
#50
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Создаю каждый раз поток, так как, если через дебаг смотреть, то после окончания обработки поток убивается, вот и приходится заново его создавать. Ну а без дебага, просто пустое окно.
На счет циклической обработки: имеется ввиду вайлы в потоки впихнуть? Пробовал, ошибки были, не помню уже какие. А насчет того что кадров берется больше чем я успеваю обработать, я знаю, но пока с потоками не разберусь, не буду трогать, я просто пока ставлю больше время до захвата следующего кадра. |
|
|
Текстовая версия | Сейчас: 15.1.2025, 15:01 |