tbb :: parallel_for是否有break命令

时间:2019-04-15 21:01:22

标签: c++ parallel-processing tbb

如何像连续break一样tbb::paralel_for中的for

2 个答案:

答案 0 :(得分:2)

也许您可以抛出专用异常。 TBB运行时应捕获正在运行特定任务的线程中的异常,从而导致任务组被取消,并且异常从取消组的根被抛出。

答案 1 :(得分:1)

您可以引发异常,也可以使用取消API。在后一种情况下,break;的“替换”为tbb::task::self().cancel_group_execution(); return;。但是,在串行循环中,都无法保证break。更确切地说,取消(或串行化)之后(在串行意义上)的任何循环迭代可能仍由其他线程执行;此外,取消/异常之前(在串行意义上)的某些迭代可能永远不会运行。

如果tbb::parallel_for的主体内部有一个循环(例如,在blocked_range上进行循环的那个循环),则在tbb::task::self().is_cancelled()为{{1 }};这样可以减少工作的浪费并更快地完成循环。

有关其他详细信息,您可以查看TBB文档,例如https://www.threadingbuildingblocks.org/docs/help/tbb_userguide/Exceptions_and_Cancellation.htmlhttps://www.threadingbuildingblocks.org/docs/help/reference/task_scheduler/cancellation.html

如果在串行代码中使用true查找满足条件的“最左边”的点(例如最小循环索引或容器中的第一项),则不应使用取消或异常,结果可能不正确。而是使用简化形式(例如break)从所有合适的点中选择“最左侧”。可能的优化方法是使用原子变量(在循环外部指定)以保持最小的合适索引,并跳过具有较大索引的所有迭代。为了更新原子变量,您将需要使用tbb::parallel_reduce操作来检查另一个线程是否已使用比当前线程找到的值小的值对其进行了更新。