与 IPP 的静态链接会使 lib 大小超过 100MB?

Static linkage to IPP inflates lib size to more than 100MB?

我有一个静态库 linked 到 IPP 7.1 4 次调用 ippi_Mul。该项目建于 Visual Studio。以前是动态的link,后来发现在IPP 7.1动态库内部是多线程的,这对我来说是不允许的,所以我把它改成静态的link来单线程IPP .然后库的大小从几 MB 增加到大约 150MB。

这样的 link 这正常吗?正如我所说,我只从 IPP 调用一个函数。

在最新的IPP 8.2 multi-threading is deprecated中,所以更新可以解决我的问题。但是我仍然对此很感兴趣。如果我只使用库中的一个函数,那么 static linking 不是更正确的选择吗?这样的 inflation 库大小是可以预期的吗?

首先,需要明确你的项目模型。 "Static library" 通常不链接到任何外部库。静态库只是目标模块的归档,当然如果我们谈论 Windows' .lib 文件。

仅在生成应用程序可执行文件(.exe 文件)或动态库 (.dll) 时才使用链接器。

我可以假设,您的解决方案有两个项目 - 一个用于静态库,一个用于应用程序的默认项目。 在这种情况下,链接到动态 IPP 库肯定会最大限度地减少应用程序占用空间,因为应用程序不包含 IPP 函数代码(仅从动态库调用外部函数)。函数存储在动态库文件中,有几百MB。

如果您想使用静态 IPP 库构建您的应用程序,同时减小应用程序可执行文件的大小,您需要同时限制包含在您的应用程序中的 CPU 优化。

当您不做任何特殊操作时,只需在链接器的命令行中使用静态 IPP 库,应用程序目标文件与所有函数变体链接,针对不同的 CPU 架构(从 SSE 到 AVX2)进行了优化.

例如,如果您在源代码中包含函数 "ippSomeFunction",链接器将添加 "ippSomeFunction_SSE" + "ippSomeFunction_SSE2" + ... + "ippSomeFunction_AVX2" 到应用程序可执行文件.这将增加应用程序的大小,但将允许在任何英特尔 CPU 上执行您的应用程序,并针对当前 CPU 进行最优化。调度程序将为 CPU.

启用最合适的函数变体

如果您了解目标 CPU 体系结构,您可以使链接器仅添加需要优化的函数。阅读 IPP 安装目录“readme.htm”文档“/ipp/tools/ia32(或者,intel64)/staticlib”。

在这种情况下,您需要对源代码做的唯一更改是在包含其他与 IPP 相关的之前添加“#include ipp_cpuletter.h”文件。 h 个文件,例如

#include "ipp_p8.h"
// From now on only IPP functions for SSE4.2 CPU will be used
#include "ippi.h"
// The rest of code