optimization - 为台式机和 super 计算机编写的代码有什么区别?

标签 optimization memory performance hpc grid-computing

假设地说,如果我的科学工作是在开发功能/模块/子程序(在台式机上),我需要知道什么才能将其整合到在 super 计算机(可能模拟分子)上运行的大规模模拟中、流体、 react 等)?

我的印象是,它与尽可能利用某些库(例如 BLAS、LAPLACK)、修改算法(减少迭代)、分析、并行化、考虑内存-硬盘-处理器的使用/访问有关……我是意识到这句格言“想要优化你的代码?不要这样做”,但是如果有人有兴趣学习编写高效的代码,可以引用哪些引用资料?

我认为这个问题与语言无关,但由于许多用于生物分子模拟、气候建模等的数字运算包是用 Fortran 的某个版本编写的,所以这种语言可能是我感兴趣的目标(而且我在 Fortran 中进行了相当广泛的编程77)。

最佳答案

在任何级别的机器中,剖析都是必须的。在常见的用法中,我发现扩展到越来越大的网格需要更好地理解网格软件和网格的拓扑结构。从这个意义上说,你学到的关于优化一台机器的一切仍然适用,但是了解网格软件会让你获得更多的里程。 Hadoop 是最流行和广泛使用的网格系统之一,因此了解调度程序选项、接口(interface)(API 和 Web 接口(interface))以及使用的其他方面将有所帮助。尽管您可能不会将 Hadoop 用于给定的 super 计算机,但它是学习分布式计算的一种不那么痛苦的方法。对于并行计算,你可能会追求 MPI 和其他系统。

此外,学习在单台机器上跨多个内核或处理器并行化代码是您可以在台式机上开始学习的东西。

建议:

  • 学习在单机上优化代码:
  • 学习分析
  • 学习使用优化库(分析后:以便您看到加速)
  • 确保您非常了解算法和数据结构 (*)
  • 学习在多核机器上进行令人尴尬的并行编程。
  • 稍后:考虑多线程编程。这更难,可能不会为您的问题带来返回。
  • 了解用于分布式处理的基本网格软件
  • 了解网格上的并行处理工具
  • 学习为替代硬件编程,例如GPU,各种专用计算系统。

  • 这与语言无关。我不得不在多种语言和多个 HPC 系统中学习相同的序列。在每一步,采取更简单的路线来学习一些基础设施和工具;例如在多线程之前学习多核,在并行之前学习分布式,这样您就可以看到哪些适合硬件和问题,哪些不适合。

    某些步骤可能会根据本地计算实践、已建立的代码库和导师重新排序。如果你有一个大型的 GPU 或 MPI 库,那么一定要学习它,而不是把 Hadoop 强加给你的合作者。

    (*) 非常了解算法的原因是,只要您的代码在网格上运行,其他人就会看到它。当它占用系统时,他们会想知道你在做什么。如果您正在运行一个多项式并且应该是常数的过程,您可能会发现自己被 mock 了。其他具有更多领域专业知识的人可能会帮助您找到 NP-hard 问题的良好近似值,但您应该知道这个概念是存在的。

    关于optimization - 为台式机和 super 计算机编写的代码有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7053751/

    相关文章:

    html - 当有一个包含太多 dom 元素的列表时,页面会因选项卡而卡住

    r - 用R解析xml数据,代码很慢。如何让它更快?

    objective-c - 带指针的辅助变量是否会对性能/内存产生影响?

    angularjs - 与 DOM 中 ng-app/ng-controller 放置相关的 Angular View 性能

    r - 排列 : Speed up, 预测和/或多线程

    python - 从 scipy 根查找/优化函数返回多个值

    c++ - 数组在*物理*内存中是连续的吗?

    c - 如何在 C 中跟踪动态分配的内存

    Python:具有实际磁盘文件语义的命名内存文件?

    javascript - 在分解长时间运行的 JavaScript 任务时避免强制延迟 setTimeout