阅读这有趣的文章,似乎很多性能损失都是由于紧循环中的调度开销造成的。综上所述:有一个名为"Chunksize“的变量,它决定了每个处理单元(实际上是一个线程)的块大小(迭代量)将在私有上下文中稍后执行。
问题是,你不知道一个块需要多长时间,所以有多种统计方法来解决这个问题。然而,也有一种叫做PGO或profile引导优化的东西,本文从未提到过。我想知道是否有可能经验地确定单个任务的执行时间,并将这个变量重新工作到代码中。
实际上,我希望在我的代码中有一堆变量,由PGO根据这些变量的最优值来设置。我知道这是特定于平台的,但是在对主机平台进行某种方式的优化时,您也可以动态地这样做。不管怎么说,我对这个话题一窍不通,所以我想问问专家们。这方面的工作是否已经在进行中?
我可以想象它的工作原理,就像一种遗传算法,它尝试了一堆变量,并在进行过程中对它们进行了优化。
发布于 2023-04-04 10:32:53
PGO不是魔法。收集到的概要文件可以帮助优化器对发出分支的顺序、是否内联函数等做出更知情的决定。这是可能的,因为配置文件允许我们在执行典型工作负载后计算经验分支概率。
但是这样的配置文件不能让我们推断出调优参数的最佳值。在某些情况下,我们可以从分支概率推断出合理的变化,但在一般情况下,它们很难解释。
例如,热循环中的循环条件通常具有非常低的分支离开循环的概率。因此,我们可以认为有很多迭代,所以每次迭代都应该做更多的工作(例如,对循环进行一点展开)。另一方面,这种情况对于CPU来说是很容易预测的,所以它并不代表大量的开销。
在OpenMP情况下,情况要复杂得多,因为最佳批处理大小必须在选择大批大小以保持较低通信开销的需要与选择小批大小以优化并行化的需求之间取得平衡。但这更多地取决于网络,而不是PGO知情的微优化。
因此,您可能需要使用更传统的方法来调整系统,而不是依赖PGO。这意味着设计一系列基准测试,在这些基准测试中相互竞争不同的配置,然后决定一种配置在统计上是否更好。为了比较N个固定配置,我推荐像hyperfine这样的工具。要让配置工具自动探索参数空间,请考虑像irace这样的工具(如您建议的那样,通过进化算法对配置进行示例)。如果评估候选配置非常昂贵,贝叶斯优化技术可以让您找到最有希望的候选,至少在低维参数空间中,您可以有一个有用的距离度量。
为了简化实验,最好将批处理大小保持为运行时可配置的参数,而不是将其编译到软件中。尽管编译时配置可以支持更好的优化(如循环展开),但这并不是分布式系统中的约束因素。
https://softwareengineering.stackexchange.com/questions/444825
复制相似问题