负载不均衡

来源:互联网 发布:java 调用log4j 编辑:程序博客网 时间:2024/05/01 21:07

在并行计算期间,空闲处理器即为浪费的资源。与之类似,空闲的线程也为浪费的资源,并对并行执行的整体运行时间产生负面影响。缺省状态下,在每个 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(摘要显示),该代码对需要测试的整数采用动态调度。

原创粉丝点击