crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

7 страниц V  « < 3 4 5 6 7 >  
Ответить в данную темуНачать новую тему
> Как понять что программа работает в двух потоках?
Алексей1153
  опции профиля:
сообщение 19.10.2010, 6:43
Сообщение #41


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


RazrFalcon,

если хочешь выжать из процессора максимальную скорость, то:
- обеспечь, что запущено только твоё приложение.
- не используй дополнительных потоков.

Поток создаёт удобство в разбивании задачи на параллельные процессы, но скорости не добавляет, а убавляет.

Цитата(RazrFalcon @ 19.10.2010, 1:11) *
а такой алгоритм, как вы написали, не очень то похож на высокопроизводительный

зато он проверен временем и поддаётся отладке и регулированию :)

Цитата(Алексей1153 @ 19.10.2010, 9:18) *
- не используй дополнительных потоков.

а вот тут я немного наврал. Использование потоков имеет-таки смысл на многоядерных процессорах. Так что, может и скорость выше получится, чем с одним потоком

потока намечается 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  


Цитата(RazrFalcon @ 19.10.2010, 11:49) *
Ладно, буду пробовать.

ты меня пугаешь!

Что именно пробовать будешь ? ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 19.10.2010, 9:28
Сообщение #44


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Алексей1153 @ 19.10.2010, 0:01) *
я бы так сделал:
1) первый поток - захват, помещение в очередь обработки
2) второй поток - извлечение из очереди обработки, обработка, отправка в БД/ОЗУ/файл
3) основной поток - отображение из БД/ОЗУ/файла

чтение/запись надо синхронизировать - тут наблюдается две таких точки (запись в очередь/извлечение из очереди , запись в хранилище/извлечение из хранилища)
Цитата(RazrFalcon @ 19.10.2010, 1:11) *
такой алгоритм, как вы написали, не очень то похож на высокопроизводительный


алгоритм вполне нормальный. просто пункт 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  


Цитата(Алексей1153 @ 19.10.2010, 8:56) *
Что именно пробовать будешь ? ))
Что значит "что"?
Пытаться разобраться с потоками, попробую разные варианты использования потоков и тд.

Цитата(Iron Bug @ 19.10.2010, 9:28) *
алгоритм вполне нормальный. просто пункт 2 ты можешь размножить до количества процессоров
У меня 1-н процессор и 2-а ядра :blink:

Цитата(Iron Bug @ 19.10.2010, 9:28) *
а что касается распараллеливания в QT - тут я не спец.
А чем вы пользуетесь?

Цитата(Iron Bug @ 19.10.2010, 9:28) *
если вдруг по-английски непонятно.
Прекрасно понятно, толку правда пока не очень, все равно <_<
Вы о кьютешном распараллеливании говорите или вообще?

Сообщение отредактировал 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  


Цитата(RazrFalcon @ 19.10.2010, 13:53) *
У меня 1-н процессор и 2-а ядра

для ОС количество ядер и есть количество "процессоров". ибо для неё важен вычислитель, а не внутренняя архитектура чипа.
Цитата(RazrFalcon @ 19.10.2010, 13:53) *
А чем вы пользуетесь?

для меня графика не важна, в основном консольные приложения и boost, а если кое-где требуется графика, то wxWidgets. он значительно легче и может компилиться статически, что важно для переносимости с машины на машину под одной системой. у меня часто случается, что программы используются "в поле" и лучше иметь один переносимый исполняемый файл, чем поставлять кучу библиотек.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 4.11.2010, 18:41
Сообщение #48


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Разобрался с потоками в общем.
Но теперь другая проблема.
Сделал обработку в 2-х потоках. Все хорошо. Грузит оба ядра на ~90%.
Но если считать время обработки общее, то оно практически на 10-15% ниже чем у однопоточной версии.
Пробовал делать ввод-вывод в главном потоке, обработка во втором, вроде шустрее, но совсем незначительно, иногда даже медленней.

пример
#include <QtCore/QCoreApplication>
#include <QtDebug>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>
#include <sys/time.h>
#include <QThread>

using namespace cv;

timeval start, stop, tstart, tstop;

const char* cascade_name ="../cv/haarcascades/haarcascade_frontalface_alt2.xml";
CvPoint pt1, pt2;

class MyThread : public QThread
{
public:
     void run();
};

class MyThread2 : public QThread
{
public:
     void run();
};

void detect_and_draw( IplImage* img )
{
    //обработка, неизменна
}

IplImage* frame1;
IplImage* frame2;
bool flag1=false, flag2=false, flag3=false, flag4=false;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    cvNamedWindow("Face detection", CV_WINDOW_AUTOSIZE);
    int stop=0;
    CvCapture* capture = cvCreateCameraCapture(0);

    MyThread th;
    MyThread2 th2;

    while(stop!=1)
    {
        if (flag3==false)
        {
            frame1 = cvQueryFrame(capture);
            th.start();
            cvWaitKey(5);
            flag3=true;
        }
        if (flag4==false)
        {
            frame2 = cvQueryFrame(capture);
            th2.start();
            flag4=true;
        }

        if (flag1==true) {cvShowImage("Face detection", frame1); flag1=false; flag3=false;}
        if (flag2==true) {cvShowImage("Face detection", frame2); flag2=false; flag4=false;}
   }

    cvReleaseCapture(&capture);
    cvDestroyWindow("Face detection");

    return a.exec();
}

void MyThread::run()
{
        detect_and_draw(frame1);
        flag1=true;
}

void MyThread2::run()
{
    detect_and_draw(frame2);
    flag2=true;
}


Код сырой конечно, но тут скорее ошибка в фундаментальных основах. Иначе чем объяснить то что в двух потоках виснет намного хуже чем в одном.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Создаю каждый раз поток, так как, если через дебаг смотреть, то после окончания обработки поток убивается, вот и приходится заново его создавать. Ну а без дебага, просто пустое окно.
На счет циклической обработки: имеется ввиду вайлы в потоки впихнуть? Пробовал, ошибки были, не помню уже какие.
А насчет того что кадров берется больше чем я успеваю обработать, я знаю, но пока с потоками не разберусь, не буду трогать, я просто пока ставлю больше время до захвата следующего кадра.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

7 страниц V  « < 3 4 5 6 7 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


18 чел. читают эту тему (гостей: 18, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.1.2025, 11:17