问题标签 [tbb-flow-graph]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
176 浏览

c++ - parallel_pipeline 未终止

我在我的代码中使用parallel_pipeline函数。有时当我的条件得到满足时,它会停止管道,有时它不会。当流控制调用停止时,即使在此之后它也不会终止,而是调用它的下一部分并在控制台上打印然后控制台输出变得就像它一直处于无限循环并且什么都不做。

代码是:

请帮助找出代码错误的地方。

0 投票
1 回答
1461 浏览

c++ - TBB 流程图条件执行

是否可以动态控制 TBB Flow Graph 中的执行路径,使用节点的输出作为条件变量来确定是否应该启动另一个节点?

0 投票
2 回答
814 浏览

c++ - TBB Flow Graph:如何等待输出中的特定令牌?

我正在尝试为 Flow Graph 编写一个适配器,该适配器模仿类似管道的同步函数调用。但我不明白如何阻止并等待特定令牌的输出。调用wait_for_all图表并没有帮助,因为我不需要等待所有值。有人可以提出解决方案吗?

0 投票
1 回答
1139 浏览

c++ - 如何:具有多个异步输入和多个输出的 TBB 节点

我是线程构建块 (TBB) 的新手;我需要用 TBB 节点实现以下逻辑:

N 类型的节点接收两个输入;例如: 1. std::vector // 数据 2. bool // 标志

这些输入是异步的。

如果输入类型为 1,则处理类型为 N 的节点所拥有的数据以产生两个输出,例如: a.标准::向量 b。整数

如果输入是类型 2,则处理类型为 N 的节点所拥有的数据以产生一个输出,例如 std::vector。

我一直在尝试使用 tbb::flow::or_node 来制定输入部分,并使用 tbb::flow::multifunction_node 来制定输出部分。

如果只有一个输入和多个输出,这个逻辑可以用 tbb::flow::multifunction_node 来写(我测试过,可以)。如果有一个输出和多个输入,我找到了说明解决方案的代码示例。但是,我不清楚如何使用 TBB 框架实现多个异步输入和多个输出的情况。欢迎提出建议。

0 投票
2 回答
961 浏览

c++ - 如何在运行时创建 N 个整数的元组

我需要一种通用方法来在运行时创建 N 个整数的元组,其中 N 是向量的大小(不超过 20)。例如:

编辑:只是为了澄清......我不能坚持使用向量,因为我需要元组类型来使用 lambda 表达式创建 TBB 流图模板类的对象。

编辑2:显然,我需要解释这个问题。我有非结构化网格,我动态划分为 X 个分区。这些分区中的每一个都与 N 个其他分区相连,其中 N > 1。这些连接定义了我需要用来构建流程图的分区之间的依赖关系。由于网格的结构只有在运行时才知道,所以依赖结构也是如此。因此,我需要一种方法来创建特定的图形节点(TBB 类),这些节点将表示输入依赖关系的元组作为模板参数。

下面是一个如何创建具有两个输入依赖项的 TBB 函数节点的示例:

现在,假设我们将网格划分为 10 个分区。我们通过检查边列表来确定每个分区的依赖关系。如果有一条边连接两个分区,比如part1part2,那么这些分区之间存在依赖关系。我使用每个分区向量收集依赖信息。现在问题出现了:我需要使用这个依赖信息(存储在向量中)来创建一个函数节点图,这些节点需要基于分区依赖关系的正确元组类型。比如part1part2有如下依赖[2,4,5,9]和[1,3],那么我需要这两个函数节点:

0 投票
2 回答
995 浏览

c++ - 如何在 tbb 流程图中中止节点及其子节点的执行

我目前正在测试 tbb 的流程图功能。为了使用它,我必须能够中止图中某个节点的执行,包括所有依赖它的子节点,但让其他不依赖它的子节点执行。从主体中抛出异常或调用 task::cancel_group_execution() 会中止所有节点的执行。

0 投票
1 回答
510 浏览

c++ - 在英特尔 TBB 函数对象中生成线程安全随机数(相同种子/不同种子)

我正在使用 Intel TBB,其中每个线程都调用一个 const 函数对象。代码如下

程序流程解释如下:(假设8个线程和8个顶点并行->假设)
1)tbb::parallel_for_each(vertex_begin, vertex_end, my_func<Graph, int>(G, t));
2)每个线程调用my_func。在 my_func 中,每个线程计算顶点的 out_edge_iterator 范围。
3) 每个线程执行以下操作: 每条边的 process_edge 函数对象:
std::for_each(out_edge_begin, out_edge_end, process_edge<graph>(G));
4)函数对象process_edge有一个随机数生成器(0,1)如上。

我的问题是:
随机数生成器线程安全吗?因为我有时会得到错误的结果。虽然答案取决于生成的随机数,
但我不确定我的随机数生成器类是否是线程安全的。

假设我想使用相同的种子,以便生成相同的随机数。
我该如何做到这一点?
我在生成线程安全的随机数生成器类时有点困惑

如果假设我想使用线程安全的随机数,tbb::parallel_for_each()
我该怎么做?我的随机数生成器类对象必须包含 const 函数,否则我得到编译器错误,因为 TBB 限制函数对象应包含 operator()() 作为 const ...

所以简而言之,我的问题如下:
1)在 TBB 中使用线程安全随机数生成器。上述随机数生成器可以提高效率吗?
2)我可以让它静态(相同的种子)但线程安全吗?如果是这样,我只需要一些想法,我可以自己实现它。
3) 在 tbb::parallel_for_each() 中使用线程安全随机数生成器的任何想法
4) 在这种情况下,我可以以某种方式使用 boost 变量生成器吗?在统一的 Real 类中定义引擎和分布,并将它们组合起来得到一个 generator() 对象

如果有任何不清楚的地方,请告诉我,我会澄清相同的。

0 投票
1 回答
708 浏览

c++ - 与依赖项并行运行多个任务

我有许多“站点”(m),每个站点都必须处理一个事件(数据块。所有这些都可以随时使用)。每个事件(其中 n 个)被发送到每个站点进行处理。所以你可能认为我有 nxm 任务。处理顺序并不重要,只是一个站点一次不能处理多个事件(因此 Task(m,x) 不能与 Task(m,y) 并行运行)

目前它是在网站上使用“OMP 并行”实现的,嵌套在事件的常规 for 循环中

这工作正常,但并非所有站点对每个事件都具有相同的复杂性。即所有站点都必须等待最慢的站点才能继续下一个事件。我估计如果我允许工人继续进行下一个活动,我可以节省两倍。

实现这一点的最佳方法是什么?我正在使用 C++ 我正在研究 TBB Flow Graph 或多个管道...

另一个考虑是每个“事件”都必须从磁盘读取,并占用一点内存。虽然还不是很关键,但我希望一次在系统中拥有尽可能少的事件(或限制它们)。在当前的实现中,我只有一个(加上在后台准备的一对)谢谢

0 投票
1 回答
1447 浏览

tbb - What's the difference between data flow graph and dependence graph in TBB

I have read about data flow graph and dependence graph from the Intel TBB Tutorial, and feel a bit confusing about these two concepts.

Can I say that the key difference between data flow graph and dependence graph is whether there are explicitly shared resources or not?

But it seems that we can implement a dependence graph using function_node with pseudo messages, or implement a data flow graph using continue_node with shared global variables.

0 投票
1 回答
185 浏览

c++ - 使用 std::shared_ptr 线程化构建块

我刚刚开始与 TBB 合作。不得不说它看起来很不错,但是我遇到了以下问题。使用带有 std::shared_ptr 的 lambda 似乎不起作用。

出现以下编译错误:

基本上 int 已被 std::shared_ptr 替换。

任何想法都将不胜感激!

问候奥克