调整数学并行代码

时间:2012-03-24 20:24:20

标签: math scientific-computing

假设我对线性代数迭代多线程求解器的性能而不是可移植性感兴趣,并且我有手头分析我的代码的结果,我该如何调整我的代码以在该机器上运行最优化我的选择?

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

我正在处理矩阵大小大致相当于RAM的全部大小(~6GB)的代码。我将开发英特尔i3笔记本电脑。我将使用英特尔MKL链接我的代码。

具体地,

  • 是否有用于学习手动调整的良好资源(PDF /书/纸)?我通过以下方式学到了很多东西:手动展开并不总是最佳的或关于编译器标志,但我更喜欢集中资源。

  • 我需要来翻译探查器信息以提高性能。例如,我的探查器告诉我一个处理器的堆栈正由另一个处理器或我的mulpd访问ASM花费了太多时间。我不知道这些意思是什么以及如何使用这些信息来改进我的代码。

我的目的是花费尽可能多的时间来尽可能多地挤压计算能力。它更像是一种学习经验,而不是现在的实际使用或分发。

(我担心手动调整不能自动调整)

其他详细信息:

  • 这与通常的性能调优不同,因为代码的主要部分与英特尔专有的MKL库相关联。
  • 由于O(N ^ 2)矩阵 - 向量乘法和依赖关系中的内存带宽问题,我可以通过简单观察来自行管理。
  • 我用C和Fortran写作,我已经尝试了两种,并且如上所述,在SO上讨论了一百万次,如果我适当地调整它们,我发现两者都没有区别。

1 个答案:

答案 0 :(得分:2)

天哪,这仍然没有答案。在你读完这篇文章后,你仍然没有有用的答案......

你暗示你已经完成了所有明显和通用的事情,以使你的代码快速。具体来说,你有:

  • 为您的问题选择了最快的算法(或者您的问题是优化算法的实现而不是优化问题解决方案的发现);
  • 像狗一样使用你的编译器来挤出最后一滴执行速度;
  • 链接在最好的库中,您可以找到任何用途(并进行测试以确保它们确实提高了程序的性能;
  • 手工制作你的内存访问以优化r / w性能;
  • 完成了我们所做的所有明显的小动作(例如,当比较2个矢量的规范时,你不需要采用平方根来确定一个比另一个更大的, ...);
  • 将您的程序的并行可扩展性打造成性能图表中S == P行的gank?s;
  • 对于给定数量的处理器,总是在适当大小的作业上执行您的程序,以最大限度地提高性能;

但你还是不满意!

现在,不幸的是,你已经接近最前沿,你所寻求的信息不容易在书籍或网站上找到。甚至不在这里。部分原因是您现在正在优化平台上的代码,并且您最有可能诊断问题并进行修复。但这些问题可能确实非常局部;您可能会得出结论,在您的直接研究小组之外的其他任何人都不会对您的工作感兴趣,我知道您对我在我的平台上的代码所做的任何微优化都不感兴趣。

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

在您的职位上,我将关注两个主题的期刊:科学和工程的pet和exa规模计算,以及编译器开发。我相信前者是显而易见的,后者可能不那么明显:但是如果你的编译器已经完成了所有(有用的)前沿优化,你就不会问这个问题而编译器编写者正在努力工作以便你的继承人不必。

你可能正在寻找优化,例如循环展开,在25年前的编译器中相对难以找到并且因此在当时流行,并且它们本身将在旧的并且在再过25年。

修改

首先,让我明确说明一些原本只在我的回答中隐含的内容:我不准备在SO上花费足够长的时间来引导你完成我所获得的知识总结25年以上的科学/工程和高性能计算。我不会写书,但很多人和亚马逊会帮你找到它们。在我添加这个位之前,这个答案比我发布的大多数答案要长。

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

  • on'手工制作的内存访问'从关于'循环平铺的维基百科文章开始(请参阅,你甚至不能依赖我在这里粘贴网址)并从那里读出来;您应该可以快速选择可以在进一步搜索中使用的术语。
  • on'像狗一样工作你的编译器'我的确意味着熟悉其文档并详细了解各种选项的意图和现实;最终你将不得不对编译器选项进行大量测试,以确定哪些是最好的'对于您平台上的代码。
  • on'微观优化',这里是一个开始:Performance Optimization of Numerically Intensive Codes。不要忘记你将从本书中学到所有(甚至更多)你想要学习的知识。它现在大概10岁了。带走的消息是:
    • 性能优化需要与机器架构的亲密关系;
    • 性能优化由1001个单独的步骤组成,如果没有详细了解程序及其运行时环境,通常无法预测哪些最有用(哪些实际上有害);
    • 性能优化是一项参与运动,你无法不学习它;
    • 性能优化需要对细节的密切关注和良好的记录保存。

哦,从来没有编写过一个聪明的优化,当下一个编译器版本实现更好的方法时,你不能轻易地解写。我花了相当多的时间从20年前的Fortran中删除了一些巧妙的技巧,这些技巧在提高执行性能方面是合理的(如果有的话),但现在只是让程序员感到困惑(它也让我烦恼了)并得到了在编译器完成其工作的方式。

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