假设我对线性代数迭代多线程求解器的性能而不是可移植性感兴趣,并且我有手头分析我的代码的结果,我该如何调整我的代码以在该机器上运行最优化我的选择?
该算法涉及矩阵 - 向量乘法,规范和点积。 (FWIW,我正在研究CG和GMRES)。
我正在处理矩阵大小大致相当于RAM的全部大小(~6GB)的代码。我将开发英特尔i3笔记本电脑。我将使用英特尔MKL链接我的代码。
具体地,
是否有用于学习手动调整的良好资源(PDF /书/纸)?我通过以下方式学到了很多东西:手动展开并不总是最佳的或关于编译器标志,但我更喜欢集中资源。
我需要来翻译探查器信息以提高性能。例如,我的探查器告诉我一个处理器的堆栈正由另一个处理器或我的mulpd
访问ASM花费了太多时间。我不知道这些意思是什么以及如何使用这些信息来改进我的代码。
我的目的是花费尽可能多的时间来尽可能多地挤压计算能力。它更像是一种学习经验,而不是现在的实际使用或分发。
(我担心手动调整不能自动调整)
其他详细信息:
答案 0 :(得分:2)
你暗示你已经完成了所有明显和通用的事情,以使你的代码快速。具体来说,你有:
但你还是不满意!
现在,不幸的是,你已经接近最前沿,你所寻求的信息不容易在书籍或网站上找到。甚至不在这里。部分原因是您现在正在优化平台上的代码,并且您最有可能诊断问题并进行修复。但这些问题可能确实非常局部;您可能会得出结论,在您的直接研究小组之外的其他任何人都不会对您的工作感兴趣,我知道您对我在我的平台上的代码所做的任何微优化都不感兴趣。
第二个原因是你已经进入了一个仍然是一个活跃的研究前沿的领域,有用的课程(如果有的话)发表在学术文献中。为此你需要访问一个好的研究图书馆,如果你附近没有,那么ACM和IEEE-CS数字图书馆都是很好的起点。 (发布或评论,如果你不知道这些是什么。)
在您的职位上,我将关注两个主题的期刊:科学和工程的pet和exa规模计算,以及编译器开发。我相信前者是显而易见的,后者可能不那么明显:但是如果你的编译器已经完成了所有(有用的)前沿优化,你就不会问这个问题而编译器编写者正在努力工作以便你的继承人不必。
你可能正在寻找优化,例如循环展开,在25年前的编译器中相对难以找到并且因此在当时流行,并且它们本身将在旧的并且在再过25年。
修改强>
首先,让我明确说明一些原本只在我的回答中隐含的内容:我不准备在SO上花费足够长的时间来引导你完成我所获得的知识总结25年以上的科学/工程和高性能计算。我不会写书,但很多人和亚马逊会帮你找到它们。在我添加这个位之前,这个答案比我发布的大多数答案要长。
现在,要了解评论中的要点:
哦,从来没有编写过一个聪明的优化,当下一个编译器版本实现更好的方法时,你不能轻易地解写。我花了相当多的时间从20年前的Fortran中删除了一些巧妙的技巧,这些技巧在提高执行性能方面是合理的(如果有的话),但现在只是让程序员感到困惑(它也让我烦恼了)并得到了在编译器完成其工作的方式。
最后,我准备分享一个智慧:这些天我做了很少的优化,不在我上面第一个列表中的一个项目之下;我发现微观优化的成本/效益比对我的雇主不利。