静态,动态和单动态链接是什么意思?


9

我使用Intel MKL for BLAS,并使用Intel MKL Link Line Advisor获得有关命令行选项的帮助。

该顾问程序提供静态,动态和单个动态库的选项。这些术语是什么意思?

关于SO的文章很多,但所有这些文章都集中在开发软件而不是科学/数学代码上。(这个特别有用)

  • 这些术语与并行计算有什么关系?
  • 这个比那个好吗?(我知道最好更好地定义更好的方法,但到目前为止我还不知道如何做)
  • 什么是更常用的,为什么?
  • 链接时程序员需要考虑什么?

请注意,如果您还没有看到它,则较新的Intel编译器(我认为版本11和更高版本)提供了该-mkl标志,该标志将消除大多数情况下使用链接行顾问程序的需要。
爱森

@Aesin,我在想。这是最佳的链接方式吗?
Inquest 2012年

不幸的是,我不知道-我还没有真正进行过任何测试,并且该手册没有详细说明其工作方式或与其他选项的结合方式。如果您指定了-static,它确实会静态链接MKL,如果您未指定,它会动态链接。从易用性的角度来看,无论如何,它肯定要好得多。
伊森(Aesin)2012年

Answers:


14

术语“ 静态链接”和“ 动态链接”与并行计算没有直接关系,尽管一段时间以来人们已经知道,动态加载(而不是加载静态编译的可执行文件)在网络文件系统上由于负载繁重而无法很好地扩展由动态加载程序搜索目标库的加载路径导致的元数据加载。

关于静态或动态库在高性能计算中是否更好,很难一概而论。当然,对于大多数超级计算应用程序而言,静态链接更简单且更可取。为什么是这样?在当前的超级计算机上,每个节点通常只有一个作业正在运行,这大大降低了由于共享库而减少内存消耗的任何好处。此外,就语言功能或程序设计而言,科学计算代码往往不是很复杂,并且它们很少利用需要动态加载的语言功能(例如插件模块)。动态库还有一个额外的困难,那就是静态库在整个操作系统中的可移植性要差得多。

所有这些的结果是,大多数HPC系统在可用时使用静态编译。静态库被视为更快,更容易安装和维护,并且通常更健壮。基于Python的HPC代码是这种情况的例外之一,但是它们仍然受到与动态加载相关的性能问题的影响(scicomp上的多个用户现在实际上正在解决此问题!)。

在选择静态与动态链接时,需要考虑如何以及在何处部署代码,底层库是否可能更改或移动以及网络文件系统的性能特征。您还应该评估是否需要通过库依赖或与动态脚本语言(例如Python)进行互操作的动态链接。

单个动态库是英特尔特定的术语。它是指将其动态库打包到单个元库中,以简化链接过程。如果将动态链接与Intel库一起使用,则除非您要进行复杂的操作,否则最好采用这种形式。


很好的答案!只是一件事:我意识到动态链接是不必要的,并且可以在静态和单个动态之间进行选择。您说我应该选择后者,除非我做复杂的事情(不是我做的)。因此,我应该使用Single Dynamic链接吗?[FWiW,我正在研究Krylov子空间方法]
Inquest

抱歉! 我的意思是,默认情况下您应该使用静态,但首选动态而不是动态。
阿隆·艾玛迪亚

我做了一些基准测试,发现: Dynamic : 0:42.92 Static : 0:42.93 Single Dynamic : 0:42.97平均超过1000个值。
Inquest 2012年

1
值得注意的是,在某些HPC系统上必须进行静态链接-例如在BlueGene / L系统上,这是因为计算节点上精简的OS不支持动态链接。
艾森(Aesin)2012年

1
您的说法让我有些困惑:“在当前的超级计算机上,每个节点通常只有一个作业正在运行,这大大降低了由于共享库而减少内存消耗的任何好处。” 您是说每个节点只有一个进程吗?我不确定每个节点的一项工作如何影响这种情况。静态链接时,每个进程将存储可执行文件的完整副本,这对于每个处理器的核心数量的增长可能非常重要。动态链接每个共享内存空间仅需要一个动态库副本。
andybauer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.