Название: Intel TBB or QThread Отправлено: Yuriy от Сентябрь 22, 2011, 21:36 Наверное 1000 раз обсуждалось, но я так честно говоря не определился, с чего лучше начать...
С одной стороны Intel TBB это очень проверенная и качественная библиотека, но вот собрать ее опять же не удалось под Win. Там ассемблерские коды, MS Visual 9.0 собрать не смог. Но есть уже готовые библиотечки. С другой стороны, думаю что система намного корректней распределит процессы по физическим камням, но как бы затраты на вызов этих самых распределений, lock'ов, unlock'ов и прочего не превысили по времени выполенения самих обработчиков. Итого: как лучше параллелить, не имея большого числа подопытных процессоров, не имея макинтош, но так чтобы в дальнейшем и на других системах приложение не падало. Вот и палка о двух концах. Вроде бы Qt и информации больше и Assistent всегда под рукой, а с другой стороны Intel утверждают, мол TBB - то же самое, как и STL библиотека, является ныне неотъемлемой частью программирования приличного кода. И еще ну хоть скиньте маленький пример создания на Qt нескольких thread'ов /больше одного/ , работающих одновременно с каким-нибудь типом данных, а то что я не пробую одно и то же: память не может быть read/written. Заранее спасибо Название: Re: Intel TBB or QThread Отправлено: Yuriy от Сентябрь 23, 2011, 04:25 Научился создавать QThread'ы, но независимо от их количества, двухъядерник в диспетчере задач загружен только на 50%%, QThread::idealThreadCount () возвращает 2, прибавки в скорости выполнения 2-4 потоками или одним потоком не наблюдается. В чем может быть дело ?
Название: Re: Intel TBB or QThread Отправлено: LisandreL от Сентябрь 23, 2011, 06:33 В чем может быть дело? Возможны варианты:1) привязка к 1 ядру (но случайно этого не сделаешь) 2) Потокам просто нечего делать и они не грузят процессоры 3) Вы переопределили run и вместо start() вызываете run(). Если хотите нечто большее догадок - показывайте код. Название: Re: Intel TBB or QThread Отправлено: Igors от Сентябрь 23, 2011, 10:33 С другой стороны, думаю что система намного корректней распределит процессы по физическим камням, Распределение по физическим просто дополнительная возможность предоставляемая Intel (причем не на всех платформах). Ни разу еще не встречал такой задачи. Др. словами - это дело десятое. Вообще TBB не "параллелит" (грубо говоря), это просто классы/примитивы.Итого: как лучше параллелить, не имея большого числа подопытных процессоров, не имея макинтош, но так чтобы в дальнейшем и на других системах приложение не падало. Как Вы понимаете, со столь общим вопросом можно рассчитывать только на столь же общий ответ :)Параллелить что? Если раздаваемые ниткам задачи длятся (доли) секунды и/или надо просто избежать заморозки UI, то Qt очень хорош. Много людей быстро и легко осваивают эту технику и находятся в счастливой убежденности что с "многопоточностью" все вопросы решены :) Ситуация становится совершенно другой если дело доходит до подсчета КПД (который почему-то оказывается неожиданно мал), когда кластеры малы и/или негранулярны. Но нужно ли Вам это? Название: Re: Intel TBB or QThread Отправлено: Yuriy от Сентябрь 23, 2011, 12:30 Тысячу извинений, сейчас наглядно увидел всю мощь распараллеливания процессов.
Переопределил метод run для MyThread1: Код: void MyThread1::run() Можно запустить MyThread1 2 раза, но для чистоты эксперимента также создал MyThread2 Тест 1: Код: QTime myTime; Результат - 54.234 секунды Тест 2: Код: QThread *MyThread11 = new MyThread1(); И здесь все прелести многопоточного программирования: в консоли : Starting second thread Starting first thread Complete First thread run time: 54.938 Second thread run time: 55.828 В диспетчере задач загрузка обоих процессоров !!! Таким образом, скорость выполнения увеличена в 2 раза. Название: Re: Intel TBB or QThread Отправлено: Yuriy от Сентябрь 23, 2011, 12:35 И еще , если убрать exec() и функции run()
Тогда отработает слот FinishProc() который собственно и является деструктором, при вызове exec() слот почему-то не вызывается... Название: Re: Intel TBB or QThread Отправлено: Yuriy от Сентябрь 23, 2011, 12:47 Вещь !!!!!!! :)
Название: Re: Intel TBB or QThread Отправлено: qt_user от Ноябрь 20, 2011, 18:44 Ситуация становится совершенно другой если дело доходит до подсчета КПД (который почему-то оказывается неожиданно мал), когда кластеры малы и/или негранулярны. Но нужно ли Вам это? можете объяснить что такое "кластеры" и "кластеры негранулярны" ?и как можно подсчитать КПД? Название: Re: Intel TBB or QThread Отправлено: Igors от Ноябрь 20, 2011, 22:52 можете объяснить что такое "кластеры" и "кластеры негранулярны" ? Ну своими словами: "кластер" - это порция работы выполняемая каждой ниткой (начиная с момента когда она снялась с мутекса/cемафора и до тех пор пока опять заснула). Подсчитать КПД - засечь время Т1 когда все выполняется только 1 ниткой. Потом засечь время Т2 когда вся ядра задействованы. КПД = T! / T2. Напр теоретически с 4 ядрами КПД может быть 4 (т.е. на 4 процессорах в 4 раза быстрее). Но на практике может быть и меньше 1 (издержки "многопоточности" :)) Поэтому подсчитывать никто не любити как можно подсчитать КПД? Название: Re: Intel TBB or QThread Отправлено: qt_user от Ноябрь 20, 2011, 23:12 Ну своими словами: "кластер" - это порция работы выполняемая каждой ниткой (начиная с момента когда она снялась с мутекса/cемафора и до тех пор пока опять заснула). Подсчитать КПД - засечь время Т1 когда все выполняется только 1 ниткой. Потом засечь время Т2 когда вся ядра задействованы. КПД = T! / T2. Напр теоретически с 4 ядрами КПД может быть 4 (т.е. на 4 процессорах в 4 раза быстрее). Но на практике может быть и меньше 1 (издержки "многопоточности" :)) Поэтому подсчитывать никто не любит время которое выделяется одной нити зависит только от ОС? оно всегда будет одинаково для одной ОС, одной машины?Название: Re: Intel TBB or QThread Отправлено: Igors от Ноябрь 20, 2011, 23:19 время которое выделяется одной нити зависит только от ОС? оно всегда будет одинаково для одной ОС, одной машины? Да, ну примерно конечно - ведь есть др процессы, в конце концов сам ОС, они тоже что-то делают. Напр если расчеты выполнялись 1 минуту, на следующем запуске можно получить 59 сек или 1:01 (в таком плане) |