Узел агрегации в TBB

Я новичок в TBB, поэтому прошу прощения, если этот вопрос очевиден... но как настроить узел агрегации с TBB? Из всех готовых узлов я не могу найти для него подходящий тип.

Представьте, что у меня есть поток входящих изображений. Мне нужен узел, который продолжает принимать изображения (с буфером FIFO), выполняет над ними некоторые вычисления (т. е. ему требуется внутреннее состояние) и всякий раз, когда он получает N изображений (фиксированный параметр), он выдает один результат.


person Jonn Dove    schedule 05.02.2018    source источник
comment
У меня точно такой же вариант использования, так как вы не приняли ни одного ответа, вы нашли лучшее решение? Если да, не могли бы вы поделиться им, пожалуйста?   -  person Samuel    schedule 26.02.2020


Ответы (1)


Я думаю, что в потоковом графе TBB нет такого единственного узла, который выполняет накопление с какой-то предварительной обработкой, а затем, когда накопление выполнено, передает результат его преемнику. Однако я считаю, что эффект может быть достигнут при использовании нескольких узлов. Например, рассмотрим queue_node в качестве отправной точки на графике. Он будет служить буфером с семантикой FIFO. После него идет multifunction_node с N выходами. Этот узел выполнит фактическую предварительную обработку изображения и отправит результат на свой выходной порт, соответствующий номеру изображения. Затем идет join_node, все N входов которого подключены к соответствующим выходам multifunction_node. В конце будет преемник join_node, который получит на вход N изображений. Поскольку join_node объединяет свои входные данные в кортеж, недостаток этой схемы можно быстро увидеть, если число N относительно велико.

Другой вариант может иметь тот же queue_node, связанный с function_node с неограниченным параллелизмом в качестве преемника (предполагается, что function_node выполняет некоторую предварительную обработку изображения), а затем иметь multifunction_node с последовательным параллелизмом (это означает, что только один экземпляр его тела может работать на a time), который будет как бы накапливать изображения и выполнять try_put вызов изнутри тела своему преемнику, когда будет достигнуто число N.

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

person Aleksei Fedotov    schedule 06.02.2018
comment
Ставить queue_node перед неограниченным function_node практически бесполезно, так как последний никогда не отклоняет свой ввод. Если важно соблюдать определенный порядок (например, порядок кадров в видеопотоке), то между безлимитным калькулятором и последовательным агрегатором лучше поставить sequencer_node. - person Alexey Kukanov; 07.02.2018