我正在使用 Intel Xeon Phi 协处理器,它有多达 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 作为搜索结果的线程。然而,对于只有一个最小值的其他情况,该算法找到了一个非常接近预期值的值。
如果有人有更好的想法或知道可以帮助我的现有搜索算法或启发式方法,我将不胜感激。