负载不均衡

在并行计算期间,空闲处理器即为浪费的资源。与之类似,空闲的线程也为浪费的资源,并对并行执行的整体运行时间产生负面影响。缺省状态下,在每个 OpenMP 并行域或任务分割(worksharing)域结束时,线程以隐式的限制进行等待,直到所有的线程都完成了域中分配的工作。当分配给线程的计算不均衡时,计算较少的线程会在域限制中处于空闲状态,直到计算任务较多的线程完成其工作。

在含有超线程(HT)技术的双处理器上,采用 4 个线程通过英特尔® 线程档案器运行经过更改的 PrimeFinder 代码,将发现有相当多的一部分时间(14%)花费在空闲线程上。由于在该实例代码中仅有一个单独的并行区域,所以可以很明显地找出产生不均衡的位置。然而,当在更复杂的代码中查找不均衡的来源时,则需使用 Regions View(域浏览)来查找没有分配给线程足够工作的区域。点击并行区域中的横条,即可查看相应区域的源代码。

为了更好地判断产生不均衡的原因,可以在选择的问题区域中咨询 Threads View(线程浏览)。

通常来说,不均衡时间呈阶梯方式不断较低,这说明了尽管工作负载根据每线程的任务数量进行平均分配,但它仅仅增加了所需计算的数量,在这种情况下,针对素数需要查看的整数数量由叠代的缺省静态分配平均划分。然而,需要查看的因数数量随着整数大小的增加而增加。因此,与前三个线程相比,检查最后四分之一整数范围的线程执行的计算更多。

这种不均衡方式同样说明了,任务的大小和序列是固定的。我们可以通过建立更为动态的任务分配,来修改观察到的不均衡,或需检查的整数。针对编译指示向并行区域添加 schedule 语句,能够使您更好地控制叠代分配至线程的方式。采用具有足够块大小的动态 schedule,如 schedule(dynamic,100),能够根据需要分配叠代,以使计算更具分布性,同时还可为每个块提供足够的工作,来保持较低的规划开销。针对实例代码不均衡的一个不明显的 schedule 为 schedule(static,1)。该 schedule 可以象分纸牌一样,向线程分配叠代:一个线程一个叠代,以轮转方式通过线程中循环,直到所有的叠代都分配完毕。下面是实例代码的英特尔® 线程档案器 Summary View(摘要显示),该代码对需要测试的整数采用动态调度。
通常来说,不均衡时间呈阶梯方式不断较低,这说明了尽管工作负载根据每线程的任务数量进行平均分配,但它仅仅增加了所需计算的数量,在这种情况下,针对素数需要查看的整数数量由叠代的缺省静态分配平均划分。然而,需要查看的因数数量随着整数大小的增加而增加。因此,与前三个线程相比,检查最后四分之一整数范围的线程执行的计算更多。

这种不均衡方式同样说明了,任务的大小和序列是固定的。我们可以通过建立更为动态的任务分配,来修改观察到的不均衡,或需检查的整数。针对编译指示向并行区域添加 schedule 语句,能够使您更好地控制叠代分配至线程的方式。采用具有足够块大小的动态 schedule,如 schedule(dynamic,100),能够根据需要分配叠代,以使计算更具分布性,同时还可为每个块提供足够的工作,来保持较低的规划开销。针对实例代码不均衡的一个不明显的 schedule 为 schedule(static,1)。该 schedule 可以象分纸牌一样,向线程分配叠代:一个线程一个叠代,以轮转方式通过线程中循环,直到所有的叠代都分配完毕。下面是实例代码的英特尔® 线程档案器 Summary View(摘要显示),该代码对需要测试的整数采用动态调度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值