1

我有一个链接到 IPP 7.1 的静态库,用于 4 次调用ippi_Mul. 该项目是在 Visual Studio 中构建的。这以前是一个动态链接,但事实证明,在 IPP 7.1 中,动态库是内部多线程的,这对我来说是不允许的,所以我将其更改为指向单线程 IPP 的静态链接。然后库的大小从几 MB 增加到大约 150 MB。

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

在最新的 IPP 8.2中,不推荐使用多线程,因此更新将为我解决问题。但是我仍然对此很感兴趣。如果我只使用库中的一个函数,静态链接不是更正确的选择吗?库大小的这种膨胀是可以预期的吗?

4

1 回答 1

2

首先,需要明确你的项目模型。“静态库”通常不链接到任何外部库。如果我们谈论 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 安装目录“ /ipp/tools/ia32(或,intel64)/staticlib ”中的“ readme.htm ”文档。

在这种情况下,您需要对源代码进行的唯一更改是在包含其他与 IPP 相关的 .h 文件之前添加“#include ipp_cpuletter .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
于 2015-02-04T13:08:43.417 回答