Как определить объем работы, чтобы дать asyn c заданий? - PullRequest
0 голосов
/ 16 марта 2020

Я встречал много советов при написании асинхронных приложений - Хартмут Кайзер (разработчик пакета hpx из группы STEllAR ) повторяет мантру «сделать каждую асинхронную задачу c малой» насколько это возможно, но не меньше ", вместе с рекомендацией использовать фьючерсы для моделирования зависимостей данных и создавать большое количество асин c задач, чтобы ЦПУ всегда было чем заняться.

" Так же мало, как и возможно, но не меньше "кажется (намеренно) расплывчатым. Как и ожидалось, в разных ситуациях будут разные накладные расходы на запуск новых потоков. Есть ли способ (например, в C ++) определить во время выполнения, какой подходящий «размер зерна» - ie. сколько работы назначить для асин c задачи - это? Существует простой метод деления ваших данных на столько бинов, сколько возвращает std::thread::hardware_concurrency(), но он легко приводит к случаям, когда выполняется n-1 потоков, а последний поток занят и удерживает всех - когда меньший «размер зерна» и большее число асинхронных вызовов c позволит ранее извилистым потокам справиться с некоторой слабостью. Однако слишком малый размер зерна и затраты на запуск всех этих задач затмевают преимущества погони за эффективностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...