在内部链接使用不同 OpenMP 运行时的第三方库是否安全?[关闭]

Is it safe to link 3rd party libraries that use different OpenMP runtimes internally? [closed]

提问人:MK-3PP 提问时间:11/14/2023 最后编辑:Mark RotteveelMK-3PP 更新时间:11/16/2023 访问量:78

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

8天前关闭。

这篇文章在 8 天前经过编辑并提交审核。

我们的 C++ 应用程序链接了多个第三方库。我们无法修改这些。有些使用英特尔的,有些则Microsoft的。libiomp5md.dllvcomp140.dll

我最近更新了其中一个库,它似乎已经通过使用 Visual C++ 中的新编译器开关切换到 LLVM 的 OpenMP 运行时,从而链接到 .-openmp:llvmlibomp140.x86_64.dll

自从切换到 LLVM 的 OpenMP 运行时后,当启动我们的应用程序时,我得到了一个控制台窗口,说明:

OMP:错误 #15:正在初始化libomp140.x86_64.dll,但已找到 libiomp5md.dll 已初始化。
OMP:提示 这意味着 OpenMP 运行时的多个副本具有 已链接到程序中。这很危险,因为它会降解 性能或导致不正确的结果。最好的办法是 确保只有单个 OpenMP 运行时链接到进程中, 例如,避免在任何库中静态链接 OpenMP 运行时。 作为不安全、不受支持、未记录的解决方法,您可以将 环境变量 KMP_DUPLICATE_LIB_OK=TRUE 以允许程序 继续执行,但这可能会导致崩溃或静默产生 结果不正确。有关详细信息,请参阅 http://openmp.llvm.org/

但是,我在 http://openmp.llvm.org/ 上没有找到有关该主题的信息。

那么,假设应用程序使用使用不同 OpenMP 运行时的独立第三方库,这是否是一个问题?

其他上下文:

  • 如果我们最终每个 OpenMP 运行时都有一个线程池,那很好。他们会时不时地为硬件而争吵,没什么大不了的。
  • 这个警告对我来说是新的,因为 LLVM OpenMP 运行时通过更新的第三方库删除了。在混合使用英特尔和Microsoft运行时时,我们没有看到这样的警告。这并不意味着这样做一开始就是安全的。也许Microsoft的OpenMP运行时从未检测到该冲突,或者没有发出明显的警告。
C OpenMP LLVM 英特尔 视觉-C++-2019

评论

0赞 possum 11/14/2023
这篇文章有太多问题。将其减少到一个。
4赞 463035818_is_not_an_ai 11/14/2023
如果供应商本身告诉你它不安全,你为什么要相信别人?
0赞 MK-3PP 11/14/2023
@463035818_is_not_an_ai,这个问题已经持续了十多年,没有通知(没有崩溃,没有指向这一点的用户错误),现在由于引入了新的贡献者,它已经浮出水面。因此,该信息可能过于笼统,需要更具体。我想知道,警告是否适用于我们的用例。据我所知,LLVM 确实没有更具体,只是将项目网站链接放在警告中。
0赞 Peter Cordes 11/15/2023
同一库的不同版本似乎比两个碰巧做同样事情的独立库更有可能相互冲突(例如,通过内部数据结构的符号名称)。我认为 LLVM 的警告消息是真实的。

答: 暂无答案