我们正在编译使用OpenMP的应用程序。我们使用gcc 4.4,使用-fopenmp。该应用程序还使用IPP,其中包括自己的OpenMP版本(libiomp5)。 (注意:我们通过调用ippSetNumThread(1)禁用IPP的内部线程。根据英特尔的文档,这应避免与其他线程库冲突。但是,与IPP的链接仍然在libiomp5.so中链接。)
由于已经链接了libiomp5.so,我们不已经与libgomp.so(gcc的OpenMP版本)链接。很长一段时间,这已经奏效,但在看似无关紧要的变化之后,我们开始在我们支持的四个平台之一上看到与OpenMP相关的非常奇怪的崩溃(其他三个平台仍能正常工作)。
如果我链接到libgomp.so以及libiomp5.so,我可以使崩溃消失。
我对此有几个问题:
答案 0 :(得分:4)
由于几天没有人回答,我只会报告我独立发现的内容:
是否安全地连接这两个库? 不。这是我在这个主题上找到的最有用的页面: http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/optaps/common/optaps_par_openmp_multiple_compilers.htm
英特尔建议,如果您要将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)
如果您使用的是IPP 6,它不会告诉您API版本,但它会告诉您何时构建它以及使用哪个版本的Intel编译器。然后,您可以检查并查看编译器支持的OpenMP版本。 (11.0是支持OpenMP v3.0的英特尔编译器的第一个版本。)