У меня есть несколько объектов. Мне нужно иметь дело с каждым пара одновременно (не каждая пара, произвольные пары), но каждый объект должен рассматриваться только последовательно.
Я изо всех сил пытаюсь описать алгоритм, который может справиться с этим, желательно без привлечения нескольких блокировок. У меня есть PPL от Microsoft, поэтому у меня есть несколько функций параллелизма довольно высокого уровня.
Наконец, большую часть времени я буду иметь дело с очень небольшим количеством пар на объект — с нулем и одним особенно распространенным. Но многие-многие пары — это граничное условие, с которым мне приходится иметь дело.
Есть предложения по такому алгоритму?
PPl работает очень хорошо, если вы можете структурировать свой алгоритм как параллельный цикл: parallel_for, parallel_for_each (без зависимостей между итерациями) или parallel_reduction, где вы объединяете / объединяете решения.
Это также хорошо работает, если вы можете структурировать свой алгоритм на деление & покорить стиль рекурсии.
Можете ли вы реструктурировать последовательную форму вашего алгоритма, чтобы соответствовать этим? Это облегчит распараллеливание.
Ваше описание не было достаточно конкретным для меня, чтобы давать конкретные предложения, но, похоже, вы пытаетесь найти отличные пары / предотвратить дублирование работы. Несколько методов, которые могут быть полезны (если вы более конкретны, вы можете получить больше):
1) положить все элементы в набор / карту, а затем перебрать уникальные. В качестве альтернативы, если вы используете concurrent_unordered_set / map, вы можете проверить состояние метода вставки, чтобы проверить уникальность в параллельном цикле.
2) вы также можете извлечь выгоду из использования shared_ptr, std ::uture или async_future (см. Документацию), чтобы помочь с уникальностью.
3) если у вас есть более сложные зависимости, вы можете посмотреть на concurrency :: task :: then или библиотеку агентов.
Других решений пока нет …