2014-09-09 5 views
0

У меня есть число «сайтов» (m), каждое из которых должно обрабатывать событие (куски данных, все доступные на ходу). Каждое событие (n из них) отправляется на каждый сайт для обработки. Поэтому вы можете подумать, что у меня есть nxm-задачи. Порядок обработки не важен, только один сайт может не обрабатывать более одного события за раз (так что Task (m, x) не может работать параллельно с Task (m, y))Выполнение нескольких задач параллельно с зависимостями

В настоящее время он реализован с использованием «OMP параллель» на сайтах, вложенных в регулярном для цикла по событиям

for(...event...) 
#pragma omp parallel for 
    for(...site...) 
     site.process(event) 

Это работает отлично, однако, не все сайты имеют одинаковую сложность для каждого события. то есть все сайты должны ждать самого медленного сайта, прежде чем переходить к следующему событию. Я предполагаю, что если я разрешу рабочим перейти к следующему событию, я могу сэкономить в два раза.

Каков наилучший способ реализации этого? Я использую C++ Я смотрю в TBB Flow Graph или несколько линий трубопроводов ...

Еще одно соображение заключается в том, что каждое «событие» должно считываться с диска и занимает немного памяти. Хотя пока не критично, я хотел бы иметь как можно меньше событий в системе (или ограничить их). В текущей реализации у меня есть только одна (плюс пара, подготовленная в фоновом режиме) Thanks

+0

Вы не указали никаких зависимостей. может ли сайт A завершить все задачи 1..n до начала работы сайта B? – NiRR

+0

есть. Возможно, зависимости не лучшее слово. Предел распараллеливания ...? Итак, да, я мог бы каждый сайт обрабатывать все события, а затем переходить на следующий сайт. Это просто реверсирует порядок двух циклов (оставляя внутренний с параллелью), но я не сумасшедший об этом решении из-за накладных расходов на подготовку (чтение) всех событий m раз. – user2232888

+0

Вам все еще нужен ответ? – Anton

ответ

0

Я бы использовал процесс менеджера, который отслеживает обработанные события каждой стороны (m * n bool matrix) и события, которые в настоящее время «используются».

Каждый сайт начинается со случайного события. Менеджер циклически проходит через сайты, чтобы проверить, завершили ли они текущее событие и назначили новый, если это возможно.

C++ 11 предоставляет std::async для выполнения таких задач.

Каждый вызов процесса выполняется как асинхронный, и вы можете перебирать соответствующие элементы будущего, чтобы проверить, закончены ли они (wait_for).

Смежные вопросы