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