Какой забавный вопрос ... как вы заметили, вы не сможете позволить себе накладные расходы, связанные с традиционной блокировкой рабочей очереди для этого. Я бы посоветовал вам попробовать использовать одну из существующих сред программирования на основе мелкозернистых задач, если вы можете ... Я думаю об этом в трех этапах работы:
Первая часть проблемы - обеспечение безопасности, правильности и параллелизуемости, и похоже, что вы это сделали, потому что ваша функция чистая.
Я думаю, что следующая наиболее сложная часть - это описание параллелизма, в частности, вы упомянули, что эта функция вызывается много-много раз. Можете ли вы организовать это и отделить планирование функции от ее работы? Если вы не можете конвейерно это сделать, похоже ли это на параллельный цикл, обход дерева или это более неструктурировано, чем это. В частности, подчинение Амдалу, если вы не можете перекрыть работу, и убедитесь, что есть несколько экземпляры этого или чего-то еще, запущенного в то же время, вы эффективно последовательны, даже если вы чисты. Все, что вы можете сделать, чтобы преобразовать работу в конвейер, рекурсивный обход дерева (или параллельный цикл) или если вам требуется более неструктурированная работа с явными зависимостями между задачами, здесь поможет независимо от используемой библиотеки.
Последняя область, о которой я думаю, - это обеспечение эффективного выполнения на вашей платформе, что включает в себя сокращение накладных расходов и конфликтов как в вашем коде, так и в коде планирования, а также обеспечение максимальной эффективности любого последовательного кода. Если вы не можете использовать одну из существующих библиотек и должны создать свою собственную, я бы посоветовал вам взглянуть на work-stealing queue и алгоритмы самостоятельного планирования, как вы заметили, вы не сможете увидеть выгоды от использования традиционных блокировок, потому что их стоимость перевешивает затраты на ваши функции, а вы Скорее всего, вам нужно будет изучить методы без блокировки, чтобы снизить затраты на планирование и удаление задачи в любую используемую вами очередь. Вам также нужно будет уделять много внимания совместному использованию и конкуренции как в вашем алгоритме планирования, так и в вашей функции, потому что на этом уровне детализации в дополнение к обычным ошибкам прогнозирования ветвлений и пропускной способности инструкций вам также нужно будет посмотреть в общем состоянии и конфликте даже при чтениях, потому что они тоже могут быть источниками конкуренции а>.
Прошу прощения, если это не было супер-конкретным, но я надеюсь, что это было полезно.
person
Rick
schedule
24.02.2009