【问题标题】:Is there a search algorithm for minimizing number of threads?是否有最小化线程数的搜索算法?
【发布时间】:2014-05-26 19:12:49
【问题描述】:

我正在使用英特尔至强融核协处理器,它有多达 240 个线程,并且我正在努力将用于特定应用程序的线程数最小化(或最大限度地提高性能),同时保持在最佳执行时间的百分比范围内。例如,如果我有以下测量结果:

  • 线程 |执行时间
  • 240 100 秒
  • 200 105 秒
  • 150 107 秒
  • 120 109 秒
  • 100 120 秒

我想选择 120 到 150 之间的线程数,因为那里的“性能曲线”似乎稳定下来,并且执行时间的减少并不显着(在这种情况下,大约是最佳测量时间的 15%。我使用穷举搜索算法(测量 1 到 240 个线程)来做到这一点,但我的问题是线程数较少(显然取决于问题的大小)需要很长时间。

为了尝试减少测量次数,我开发了一种“二分搜索”算法。基本上我有一个上限和下限(从 0 和 240 个线程开始),我取中间的值并在 240 处测量它。我得到两个值之间的百分比差异,如果它在 15% 以内(这个值是在分析详尽搜索的结果后选择)我分配了一个新的下限或上限。如果差异大于 15%,那么这是一个新的下限 (120-240),如果它更小,那么它是一个新的上限 (0-120),如果我得到更好的执行时间,我将其存储为最佳执行时间。

该算法的问题在于,首先这不一定是执行时间的排序数组,并且对于某些问题大小,详尽的搜索结果显示了两个不同的最小值,因此例如在一个中,我在 80 处获得了最佳性能线程和 170,我希望能够返回 80,而不是 170 线程作为搜索的结果。但是,对于只有一个最小值的其他情况,该算法找到了一个非常接近预期值的值。

如果有人有更好的想法或知道可以帮助我的现有搜索算法或启发式算法,我将不胜感激。

【问题讨论】:

  • 当 240 个线程为您提供最佳性能时,为什么要减少线程数?您还有其他绩效衡量标准吗?当你找到一个最优值(在这种情况下,无论最优意味着什么),你将如何处理它?
  • 如您所知,二分搜索将确定一个(可能是多个)局部最小值。要获得曲线的大致形状,请以 10 为增量从 240 个线程测量到 10 个线程(最多 24 个运行)。当跑步时间变得痛苦时停止,比如当跑步时间是迄今为止最佳时间的 3 倍时。
  • @NicoSchertler,使用 240 个线程并不总能提供最佳性能。减少线程数量的原因是为了能够在其他计算中使用其他线程,甚至是为了降低能耗。这只是衡量性能的第一步,之后我将分析减少线程数的影响。

标签: multithreading algorithm search execution-time xeon-phi


【解决方案1】:

我认为您的目标是用最少的线程获得最佳的相对性能,同时仍然根据最佳性能的系数 (

似乎您应该尝试做的只是找到获得性能限制所需的最少线程数。与其查看 1 到 240 个线程,不如从 240 个线程开始并减少线程数,直到您可以设置性能限制的下限。然后,您可以从下限开始向上计算,这样您就可以在不超过最小值的情况下找到最小值。如果您没有预定义的性能界限,那么您可以根据收益递减动态计算一个。

  1. 只要不超过性能限制,线程数减半(从最大线程数开始)。超过性能限制的数字是所需线程数的下限。
  2. 从线程数的下限 Z 开始,如果可以在不超出性能限制的情况下添加 m 个线程。将添加的线程数重复加倍,直到达到性能限制。如果添加的线程在性能限制范围内,则减去最后的添加并将要添加的线程数重置为 m。如果仅添加 m 就在限制范围内,则添加最后 m 个线程并返回线程数。

举个例子说明一步一步的过程可能会更清楚。其中 Passed 表示线程数超出性能限制,failed 表示它们处于性能限制或内部。

Try adding 1m (Z + 1m). Passed. Threads = Z + m.
Try adding 2m (Z + 3m). Passed. Threads = Z + 3m.
Try adding 4m (Z + 7m). Failed. Threads = Z + 3m. Reset.
Try adding 1m. Passed. Threads = Z + 4m.
Try adding 2m. Passed. Threads = Z + 6m.
Z + 7m failed earlier so reset. 
  Comparisons/lookups are cheap, use them to prevent duplication of work.
Try adding 1m. Failed. Threads = Z + 6m. Reset.
Cannot add less than 1m and still in outside of performance limit.
The solution is Z + 7m threads. 
  Since Z + 6m is m threads short of the performance limit.

它的效率有点低,但它确实找到了在 m-1 个线程的误差范围内获得性能所需的最小线程数 (>= Z),并且只需要 O(log (N-Z)) 测试。在大多数情况下这应该足够了,但如果不是跳过步骤 1 并使用 Z=m。除非在 Z 非常小时,快速增加线程数会减少运行时间,否则会导致运行时间非常慢。在这种情况下,执行第 1 步并使用interpolation 可以了解运行时间随着线程数量的减少而增加的速度,如果没有给出良好的性能限制,这对于确定良好的性能限制也很有用。

【讨论】:

  • 非常感谢,正是我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多