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

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

Страниц: 1 ... 11 12 [13]   Вниз
  Печать  
Автор Тема: К вопросу об организации взаимодействия пула производителей и одного потребителя  (Прочитано 60750 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #180 : Сентябрь 29, 2019, 20:59 »

Т.е. для каждой конкретной задачи, должен ставится вопрос:  а нужно ли её распараллеливать, и если нужно, то как наиболее эффективно..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #181 : Сентябрь 29, 2019, 21:21 »

Ну я, специально, этот случий не расматривал.. Хотя, в общем, это не сложно посмотреть.. (Посмотрю)
Я хотел сказать, что в подавляющем большинстве случаев мьютекс будет свободен.
Ваши "оптимизации" с двойной проверкой могут стоить дороже вашего первоначального варианта. Точнее в варианте с ожиданием завершения всех задач это не будет иметь роли, а вот если такие "оптимизации" применять в постоянно исполняемом коде, то может быть медленнее.

Современный мьютекс это атомарная переменная и пытаться ускорить ее использованием другой атомарной операции не всегда удается. Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #182 : Сентябрь 29, 2019, 22:55 »

Цитировать
Я хотел сказать, что в подавляющем большинстве случаев мьютекс будет свободен.
Что значит в подавляющем большинстве случаев?

Да, я согласен, что если вот так, как в предложенных тестах, кидать "мелкие" задачи, то мы неменуемо свалимся в  bottlen neck эффект (эффукт узкого горла - пробка)
Ну даже тут вариант с футурами проходит  Улыбающийся

Я не хочу в продакшен выкидывать wrapper_pool, поскольку оно спорно..(Но это обсуждаемо Улыбающийся)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #183 : Сентябрь 30, 2019, 04:28 »

       if (std::atomic_fetch_sub(&m_task_count, 1) == 1)
Я пользуюсь атомарным инк(дек)рементом уже не один десяток лет. Не верите - ну страхуйтесь Улыбающийся Вспомнилось неплохое объяснение типа:

Атомарная арифметика оперирует/возвращает "моментальные фотографии". Т.е. то что "изображено на фото" - правда, реальный факт который "имел место". НО когда мы получили это "фото" мы должны иметь ввиду что это "уже в прошлом" и могли произойти др события. На первый взгляд в этом нет смысла - ведь возвращенному значению все равно "нельзя верить", оно могло уже стать иным. Но "факт" можно использовать как в примере выше. И факты эти случаются строго один за одним (за счет отой "ordered memory semantic"), а вот какая нитка получит какое фото - уже как фишка ляжет.

Ну даже тут вариант с футурами проходит  Улыбающийся
Да какой там "вариант", просто "так заработало" Улыбающийся Зачем нужен контейнер если можно обойтись счетчиком? 
Цитировать
- А почему Вы ищете только под фонарем?
- Потому что там светло
Да, я согласен, что если вот так, как в предложенных тестах, кидать "мелкие" задачи, то мы неменуемо свалимся в  bottlen neck эффект (эффукт узкого горла - пробка)
Дело не только в "мелких задачах". Вы набиваете пул по самые "не балУйся" - но это "хороший" случай, а в жизни часто не так - напр нужно нужно сначала посчитать всего с десяток задач, "осмотреться", потом еще десяток-другой и.т.д. (в тестах что я выкладывал это есть). Здесь постоянное усыпление/пробуждение ниток обходится дорого.

Т.е. для каждой конкретной задачи, должен ставится вопрос:  а нужно ли её распараллеливать, и если нужно, то как наиболее эффективно..
Да-да-да Улыбающийся В жизни происходит примерно так

- во, тут превью совсем дохнет, 2-3 fps. Ладно, профайлим - ага, жрется на пересчете нормалей. Отключаем это место - во, 70 fps. На GPU не перенести. А "задача" здесь - получить 2 вектора вычитанием и записать в рез-т векторное произведение. До того atan2 там ой далеко. Ну и понеслась...

Вообще, в идеале, хотелось бы реализовать идею cpp-taskflow https://github.com/cpp-taskflow/cpp-taskflow
Понравилась мне она очень  Улыбающийся

Так, чисто для удовлетворения своих эстетических чувств) К тому же я могу себе это позволить)
А конкретнее? Те картинки мне, правду сказать, и нафиг не нужны. А если что интересное - поддержу обсуждение, только тему новую создайте
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #184 : Сентябрь 30, 2019, 05:40 »

Я не хочу в продакшен выкидывать wrapper_pool, поскольку оно спорно..(Но это обсуждаемо Улыбающийся)
m_ax, по моему мнению нет особого смысла в подобных "оптимизациях":
Код
C++ (Qt)
#if M_AX
       std::unique_lock<std::mutex> locker(m_mutex);
       if (--m_task_count == 0) {
           locker.unlock();
           m_cond.notify_one();
       }
   #else
       if (std::atomic_fetch_sub(&m_task_count, 1) == 1)
       {
           std::unique_lock<std::mutex> locker(m_mutex);
           if (m_task_count == 0)
           {
               locker.unlock(); // <== делаем unlock перед пробудкой..
               m_cond.notify_one();
           }
       }
   #endif
 

Это либо ничего не ускорит, как в данном случае, а может и ухудшить.
Я это хотел сказать. Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #185 : Сентябрь 30, 2019, 05:43 »

Я пользуюсь атомарным инк(дек)рементом уже не один десяток лет.
Я думаю сотни. Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #186 : Сентябрь 30, 2019, 06:01 »

Я не хочу в продакшен выкидывать wrapper_pool, поскольку оно спорно..(Но это обсуждаемо Улыбающийся)
Этот враппер можно положить в примеры. Улыбающийся

По поводу "толстоты" future... Улыбающийся
future это указатель на приватную структуру promise, т.е. если вы используете packaged_task, то вы их и так создаете. Улыбающийся
Внутри promise использует тот же атомик + futex, т.е. весит она атомарную переменную + хранилку для результата (если он есть).

Ну а дальше сами (или пользователи пула) решайте, хранить массив futur (массив указателей) или нет. Улыбающийся
Записан
Страниц: 1 ... 11 12 [13]   Вверх
  Печать  
 
Перейти в:  


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