是否有 tbb::p arallel_for 的中断命令

Is there a break command for tbb::parallel_for

本文关键字:for 中断 命令 arallel tbb 是否      更新时间:2023-10-16

你怎么能从tbb::paralel_forbreak出来,类似于顺序for

也许你可以抛出一个专门的异常。TBB 运行时应在运行特定任务的线程中捕获异常,导致任务组被取消,并从取消组的根重新抛出异常。

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

如果tbb::parallel_for体内部有一个循环(例如,迭代blocked_range的循环),你可以考虑在true的情况下打破tbb::task::self().is_cancelled()循环;这可能会减少浪费的工作并更快地完成循环。

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

如果在串行代码中使用break来查找满足条件的"最左边"点(例如最小循环索引或容器中的第一项),则不应使用取消或异常,因为结果可能不正确。相反,使用一种减少形式(例如tbb::parallel_reduce) 选择所有合适点中的"最左边"一个。一种可能的优化是使用原子变量(在循环外部指定)来保留最小合适的索引,并跳过具有较大索引的所有迭代。要更新原子变量,您需要使用compare_and_swap操作来检查另一个线程是否可能使用比当前线程找到的值更小的值更新它。