我将英特尔 MKL 用于 BLAS,并使用英特尔 MKL Link Line Advisor获取有关命令行选项的帮助。
该顾问提供静态、动态和单一动态库的选项。这些术语是什么意思?
关于这个,有很多关于 SO 的帖子,但它们都专注于开发软件而不是科学/数学代码。(这个特别有用)
- 这些术语与并行计算有何关系?
- 这个比那个好吗?(我知道需要更精确地定义更好,但我现在不知道如何)
- 什么更常用,为什么?
- 程序员在链接时需要考虑什么?
我将英特尔 MKL 用于 BLAS,并使用英特尔 MKL Link Line Advisor获取有关命令行选项的帮助。
该顾问提供静态、动态和单一动态库的选项。这些术语是什么意思?
关于这个,有很多关于 SO 的帖子,但它们都专注于开发软件而不是科学/数学代码。(这个特别有用)
术语静态链接和动态链接与并行计算没有直接关系,尽管很长一段时间以来就知道动态加载(与加载静态编译的可执行文件相反)在网络文件系统上不能很好地扩展,因为它很重由动态加载器搜索目标库的加载路径引起的元数据加载。
很难就静态库还是动态库在高性能计算方面的表现做出一般性的陈述。当然,对于大多数超级计算应用程序来说,静态链接更简单且更受欢迎。为什么是这样?在当前这一代超级计算机上,每个节点通常只运行一个作业,这大大降低了共享库减少内存消耗的任何好处。此外,科学计算代码在语言特性或程序设计方面往往不是很复杂,并且很少使用需要动态加载的语言特性(例如插件模块)。与静态库相比,动态库具有额外的困难,即跨操作系统的可移植性要低得多。
由于所有这些,大多数 HPC 系统在可用时使用静态编译。静态库被认为更快、更容易安装和维护,并且通常更健壮。基于 Python 的 HPC 代码是其中的一个例外,但它们仍然存在与动态加载相关的性能问题(scicomp 上的几个用户现在实际上正在解决这个问题!)。
当您选择静态链接与动态链接时,您需要考虑代码的部署方式和位置、底层库是否可能更改或移动,以及网络文件系统的性能特征。您还应该评估是否需要动态链接,无论是通过库依赖还是与 Python 等动态脚本语言进行互操作。
单一动态库是英特尔特有的术语。它是指将它们的动态库打包到一个单独的元库中以简化链接过程。如果您将使用与英特尔库的动态链接,除非您正在做一些复杂的事情,否则这种形式可能是首选。