gpt4 book ai didi

math - 调整数学并行代码

转载 作者:行者123 更新时间:2023-12-02 02:17:21 25 4
gpt4 key购买 nike

假设我对线性代数迭代多线程求解器的性能感兴趣,而不是对它的可移植性感兴趣,并且我掌握了对代码进行性能分析的结果,那么如何调整代码以使其在所选的机器上最佳运行?

该算法涉及矩阵 vector 乘法,范数和点积。 (FWIW,我正在研究CG和GMRES)。

我正在处理的代码的矩阵大小大致等于RAM的全部大小(〜6GB)。我将研究Intel i3笔记本电脑。我将使用英特尔MKL链接我的代码。

特别,

  • 是否有很好的资源(PDF /书籍/纸)用于学习手动调整? 例如,我从中学到了很多东西:手动展开并不总是最佳选择,也不是关于编译器标志的最佳选择,但是我更喜欢集中式资源。
  • 我需要一些来将探查器信息转换为改进的性能。 例如,我的探查器告诉我一个处理器的堆栈正在被另一个处理器访问,或者我的mulpd ASM占用了太多时间。我不知道这些是什么意思,也不知道如何使用这些信息来改进我的代码。

  • 我的意图是花费尽可能多的时间来压缩尽可能多的计算能力。到目前为止,它比实际使用或分发更多的是学习经验。

    (我担心手动调整而不是自动调整)

    其他详细信息:
  • 这与通常的性能调整不同,因为代码的大部分都链接到英特尔专有的MKL库。
  • 由于O(N ^ 2)矩阵 vector 乘法和依存关系中的内存带宽问题,通过简单的观察,我自己可以管理的内容受到限制。
  • 我用C和Fortran编写的
  • ,我已经尝试了两者,并且在SO上进行了百万次讨论,如果适当地调整它们,我发现两者都没有区别。
  • 最佳答案

    天哪,这仍然没有答案。阅读完此内容后,您将没有任何有用的答案...

    您暗示您已经完成了所有显而易见的通用工作,以加快代码的速度。具体来说,您有:

  • 为您的问题选择了最快的算法(要么,要么您的问题是优化算法的实现,而不是优化问题的解决方案的查找);
  • 使您的编译器像狗一样工作,以挤压出执行速度的最后下降;
  • 在可以找到的最佳库中链接的
  • 根本没有用(并经过测试以确保它们实际上确实在提高程序的性能;
  • 手工制作内存访问以优化读写性能;
  • 完成了我们所有显而易见的小技巧(例如,比较2个 vector 的范数时,无需求平方根即可确定一个“比另一个大”,...);
  • 将程序的并行可扩展性提高到性能图上S == P线的一角。
  • 始终在给定数量的处理器上以合适的作业大小执行程序,以最大程度地提高性能;

  • 还是你不满意!

    不幸的是,现在您已经接近最新的发展趋势,并且您很难在书籍或网站上找到想要的信息。甚至没有在这里。造成这种情况的部分原因是您现在正在优化平台上的代码,并且最有能力诊断问题并修复问题。但是这些问题确实可能是非常局部的。您可能会得出结论,您直接的研究团队之外的其他人都不会对您的工作感兴趣,我知道您不会对我在平台上对代码进行的任何微优化感兴趣。

    第二个原因是您进入了一个仍然活跃的研究领域,并且有用的 class (如果有的话)已在学术文献中发表。为此,您需要访问一个好的研究图书馆,如果附近没有图书馆,那么ACM和IEEE-CS数字图书馆都是一个不错的起点。 (如果您不知道这些是什么,请发表或评论。)

    在您的位置上,我将研究两个主题的期刊:用于科学和工程的Peta级和Exa级计算,以及编译器开发。我相信前者是显而易见的,后者可能不太明显:但是如果您的编译器已经进行了所有(有用的)最先进的优化,您就不会问这个问题,并且编译器编写者正在努力工作,以便您的后继者获胜不必。

    您可能正在寻找诸如循环展开之类的优化方法,这些优化方法很难在25年前的编译器中实现,因此在那时是最前沿的,并且它们将在25年后逐渐成熟。

    编辑

    首先,让我明确说明一些最初仅在我的“答案”中隐含的内容:我不准备在SO上花费足够的时间来指导您,甚至不介绍我在25年以上的科学/工程学和高性能计算。我不愿意写书,但是很多书都可以,亚马逊会帮助您找到它们。这个答案比我在添加此位之前要发布的大多数答案要长。

    现在,要了解您评论中的要点:

    关于“手工制作的内存访问”的
  • 从Wikipedia上有关“循环平铺”的文章开始(请看,您甚至不能依靠我在此处粘贴URL)并从那里读取内容;您应该能够快速挑选出可用于进一步搜索的术语。
  • 关于“像狗一样工作您的编译器”,我确实的意思是要熟悉其文档并详细了解各种选择的意图和现实。最终,您将不得不对编译器选项进行大量测试,以确定哪种代码最适合您平台上的代码。
  • 关于“微优化”,这是一个开始:Performance Optimization of Numerically Intensive Codes。不要逃避您将从本书中学到的所有(甚至很多)要学的想法。现在已有10年历史了。带走的消息是:
  • 性能优化需要与机器体系结构保持紧密联系;
  • 性能优化是由1001个单独的步骤组成的,如果不详细了解程序及其运行时环境,通常就无法预测哪些最有用(哪些实际上有害)。
  • 性能优化是一项参与运动,您必须学习它才能学习;
  • 性能优化需要对细节的痴迷和良好的记录保持。

  • 哦,永远不要写一个聪明的优化程序,当下一个编译器版本实现更好的方法时,您就不会轻易取消该优化程序。我花了大量时间从20岁的Fortran中删除了一些巧妙的技巧,这些技巧是有理由的(如果有的话),以提高执行性能为由,但现在这只会使程序员感到困惑(这也使我感到烦恼)并得到以编译器完成其工作的方式。

    最后,我准备分享一个智慧:这些天,我做了很少的优化工作,而这不在我上面第一个列表中的一项之下。我发现微观优化的成本/收益比对我的雇主不利。

    关于math - 调整数学并行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9855281/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com