我正在使用Intel Xeon Phi协处理器,它具有多达240个线程,我正在努力减少用于特定应用程序的线程数(或最大化性能),同时在最佳执行时间的百分比内。例如,如果我有以下测量值:
我想选择120到150之间的一些线程,因为“性能曲线”似乎稳定并且执行时间的减少不那么显着(在这种情况下约为最佳测量时间的15%)。我使用详尽的搜索算法(测量1到240个线程)来做到这一点,但我的问题是,对于较少数量的线程(显然取决于问题的大小),它需要太长时间。
为了减少测量次数,我开发了一种“二分搜索”算法。基本上我有一个上限和下限(从0和240个线程开始),我取中间的值并测量它和240.我得到两个值之间的百分比差异,如果它在15%以内(这个值是在分析穷举搜索的结果后选择)我指定一个新的下限或上限。如果差异大于15%那么这是一个新的下限(120-240),如果它小于那么它是一个新的上限(0-120),如果我得到更好的执行时间,我将它存储为最好的执行时间。
这个算法的问题在于,首先这不一定是执行时间的排序数组,对于某些问题大小,穷举搜索结果显示两个不同的最小值,因此例如在一个中我获得80的最佳性能线程和170,我希望能够返回80,而不是170个线程作为搜索的结果。但是,对于只有一个最小值的其他情况,算法会发现一个非常接近预期值的值。
如果有人有更好的想法或知道现有的搜索算法或启发式方法可以帮助我,我会非常感激。
答案 0 :(得分:1)
我认为你的目标是为最少量的线程获得最佳的相对性能,同时仍然基于最佳性能的系数(< = 1)保持对性能的一些限制。 IE:如果系数为0.85,则性能应不低于使用所有线程的性能的85%。
看起来你应该尝试做的只是找到获得性能限制所需的最小线程数。而不是查看1-240个线程,从240个线程开始并减少线程数,直到您可以在性能限制上设置下限。然后,您可以从下限进行处理,以便您可以在不经过它的情况下找到min。如果您没有预定义的性能限制,那么您可以根据收益递减计算一个。
可能更清楚的是逐步说明流程的样子。其中Passed表示线程数超出性能限制,失败意味着它们处于性能限制或内部。
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.
这有点低效,但它确实找到了获得性能的最小线程数(> = Z),这些线程在m-1个线程的错误范围内并且只需要O(log(N-Z))测试。在大多数情况下,这应该足够了,但如果不是仅仅跳过步骤1并使用Z = m。除非增加线程数量,否则当Z非常小时,运行时间会导致非常慢的运行时间。在这种情况下,执行步骤1并使用interpolation可以了解运行时间随着线程数量的减少而增加的速度,如果没有给出,这对于确定良好的性能限制也很有用。