关于oneTBB中parallel_for_each是否为每个数组元素分配独立线程的问询
oneTBB parallel_for_each 执行逻辑说明
首先明确:oneTBB的parallel_for_each默认是并行执行的,那些声称它串行的资料要么是误解,要么是遇到了特殊场景(比如待处理元素数量极少、单个元素的处理逻辑极快,TBB判断并行调度的开销超过收益,自动切换为串行执行)。
针对你提到的大数组、每个元素处理耗时很长、4核CPU的场景:
- 不会出现“每个线程处理一个元素”的情况,TBB的任务调度器会把整个数组分割成连续的任务块,每个线程负责处理一个任务块里的所有元素,而不是单个元素。
- 比如你的数组有1000个元素,大概率会被分成4个连续的子段(每段250个元素),4个线程各自处理一段,同时执行。这样能避免频繁创建/销毁线程的开销,最大化并行效率。
如果你的每个元素处理逻辑确实耗时极长(比如每个元素要执行数秒的计算),也可以通过调整TBB的任务粒度参数,让每个元素成为独立任务,但这属于特殊优化场景,默认的块划分已经能满足绝大多数并行需求。
补充:oneAPI官方文档明确说明
parallel_for_each的元素可被并行处理,这是它的核心设计目标,串行只是极端场景下的自动优化策略。
内容的提问来源于stack exchange,提问作者qwerty_99
相关产品推荐
相关产品推荐

