Intel TBB 计算图:如何指定节点的输入队列容量

Posted

技术标签:

【中文标题】Intel TBB 计算图:如何指定节点的输入队列容量【英文标题】:Intel TBB computational graph: how to specify input queue capacity of the node 【发布时间】:2017-12-23 01:08:32 【问题描述】:

我正在寻找 .NET TPL 数据流库的 C++ 模拟。

在 TPL 数据流中,您可以指定并行度和块的容量选项。如果块的输入队列的大小达到它的容量,则相应块的生产者的执行将被暂停:

var buffer = new BufferBlock<int>(new DataflowBlockOptions()  BoundedCapacity = 10 );

var producer = new Task(() =>  
    for (int i = 0; i < 1000; i++) 
        buffer.Post(i);
    
);

var fstAction = new TransformBlock<int, int>(async (i) => 
    return i*i;
, MaxDegreeOfParallelism = 4, BoundedCapacity = 10);

var sndAction = new ActionBlock<int>(async (i) => 
    Thread.Sleep(5000);
    Console.WriteLine(i);
, MaxDegreeOfParallelism = 4, BoundedCapacity = 10);

buffer.LinkTo(fstAction, new DataflowLinkOptions()  PropagateCompletion = true );
fstAction.LinkTo(sndAction, new DataflowLinkOptions()  PropagateCompletion = true );

sndAction.Completition.Wait();

我需要 C++ 中的类似功能。 TBB 似乎是一个不错的选择,但我找不到如何在function_node/buffer_node 上指定容量。这是一个例子:

std::size_t exportConcurrency = 16;
std::size_t uploadConcurrency = 16;

flow::graph graph;

std::size_t count = 1000;
std::size_t idx = 0;

flow::source_node<std::vector<std::string>> producerNode(graph, [&count, &idx](auto& out) 
    out =  "0"s ;
    return ++idx != count;
);

flow::function_node<std::vector<std::string>, std::string> exportNode(graph, exportConcurrency, [](auto& ids) 
    return "0"s;
);

flow::function_node<std::string, std::string> uploadNode(graph, uploadConcurrency, [](auto& chunk) 
    std::this_thread::sleep_for(5s);
    return "0"s;
);

flow::make_edge(producerNode, exportNode);
flow::make_edge(exportNode, uploadNode);

graph.wait_for_all();

【问题讨论】:

TBB Flow Graph似乎没有直接接口来指定缓冲区的容量。但是,使用 TBB 可能会以不同的方式解决您的问题。为了权衡几个变体,您能否提供有关您要解决的问题的更多信息? 【参考方案1】:

在official docs中可以找到limiting resource consumption的三种推荐方式,其中一种是using limiter_node

限制资源消耗的一种方法是使用limiter_node 对可以流经图表中给定点的消息数设置限制。

这不是您想要的确切内容,但仍应进行调查。我还能够找到concurrent queue classes 部分,它可以通过set_capacity 方法与有限容量一起使用。也许你可以这样管理它。希望这会有所帮助。

【讨论】:

以上是关于Intel TBB 计算图:如何指定节点的输入队列容量的主要内容,如果未能解决你的问题,请参考以下文章

微软C++并行库 pplx 的基本用法

intel -tbb 源码cmake构建

intel -tbb 源码cmake构建

Windows下使用VS2008编译OpenCV 2.1 添加Intel TBB和Python支持

TBB(Intel Threading Building Blocks)

TBB的学习