Я новичок в TBB, поэтому мои извинения, если этот вопрос очевиден … но как мне настроить агрегирующий узел с TBB? Из всех готовых узлов я не могу найти правильный тип для него.
Представьте, что у меня есть поток входящих изображений. Я хочу, чтобы узел продолжал принимать изображения (с буфером FIFO), выполнял некоторые вычисления на них (т. Е. Ему нужно внутреннее состояние), и всякий раз, когда он получал N изображений (фиксированный параметр), он испускал один результат.
Я думаю, что нет такого единственного узла в потоковом графе 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
с последовательным параллелизмом (это означает, что одновременно может работать только один экземпляр его тела), который как бы накапливает изображения и делает try_put
вызов изнутри тела к его преемнику, когда число N достигнуто.
Конечно, могут быть и другие варианты реализации желаемого поведения с использованием других топологий потокового графа. Кстати, чтобы сделать такой граф как особый узел, можно было бы использовать composite_node
который представляет подграфы как один узел.
Других решений пока нет …