Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost thread и равномерная загрузка ядер 
:(
    Опции темы
mrgloom
Дата 22.9.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



возможно ли опредлить какие ядра не загружены или какое ядро загружено меньше всего?

допустим я использую 
std::size_t thcount = boost::thread::hardware_concurrency();
перед тем как вызвать thread_group
и знаю что одно ядро в данный момент скорее всего загружено
есть ли смысл делать thcount=thcount-1; ?
т.е. чтобы thread_group заняли все оставшиеся неиспользуемые ядра?
 и гарантируется ли вообще что новый тред будет использовать неиспользуемое или менее всего загруженное ядро? 
PM MAIL   Вверх
azesmcar
Дата 22.9.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mrgloom @  22.9.2011,  10:12 Найти цитируемый пост)
возможно ли опредлить какие ядра не загружены или какое ядро загружено меньше всего?

Можно. Смотри API конкретной операционной системы.


Цитата(mrgloom @  22.9.2011,  10:12 Найти цитируемый пост)
и знаю что одно ядро в данный момент скорее всего загружено
есть ли смысл делать thcount=thcount-1; ?
т.е. чтобы thread_group заняли все оставшиеся неиспользуемые ядра?
 и гарантируется ли вообще что новый тред будет использовать неиспользуемое или менее всего загруженное ядро?  

Ты это знаешь на данный момент, но понятия не имеешь что будет через 2 секунды. Создавай оптимальное количество потоков, если хочешь добиться максимальной производительности. 
PM   Вверх
mrgloom
Дата 22.9.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата(azesmcar @  22.9.2011,  13:36 Найти цитируемый пост)
Можно. Смотри API конкретной операционной системы.

т.е. к бусту это никакого отношения не имеет?
Цитата

Ты это знаешь на данный момент, но понятия не имеешь что будет через 2 секунды. Создавай оптимальное количество потоков, если хочешь добиться максимальной производительности.  

на данный момент я создаю кол-во потоков = кол-ву ядер в компьютере, как узнать оптимальное кол-во?


PM MAIL   Вверх
azesmcar
Дата 22.9.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mrgloom @  22.9.2011,  14:04 Найти цитируемый пост)
т.е. к бусту это никакого отношения не имеет?

В boost-е этого нет.

Цитата(mrgloom @  22.9.2011,  14:04 Найти цитируемый пост)
на данный момент я создаю кол-во потоков = кол-ву ядер в компьютере, как узнать оптимальное кол-во?

hardware_concurrency() возвращает оптимальное количество. Это не обязательно количество ядер, он учитывает количество ядер, процессоров, а также возможности hyperthreading-а.
PM   Вверх
FCM
Дата 4.10.2011, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Некоторые высокоуровневые системы распараллеливания реализуют механизм заимствования заданий (workstealing). Данный механизм поддерживается в Intel Cilk Plus, а также в OpenMP при использовании так называемых явных заданий (вводимых директивой task).
Т.е. если к одному логическому процессору стоит в очереди много заданий, то часть из них может быть "украдена" освободившимися логическими процессорами. 
PM MAIL   Вверх
boostcoder
Дата 4.10.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



FCM, ну так об этом говорится в спецификации OpenMP-3.1
PM WWW   Вверх
mrgloom
Дата 26.10.2011, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



использую 
std::size_t thcount = boost::thread::hardware_concurrency();

имею 4 ядра.
если смотреть в диспетчере задач то загрузка 27% (т.е. предположительно 1 ядро полностью нагружено) или это все 4 ядра загружаются не полностью?
PM MAIL   Вверх
azesmcar
Дата 26.10.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mrgloom @  26.10.2011,  15:08 Найти цитируемый пост)
использую std::size_t thcount = boost::thread::hardware_concurrency();


Цитата(mrgloom @  26.10.2011,  15:08 Найти цитируемый пост)
если смотреть в диспетчере задач то загрузка 27% 

Круто у тебя эта простенькая функция процессор нагружает smile 


PM   Вверх
boostcoder
Дата 26.10.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



azesmcar, я думаю, что если ее вызывать в цикле без слипа, то можно достичь 100 процентов. что уже будет не шуточной нагрузкой программы smile 
PM WWW   Вверх
azesmcar
Дата 27.10.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  26.10.2011,  17:34 Найти цитируемый пост)
azesmcar, я думаю, что если ее вызывать в цикле без слипа, то можно достичь 100 процентов. что уже будет не шуточной нагрузкой программы smile  

Да, если сильно постараться ...  smile 

А вообще (для ТС) это был намек на то, что (мягко говоря) предоставленных данных совершенно недостаточно для ответа на вопрос.

PM   Вверх
mrgloom
Дата 1.11.2011, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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>) по указателям на чтение возможно из-за этого малая нагрузка?
PM MAIL   Вверх
boostcoder
Дата 1.11.2011, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mrgloom, из той информации что ты предоставил, ничего определенного сказать невозможно.
PM WWW   Вверх
mrgloom
Дата 1.11.2011, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



а какую надо информацию? полный код task_execute?

Это сообщение отредактировал(а) mrgloom - 1.11.2011, 14:56
PM MAIL   Вверх
boostcoder
Дата 1.11.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mrgloom @  1.11.2011,  14:56 Найти цитируемый пост)
полный код task_execute?

угу.
или хотя бы подробно опиши что он выполняет.
а сейчас, в чем собственно вопрос?
PM WWW   Вверх
mrgloom
Дата 11.11.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



если описать в целом, то есть некая структура- дерево( скорее граф)
есть таски - указатель на узел дерева+ какая то инфа, обращаемся к узлу делаем обсчет.
я запускаю кол-во тредов равное  std::size_t thcount = boost::thread::hardware_concurrency(); 
у каждого треда есть его личная очередь тасков и личный выходной вектор для данных.

так вот я предполагаю, что проблема в том что треды обращаются к одному дереву на чтение и поэтому производительность не блещет.
т.е. такое ощущение, что загружено только 1 ядро.

хранится дерево(граф) как 
vector<Hierarchy>
где 
class Hierarchy
{
     vector<Hierarchy*> ref;
      // +много всяких данных
}
PM MAIL   Вверх
bsa
Дата 11.11.2011, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Возможно, что и так. Все зависит от того, как ты сделал синхронизацию. Если ты захватываешь мьютекс, защищающий все дерево всеми потоками на все время выполнения задачи, то не удивительно, что работает только один поток.
PM   Вверх
FCM
Дата 11.11.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(mrgloom @  26.10.2011,  15:08 Найти цитируемый пост)
имею 4 ядра.
если смотреть в диспетчере задач то загрузка 27% (т.е. предположительно 1 ядро полностью нагружено) или это все 4 ядра загружаются не полностью? 


Если время работы программы заметное (несколько секунд и более) и показатель около 27% - то скорее всего  реально нет распараллеливания или оно, как отмечено bsa, вырождается из-за каких-то синхронизаций. 
В Windows в диспетчере задач во вкладке быстродействие можно видеть графически загрузку отдельных ядер.
(Можно также  попробовать сравнить тайминг с последовательным аналогом программы)

А вообще не исключено, что параллельное выполнение потоков (не привязанное явно к логическим процессорам, если таковое возможно), будучи вырожденным (благодаря неудачным синхронизациям) в последовательное, распределяется операционной системой  на одно ядро.

Это сообщение отредактировал(а) FCM - 12.11.2011, 10:39
PM MAIL   Вверх
boostcoder
Дата 11.11.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mrgloom, не хочу гадать. код выкладывай.
PM WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.