我们正在编译一个使用OpenMP的应用程序。我们正在使用gcc 4.4,与-fopenmp。该应用程序还使用IPP,其中包括自己版本的OpenMP (libiomp5)。(注意:我们通过调用ippSetNumThread(1)来禁用IPP的内部线程。根据Intel的文档,这应该避免与其他线程库的冲突。然而,与IPP的链接仍然存在于liBiop5.so中。
既然libigp5.so已经连接到其中,我们就没有连接到libgomp.so (gcc的OpenMP版本)。在很长一段时间里,这是有效的,但经过一个看似无关紧要的变化,我们开始看到非常奇怪的OpenMP相关的崩溃,在我们支持的四个平台之一(其他三个平台仍然运行良好)。
如果我在libgomp.so和libiop5.so中链接,我就可以让崩溃消失。
我对此有几个问题:
的版本的信息。
发布于 2011-01-04 20:57:28
由于几天来没有人回答,我只想独立地报告我发现的情况:
与这两个库都是安全的? No。下面是我在这个主题上找到的最有用的页面: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 liBiop5.so支持哪个版本?是的。设置环境变量KMP_VERSION=1,然后运行应用程序。您将获得一些由libiomp5打印到控制台的调试输出。如果您正在使用IPP v7或更高版本,一行将类似于
Intel(R) OMP API version: 3.0 (200805)如果您使用的是IPP 6,它不会告诉您API版本,但是它会告诉您何时构建它,以及使用哪个版本的Intel编译器。然后,您可以检查并查看编译器支持的OpenMP版本。(11.0是Intel编译器支持OpenMP v3.0的第一个版本。)
https://stackoverflow.com/questions/4548880
复制相似问题