我们正在编译一个使用 OpenMP 的应用程序。我们正在使用带有 -fopenmp 的 gcc 4.4。该应用程序还使用 IPP,其中包括自己的 OpenMP 版本 (libiomp5)。(注意:我们通过调用 ippSetNumThread(1) 来禁用 IPP 的内部线程。根据 Intel 的文档,这应该避免与其他线程库发生冲突。但是,与 IPP 的链接仍然在 libiomp5.so 中链接。)
由于 libiomp5.so 已经链接,我们还没有链接 libgomp.so(gcc 的 OpenMP 版本)。很长一段时间以来,这一直有效,但是在看似无关紧要的更改之后,我们开始在我们支持的四个平台之一上看到非常奇怪的与 OpenMP 相关的崩溃(其他三个平台仍然可以正常工作)。
如果我在 libgomp.so 和 libiomp5.so 中链接,我可以使崩溃消失。
我对此有几个问题:
由于几天没有人回答,我将独立报告我的发现:
与这两个库链接是否安全? 不。这是我在这个主题上找到的最有用的页面:http : //software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/optaps/common/optaps_par_openmp_multiple_compilers.htm
Intel 建议,如果您打算将 IPP 的内部 OpenMP 线程与您自己的 OpenMP 线程混合使用,请链接到 libiomp5 而不是编译器的 OpenMP 库。当前版本的 libiomp5 提供了与 gcc 的 OpenMP 的“源代码兼容性和对象级互操作性”,但前提是您使用的是 gcc“4.42”(原文如此;我假设它们的意思是 4.4.2)或更高版本。
有没有办法告诉 OpenMP libiomp5.so 支持哪个版本? 是的。设置环境变量 KMP_VERSION=1,然后运行您的应用程序。你会得到一些由 libiomp5 打印到你的控制台的调试输出。如果您使用的是 IPP v7 或更高版本,一行将类似于
Intel(R) OMP API version: 3.0 (200805)
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 IPP 6,它不会告诉您 API 版本,但会告诉您它是何时构建的以及使用哪个版本的英特尔编译器。然后您可以查看编译器支持的 OpenMP 版本。(11.0 是第一个支持 OpenMP v3.0 的英特尔编译器版本。)
| 归档时间: |
|
| 查看次数: |
2745 次 |
| 最近记录: |