Math 调整数学并行码
假设我对线性代数迭代多线程解算器的性能而不是可移植性感兴趣,并且我手头有评测代码的结果,那么我该如何调整代码以在我选择的机器上以最佳方式运行呢 该算法涉及矩阵向量乘法、范数和点积。(FWIW,我正在研究CG和GMRES) 我正在研究的代码的矩阵大小大致相当于RAM的全部大小(~6GB)。我将在英特尔i3笔记本电脑上工作。我将使用“英特尔MKL”链接我的代码 具体来说,Math 调整数学并行码,math,scientific-computing,Math,Scientific Computing,假设我对线性代数迭代多线程解算器的性能而不是可移植性感兴趣,并且我手头有评测代码的结果,那么我该如何调整代码以在我选择的机器上以最佳方式运行呢 该算法涉及矩阵向量乘法、范数和点积。(FWIW,我正在研究CG和GMRES) 我正在研究的代码的矩阵大小大致相当于RAM的全部大小(~6GB)。我将在英特尔i3笔记本电脑上工作。我将使用“英特尔MKL”链接我的代码 具体来说, 有学习手动调优的好资源(PDF/Book/Paper)吗?我通过这样做学到了很多东西,例如:手动展开并不总是最佳的,或者关于编
- 有学习手动调优的好资源(PDF/Book/Paper)吗?我通过这样做学到了很多东西,例如:手动展开并不总是最佳的,或者关于编译器标志,但我更喜欢集中的资源
- 我需要一些来将探查器信息转换为改进的性能。例如,我的探查器告诉我,一个处理器的堆栈正在被另一个处理器访问,或者我的
ASM占用了太多时间。我不知道这些是什么意思,也不知道如何使用这些信息来改进代码mulpd
- 这与通常的性能调整不同,因为代码的主要部分链接到英特尔专有的MKL库
- 由于O(N^2)矩阵向量乘法和依赖关系中的内存带宽问题,我可以通过简单的观察来管理的内容是有限的
- 我用C和Fortran编写,我已经尝试了这两种语言,正如我们讨论过的一百万次那样,如果我适当地调整它们,我发现这两种语言都没有区别李>
- 天哪,这仍然没有答案。读完这篇文章后,你仍然没有有用的答案
你的意思是你已经做了所有明显的和一般的事情,使你的代码快速。具体而言,你有:
- 为您的问题选择最快的算法(或者您的问题是优化算法的实现,而不是优化问题解决方案的发现)李>
- 像狗一样工作编译器,挤出最后一滴执行速度李>
- 链接到您能找到的最有用的库中(并经过测试,以确保它们确实提高了程序的性能
- 手工制作的内存访问,优化r/w性能
- 完成了我们所有人都做的所有明显的小技巧(例如,当比较两个向量的范数时,你不需要求平方根来确定一个向量比另一个向量“大”…)
- 将程序的并行可伸缩性提高到性能图上s==P线的极小范围内
- 对于给定数量的处理器,始终在适当大小的作业上执行程序,以最大限度地提高性能
- 关于“手工构建的内存访问”,从维基百科关于“循环平铺”的文章开始(请看,你甚至不能依赖我将URL粘贴到这里),然后从那里读出;你应该能够快速找到可以在进一步搜索中使用的术语
- 关于“像狗一样使用编译器”,我的意思确实是要熟悉它的文档,并详细了解各种选项的意图和实际情况;最终,您必须对编译器选项t进行大量测试