Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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