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 计算图:如何指定节点的输入队列容量的主要内容,如果未能解决你的问题,请参考以下文章
Windows下使用VS2008编译OpenCV 2.1 添加Intel TBB和Python支持