Russian Qt Forum
Ноябрь 23, 2024, 00:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Intel TBB or QThread  (Прочитано 6075 раз)
Yuriy
Гость
« : Сентябрь 22, 2011, 21:36 »

Наверное 1000 раз обсуждалось, но я так честно говоря не определился, с чего лучше начать...
С одной стороны Intel TBB это очень проверенная и качественная библиотека, но вот собрать ее опять же не удалось под Win. Там ассемблерские коды, MS Visual 9.0 собрать не смог. Но есть уже готовые библиотечки.

С другой стороны, думаю что система намного корректней распределит процессы по физическим камням, но как бы затраты на вызов этих самых распределений, lock'ов, unlock'ов и прочего не превысили по времени выполенения самих обработчиков.

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

Вот и палка о двух концах. Вроде бы Qt и информации больше и Assistent всегда под рукой, а с другой стороны Intel утверждают, мол TBB - то же самое, как и STL библиотека, является ныне неотъемлемой частью программирования приличного кода.

И еще ну хоть скиньте маленький пример создания на Qt нескольких thread'ов /больше одного/ , работающих одновременно с каким-нибудь типом данных, а то что я не пробую одно и то же: память не может быть read/written.

Заранее спасибо
Записан
Yuriy
Гость
« Ответ #1 : Сентябрь 23, 2011, 04:25 »

Научился создавать QThread'ы, но независимо от их количества, двухъядерник в диспетчере задач загружен только на 50%%, QThread::idealThreadCount () возвращает 2, прибавки в скорости выполнения 2-4 потоками или одним потоком не наблюдается. В чем может быть дело ?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Сентябрь 23, 2011, 06:33 »

В чем может быть дело?
Возможны варианты:
1) привязка к 1 ядру (но случайно этого не сделаешь)
2) Потокам просто нечего делать и они не грузят процессоры
3) Вы переопределили run и вместо start() вызываете run().

Если хотите нечто большее догадок - показывайте код.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 23, 2011, 10:33 »

С другой стороны, думаю что система намного корректней распределит процессы по физическим камням,
Распределение по физическим просто дополнительная возможность предоставляемая Intel (причем не на всех платформах). Ни разу еще не встречал такой задачи. Др. словами - это дело десятое. Вообще TBB не "параллелит" (грубо говоря), это просто классы/примитивы.

Итого: как лучше параллелить, не имея большого числа подопытных процессоров, не имея макинтош, но так чтобы в дальнейшем и на других системах приложение не падало.
Как Вы понимаете, со столь общим вопросом можно рассчитывать только на столь же общий ответ  Улыбающийся
Параллелить что? Если раздаваемые ниткам задачи длятся (доли) секунды и/или надо просто избежать заморозки UI, то Qt очень хорош. Много людей быстро и легко осваивают эту технику и находятся в счастливой убежденности что с "многопоточностью"  все вопросы решены Улыбающийся

Ситуация становится совершенно другой если дело доходит до подсчета КПД (который почему-то оказывается неожиданно мал), когда кластеры малы и/или негранулярны. Но нужно ли Вам это?
Записан
Yuriy
Гость
« Ответ #4 : Сентябрь 23, 2011, 12:30 »

Тысячу извинений, сейчас наглядно увидел всю мощь распараллеливания процессов.

Переопределил метод run для MyThread1:
Код:
void MyThread1::run()
{
//exec();
    qDebug() << "Starting first thread";

QTime myTime;
    std::string aString;

    myTime.start();

 for (int i = 0; i < 20000; ++i)
 {
    aString += "New test value";
 }

  const char *aValue = aString.c_str();
 for (int i = 0; i < strlen(aValue); ++i)
 {
    //dummy
 }

double myMlsec = myTime.elapsed(); myMlsec /= 1000;

qDebug() << "First thread run time: " << myMlsec;
    //qDebug() << "First run";
    connect(this, SIGNAL(finished()), this, SLOT(FinishProc1()));

exec(); //запускаем обработку очереди сообщений потока
}

Можно запустить MyThread1 2 раза, но для чистоты эксперимента также создал MyThread2

Тест 1:
Код:
QTime myTime;
    std::string aString;

    myTime.start();

 for (int i = 0; i < 20000; ++i)
 {
    aString += "New test value";
 }

  const char *aValue = aString.c_str();
 for (int i = 0; i < strlen(aValue); ++i)
 {
    //dummy
 }

double myMlsec = myTime.elapsed(); myMlsec /= 1000;
qDebug() << "No multithreading, only one CPU is working for " myMlsec;

Результат - 54.234 секунды

Тест 2:
Код:
    QThread *MyThread11 = new MyThread1();
    MyThread11->start();
    QThread *MyThread22 = new MyThread2();
    MyThread22->start();

    qDebug() << "Complete" << endl;

И здесь все прелести многопоточного программирования:
в консоли :
Starting second thread
Starting first thread
Complete

First thread run time:  54.938
Second thread run time:  55.828

В диспетчере задач загрузка обоих процессоров !!!
Таким образом, скорость выполнения увеличена в 2 раза.
Записан
Yuriy
Гость
« Ответ #5 : Сентябрь 23, 2011, 12:35 »

И еще , если убрать exec() и функции run()

Тогда отработает слот FinishProc() который собственно и является деструктором, при вызове exec() слот почему-то не вызывается...
Записан
Yuriy
Гость
« Ответ #6 : Сентябрь 23, 2011, 12:47 »

Вещь !!!!!!!  Улыбающийся
Записан
qt_user
Гость
« Ответ #7 : Ноябрь 20, 2011, 18:44 »

Ситуация становится совершенно другой если дело доходит до подсчета КПД (который почему-то оказывается неожиданно мал), когда кластеры малы и/или негранулярны. Но нужно ли Вам это?
можете объяснить что такое "кластеры" и "кластеры негранулярны" ?
и как можно подсчитать КПД?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 20, 2011, 22:52 »

можете объяснить что такое "кластеры" и "кластеры негранулярны" ?
и как можно подсчитать КПД?
Ну своими словами: "кластер" - это порция работы выполняемая каждой ниткой (начиная с момента когда она снялась с мутекса/cемафора и до тех пор пока опять заснула). Подсчитать КПД - засечь время Т1 когда все выполняется только 1 ниткой.  Потом засечь время Т2 когда вся ядра задействованы. КПД = T! / T2. Напр теоретически с 4 ядрами КПД может быть 4 (т.е. на 4 процессорах в 4 раза быстрее). Но на практике может быть и меньше 1 (издержки "многопоточности" Улыбающийся)  Поэтому подсчитывать никто не любит
Записан
qt_user
Гость
« Ответ #9 : Ноябрь 20, 2011, 23:12 »

Ну своими словами: "кластер" - это порция работы выполняемая каждой ниткой (начиная с момента когда она снялась с мутекса/cемафора и до тех пор пока опять заснула). Подсчитать КПД - засечь время Т1 когда все выполняется только 1 ниткой.  Потом засечь время Т2 когда вся ядра задействованы. КПД = T! / T2. Напр теоретически с 4 ядрами КПД может быть 4 (т.е. на 4 процессорах в 4 раза быстрее). Но на практике может быть и меньше 1 (издержки "многопоточности" Улыбающийся)  Поэтому подсчитывать никто не любит
время которое выделяется одной нити зависит только от ОС? оно всегда будет одинаково для одной ОС, одной машины?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Ноябрь 20, 2011, 23:19 »

время которое выделяется одной нити зависит только от ОС? оно всегда будет одинаково для одной ОС, одной машины?
Да, ну примерно конечно - ведь есть др процессы, в конце концов сам ОС, они тоже что-то делают. Напр если расчеты выполнялись 1 минуту, на следующем запуске можно получить 59 сек или 1:01 (в таком плане)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 22.