У меня есть несколько «сайтов» (м), каждый из которых должен обработать событие (куски данных. Все доступно на ходу). Каждое событие (n из них) отправляется на каждый сайт для обработки. Так что вы можете подумать, что у меня есть задачи NXM. Порядок обработки не важен, только то, что один сайт не может обрабатывать более одного события за раз (поэтому Задача (m, x) не может выполняться параллельно Задаче (m, y))
В настоящее время это реализовано с использованием «OMP параллели для» на сайтах, вложенных в обычный цикл for для событий.
for(...event...)
#pragma omp parallel for
for(...site...)
site.process(event)
Это работает нормально, однако не все сайты имеют одинаковую сложность для каждого события. все сайты должны ждать самого медленного сайта, прежде чем переходить к следующему событию. Я предполагаю, что, если я позволю работникам перейти к следующему событию, я смогу сэкономить в два раза.
Каков наилучший способ реализовать это? Я использую C ++
Я смотрю на TBB Flow Graph, или несколько трубопроводов …
Еще одно соображение заключается в том, что каждое «событие» должно быть прочитано с диска и занимает немного памяти. Хотя это пока не критично, мне бы хотелось иметь как можно меньше событий в системе за раз (или ограничить их). В текущей реализации у меня есть только один (плюс пара готовится в фоновом режиме)
Спасибо
Я хотел бы использовать процесс менеджера, который отслеживает обработанные события каждой стороны (матрица m * n bool) и события, которые в данный момент «используются».
Каждый сайт начинается со «случайного» события.
Менеджер просматривает сайты, чтобы проверить, закончили ли они текущее событие, и назначает новое, если это возможно.
C ++ 11 обеспечивает станд :: асинхронной для таких задач.
Каждый вызов процесса выполняется асинхронно, и вы можете циклически просматривать соответствующие будущие элементы, чтобы проверить, завершены ли они ( ждать ).