6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
1

Упаковка задачи

10.08.2017, 23:00. Показов 1291. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Подскажите, каким образом можно упаковать некоторый алгоритм, чтобы сделать его через некоторое время.
Например, некоторое время накапливается контейнер (Queue например) с задачами, а затем некоторый TaskController последовательно выполняет их или же распараллеливает в несколько потоков.

Нашел варианты с std::future.
Насколько это быстрый вариант?

PS: Для опыта пытаюсь распараллелить самописный игровой движок и сделать это эффективно. Есть несколько систем (Рендерер, физическая система ...) и все они оперируют системными объектами (Универсальный объект является комбинацией всех системных объектов со всех систем. Что-то типа разложения объекта по осям ). Так вот получается, что системный объект - та самая минимальная единица. И обработку объектов можно распараллелить, введя понятие Задачи.
Скажите, имеет ли деление на такие задачи некоторых действия? Оптимально ли это?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.08.2017, 23:00
Ответы с готовыми решениями:

Упаковка в байты
Можно ли упаковать массив bitset допустим из 100 тысяч битов в байты, чтобы записать это дело в...

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

Упаковка битовых групп
Написать программу, которая упаковывает группы битов, содержащиеся в изолированных переменных, в...

Упаковка битовых групп
Доброго времени суток. Подскажите пожалуйста где я ошибся? Задание в шапке проги // File...

11
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
10.08.2017, 23:18 2
Цитата Сообщение от Kertis138 Посмотреть сообщение
Нашел варианты с std::future.
Насколько это быстрый вариант?
Зависит от того, как этот future будет использоваться, ведь это просто способ синхронизации с асинхронной операцией (подождать результата и т.п.), как и где будет выполняться задача само по себе future не указывает.
Если на каждую задачу запускать по потоку (например, с помощью std::async(std::launch::async, ...)), то это вряд ли будет эффективно. Но тот же future можно получить и из какого-нибудь threadpool-а, например.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
10.08.2017, 23:39  [ТС] 3
Цитата Сообщение от gray_fox Посмотреть сообщение
Если на каждую задачу запускать по потоку (например, с помощью std::async(std::launch::async, ...)), то это вряд ли будет эффективно. Но тот же future можно получить и из какого-нибудь threadpool-а, например.
Допустим, на 4 ядра будет 4 потока. И если задач больше 4, то контроллер просто подождет пока первые 4 задачи завершатся, а затем запустит следующую пачку.
Это будет оптимально?
В таком случае необходимо каждую пачку задач запускать в новых потоках? Или можно как нибудь сохранить старый, добавив туда новую задачу? Время создания нового потока занимает много времени, верно?
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
10.08.2017, 23:41 4
Цитата Сообщение от Kertis138 Посмотреть сообщение
Есть несколько систем (Рендерер, физическая система ...) и все они оперируют системными объектами (Универсальный объект является комбинацией всех системных объектов со всех систем. Что-то типа разложения объекта по осям ). Так вот получается, что системный объект - та самая минимальная единица. И обработку объектов можно распараллелить, введя понятие Задачи.
Думаю, разные подсистемы вполне могут эффективно работать параллельно как конвейер: в качестве задачи подсистема может принимать набор объектов.
Краеугольный камень тут, как я вижу - минимизировать точки синхронизации между разными стадиями, иначе от "параллельности" будет мало толку. Так же надо учитывать latency конвеера (т.е. сколько занимает выполнение всех стадий).
Но я не сильно знаком с игровыми движками и подобным, так что это мнение "со стороны"
1
Заблокирован
10.08.2017, 23:51 5
Может будет полезным
https://archive.org/details/GDC2015Gyrling_201508
http://twvideo01.ubm-us.net/o1... aughty.pdf
2
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
10.08.2017, 23:53 6
Цитата Сообщение от Kertis138 Посмотреть сообщение
Допустим, на 4 ядра будет 4 потока. И если задач больше 4, то контроллер просто подождет пока первые 4 задачи завершатся, а затем запустит следующую пачку.
Ну threadpool по сути так и работает.
Как конкретно распределить выполнение задач разных подсистем по потокам я вам не скажу. Думаю, как минимум будет проблематично, если возможно, мигрировать вывод графики по разным потокам ОС.
Можно выделить по потоку на каждую подсистему (так проще, я думаю), выполнять несколько подсистем в одном потоке и т.д., тут уж как решите как лучше (и как вообще можно))
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
11.08.2017, 00:50  [ТС] 7
Цитата Сообщение от gray_fox Посмотреть сообщение
Думаю, разные подсистемы вполне могут эффективно работать параллельно как конвейер
Да, все системы уже работают параллельно, оперируя системными объектами. В то время как Универсальный Объект - контейнер всех системных объектов.

Цитата Сообщение от Tree depth Посмотреть сообщение
http://twvideo01.ubm-us.net/o1/vault...he_Naughty.pdf
Вот! Тут та самая идея с очередью задач и контроллером этих задач.
Intel несколько лет назад описала похожую идею, откуда я взял довольно много интересных подходов.
Ссылка на статью
+ перевод

По Вашим статьям еще более совершенная оптимизация - они собирают Task-и не в одну очередь, а делят ее на несколько очередей по приоритету. Как они пишут - Job выполняется в рабочем потоке и Job может поставить в очередь другие Jobs. Это все отлично. Вот теперь бы разобраться, как представляется эта самая jobs кодом в с++
Если взять Лямбду, код которой меняет объект, то стоит вопрос удобства этого механизма.

Получается такой прототип:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename Base>
class Task 
{
public:
   Task(Base *object, std::function<Base*> func) 
      : p_object(object), 
        p_func(func)
   {}
 
   void run() 
   {
        p_func(p_object); 
   }
  
private:
   Base *p_object;
   std::function<Base*> p_func;
};

Тогда такие Задачи я помещаю в очередь и собственно получается что-то рабочее.
Что думаете? Разумная реализация или есть другие варианты?
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
11.08.2017, 01:20 8
Цитата Сообщение от Kertis138 Посмотреть сообщение
Да, все системы уже работают параллельно, оперируя системными объектами.
Хм, т.е. решение уже есть и нужно его оптимизировать? Потому что, судя по 1-му посту, выглядит, как будто вы только подступаетесь к задаче. My bad
Цитата Сообщение от Kertis138 Посмотреть сообщение
Intel несколько лет назад описала похожую идею, откуда я взял довольно много интересных подходов.
Ну я примерно подобное и предлагал, но раз вы уже в курсе...
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
11.08.2017, 01:38  [ТС] 9
gray_fox, Сейчас у меня нет такого понятия как Задача. Параллельное выполнение в данный момент - это самое обычное foreach systems[i].Frame();. А после добавления Задач я могу вводить понятие - очереди задач, дробления задач на подзадачи в случае некоторых реализаций...

.
Цитата Сообщение от Tree depth Посмотреть сообщение
http://twvideo01.ubm-us.net/o1/vault...he_Naughty.pdf
Тут используется указатель на функцию - в принципе то, что нужно. Весьма полезная статья оказалась. Кроме того, там еще и Fibers и куча других вкусных плюшек
Очень интересно все это попробовать повторить.
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
11.08.2017, 02:11 10
Цитата Сообщение от Kertis138 Посмотреть сообщение
gray_fox, Сейчас у меня нет такого понятия как Задача.
Ну саму задачу (как что-то атомарное, где-то исполняющееся) можно представить просто как ф-ю (std::function<void ()>, например, или как указатель на ф-ю, если нужно и т.д.), которая может делать что угодно, так что с этим уж проблем вроде быть не должно.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
11.08.2017, 02:46  [ТС] 11
Цитата Сообщение от gray_fox Посмотреть сообщение
Ну саму задачу (как что-то атомарное, где-то исполняющееся) можно представить просто как ф-ю (std::function<void ()>, например, или как указатель на ф-ю, если нужно и т.д.), которая может делать что угодно, так что с этим уж проблем вроде быть не должно.
Спасибо! Теперь с задачами разобрался. Появился вопрос, как разделять задачи по тактам?
Если брать статью, то там предлагают 2 варианта параллельного выполнения систем - свободный и жесткий пошаговый. В первом каждая система сама выбирает сколько ей нужно тактов до синхронизации, а во втором для каждой системы заранее отведенное время на работу. Я не совсем понял, что они имеют ввиду под тактом? Если считать, что такт - это время выполнения какой-то задачи для какой-то системы, то время здесь разное (зависит от задачи). Не знаете, что подразумевается под делением на такты? И каким образом система может выбирать, если ей тоже неизвестно время работы той или иной задачи?

Добавлено через 14 минут
Пока сделал следующий вывод (не знаю насколько он правдив):

Жестко пошаговый режим:
Что-то из разряда
C++
1
2
3
4
5
6
7
thread system[0]
...
thread system[N]
 
join system[0]
...
join system[N]
То есть запускает все системы в поток и ждет их.

Свободный режим:
Здесь сложнее. Так же идет запуск всех систем в потоках. Далее, как пишут Intel, идет опрос систем: "Сколько тебе нужно тактов?". Каким образом это происходит - не очень понятно
0
Заблокирован
11.08.2017, 03:10 12
Цитата Сообщение от Kertis138 Посмотреть сообщение
Вот теперь бы разобраться, как представляется эта самая jobs кодом в с++
https://www.reddit.com/r/gamed... og_engine/
2
11.08.2017, 03:10
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.08.2017, 03:10
Помогаю со студенческими работами здесь

Упаковка и разпаковка файлов
Програма должна делать упаковку и разпаковку разних файлов. Формат файла такой 1. Первие 4 байта...

Упаковка и распаковка даты.
Добрый день. Помогите найти ошибку. А она заключается в том, что число в битовом представлении в...

Упаковка строки с шестнадцатиричными значениями
Доброго времени суток! Дано вот такое задание: Упакованная строка, содержащая символьное...

Упаковка бинарного дерева в массив
Подскажите пожалуйста, имеется заполненное бинарное дерево. Необходимо организовать его обход в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Интеграция Arduino и ChatGPT: Практическое руководство
InfoMaster 16.01.2025
В современную эпоху технологических инноваций интеграция искусственного интеллекта с микроконтроллерами открывает принципиально новые возможности для создания умных устройств и автоматизированных. . .
Как создать робота, управляемого ChatGPT
InfoMaster 16.01.2025
Концепция проекта В современную эпоху искусственный интеллект и робототехника становятся все более доступными для энтузиастов и разработчиков. Создание роботизированной руки, управляемой ChatGPT,. . .
Как создать ChatGPT бота в Telegram на Python
InfoMaster 16.01.2025
В современном мире технологии искусственного интеллекта становятся все более доступными для разработчиков, открывая новые возможности для создания умных и интерактивных приложений. Одним из самых. . .
Машинное обучение с помощью Python
InfoMaster 16.01.2025
Машинное обучение стало неотъемлемой частью современных технологий, позволяя компьютерам учиться на основе данных и принимать решения без явного программирования. В сочетании с языком. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru