![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
возможно ли опредлить какие ядра не загружены или какое ядро загружено меньше всего?
допустим я использую std::size_t thcount = boost::thread::hardware_concurrency(); перед тем как вызвать thread_group и знаю что одно ядро в данный момент скорее всего загружено есть ли смысл делать thcount=thcount-1; ? т.е. чтобы thread_group заняли все оставшиеся неиспользуемые ядра? и гарантируется ли вообще что новый тред будет использовать неиспользуемое или менее всего загруженное ядро? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Можно. Смотри API конкретной операционной системы. Ты это знаешь на данный момент, но понятия не имеешь что будет через 2 секунды. Создавай оптимальное количество потоков, если хочешь добиться максимальной производительности. |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
т.е. к бусту это никакого отношения не имеет?
на данный момент я создаю кол-во потоков = кол-ву ядер в компьютере, как узнать оптимальное кол-во? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
В boost-е этого нет.
hardware_concurrency() возвращает оптимальное количество. Это не обязательно количество ядер, он учитывает количество ядер, процессоров, а также возможности hyperthreading-а. |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Некоторые высокоуровневые системы распараллеливания реализуют механизм заимствования заданий (workstealing). Данный механизм поддерживается в Intel Cilk Plus, а также в OpenMP при использовании так называемых явных заданий (вводимых директивой task).
Т.е. если к одному логическому процессору стоит в очереди много заданий, то часть из них может быть "украдена" освободившимися логическими процессорами. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
FCM, ну так об этом говорится в спецификации OpenMP-3.1
|
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
использую
std::size_t thcount = boost::thread::hardware_concurrency(); имею 4 ядра. если смотреть в диспетчере задач то загрузка 27% (т.е. предположительно 1 ядро полностью нагружено) или это все 4 ядра загружаются не полностью? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
azesmcar, я думаю, что если ее вызывать в цикле без слипа, то можно достичь 100 процентов. что уже будет не шуточной нагрузкой программы
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Да, если сильно постараться ... А вообще (для ТС) это был намек на то, что (мягко говоря) предоставленных данных совершенно недостаточно для ответа на вопрос. |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
boost::thread_group tg; for ( std::size_t idx = 0; idx < thcount; ++idx ) { tg.create_thread(boost::bind(&task_execute, &vec[idx], vec_queue[idx], params)); } tg.join_all(); внутри task_execute идет доступ к одной и той же структуре(vector<Data>) по указателям на чтение возможно из-за этого малая нагрузка? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mrgloom, из той информации что ты предоставил, ничего определенного сказать невозможно.
|
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
а какую надо информацию? полный код task_execute?
Это сообщение отредактировал(а) mrgloom - 1.11.2011, 14:56 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
угу. или хотя бы подробно опиши что он выполняет. а сейчас, в чем собственно вопрос? |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
если описать в целом, то есть некая структура- дерево( скорее граф)
есть таски - указатель на узел дерева+ какая то инфа, обращаемся к узлу делаем обсчет. я запускаю кол-во тредов равное std::size_t thcount = boost::thread::hardware_concurrency(); у каждого треда есть его личная очередь тасков и личный выходной вектор для данных. так вот я предполагаю, что проблема в том что треды обращаются к одному дереву на чтение и поэтому производительность не блещет. т.е. такое ощущение, что загружено только 1 ядро. хранится дерево(граф) как vector<Hierarchy> где class Hierarchy { vector<Hierarchy*> ref; // +много всяких данных } |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |