Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 调整数学并行码_Math_Scientific Computing - Fatal编程技术网

Math 调整数学并行码

Math 调整数学并行码,math,scientific-computing,Math,Scientific Computing,假设我对线性代数迭代多线程解算器的性能而不是可移植性感兴趣,并且我手头有评测代码的结果,那么我该如何调整代码以在我选择的机器上以最佳方式运行呢 该算法涉及矩阵向量乘法、范数和点积。(FWIW,我正在研究CG和GMRES) 我正在研究的代码的矩阵大小大致相当于RAM的全部大小(~6GB)。我将在英特尔i3笔记本电脑上工作。我将使用“英特尔MKL”链接我的代码 具体来说, 有学习手动调优的好资源(PDF/Book/Paper)吗?我通过这样做学到了很多东西,例如:手动展开并不总是最佳的,或者关于编

假设我对线性代数迭代多线程解算器的性能而不是可移植性感兴趣,并且我手头有评测代码的结果,那么我该如何调整代码以在我选择的机器上以最佳方式运行呢

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

我正在研究的代码的矩阵大小大致相当于RAM的全部大小(~6GB)。我将在英特尔i3笔记本电脑上工作。我将使用“英特尔MKL”链接我的代码

具体来说,

  • 有学习手动调优的好资源(PDF/Book/Paper)吗?我通过这样做学到了很多东西,例如:手动展开并不总是最佳的,或者关于编译器标志,但我更喜欢集中的资源

  • 我需要一些来将探查器信息转换为改进的性能。例如,我的探查器告诉我,一个处理器的堆栈正在被另一个处理器访问,或者我的
    mulpd
    ASM占用了太多时间。我不知道这些是什么意思,也不知道如何使用这些信息来改进代码

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

(我关心的是手动调谐而不是自动调谐)

杂项详情:

  • 这与通常的性能调整不同,因为代码的主要部分链接到英特尔专有的MKL库
  • 由于O(N^2)矩阵向量乘法和依赖关系中的内存带宽问题,我可以通过简单的观察来管理的内容是有限的
  • 我用C和Fortran编写,我已经尝试了这两种语言,正如我们讨论过的一百万次那样,如果我适当地调整它们,我发现这两种语言都没有区别
      天哪,这仍然没有答案。读完这篇文章后,你仍然没有有用的答案

      你的意思是你已经做了所有明显的和一般的事情,使你的代码快速。具体而言,你有:

      • 为您的问题选择最快的算法(或者您的问题是优化算法的实现,而不是优化问题解决方案的发现)
      • 像狗一样工作编译器,挤出最后一滴执行速度
      • 链接到您能找到的最有用的库中(并经过测试,以确保它们确实提高了程序的性能
      • 手工制作的内存访问,优化r/w性能
      • 完成了我们所有人都做的所有明显的小技巧(例如,当比较两个向量的范数时,你不需要求平方根来确定一个向量比另一个向量“大”…)
      • 将程序的并行可伸缩性提高到性能图上s==P线的极小范围内
      • 对于给定数量的处理器,始终在适当大小的作业上执行程序,以最大限度地提高性能
      你还是不满意

      现在,不幸的是,您已经接近最前沿,您所寻求的信息在书籍或网站上很难找到。甚至在这里也不容易找到。部分原因是您现在正致力于优化平台上的代码,您处于诊断问题和修复问题的最佳位置。但是这些问题您可能会得出结论,除了您的直接研究小组之外,没有其他人会对您的工作感兴趣,我知道您不会对我在我的平台上对代码进行的任何微观优化感兴趣

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

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

      您可能正在寻找优化,例如循环展开,25年前在编译器中实现的优化相对较难找到,因此在当时是最先进的,而且这些优化本身将在未来25年内过时并建立起来

      编辑

      首先,让我明确一点,这原本只是我的“答案”中隐含的一点:我不准备花足够长的时间来指导你,哪怕是总结我在25年多的科学/工程和高性能计算领域所获得的知识。我不习惯于写书,但很多人都喜欢,亚马逊会帮助你这个答案比我在添加这一点之前想发布的大多数答案都要长

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

      • 关于“手工构建的内存访问”,从维基百科关于“循环平铺”的文章开始(请看,你甚至不能依赖我将URL粘贴到这里),然后从那里读出;你应该能够快速找到可以在进一步搜索中使用的术语
      • 关于“像狗一样使用编译器”,我的意思确实是要熟悉它的文档,并详细了解各种选项的意图和实际情况;最终,您必须对编译器选项t进行大量测试