Агрегирующий узел в TBB

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

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

2

Решение

Я думаю, что нет такого единственного узла в потоковом графе 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 который представляет подграфы как один узел.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]