告诉GCC不要链接libgomp,这样它就会链接libiop5 [英] Telling GCC to *not* link libgomp so it links libiomp5 instead

查看:33
本文介绍了告诉GCC不要链接libgomp,这样它就会链接libiop5的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要找出一个可以提供给GCC的编译器/链接器指令,以便在指定-fopenmp时它不会自动链接libgomp。

原因是我试图针对Intel的MKL BLAS进行构建。MKL需要添加单独的英特尔库来处理多线程(例如,libmkl_intel_thread或libmkl_gnu_thread)。然而,并不是所有操作系统(包括我的操作系统)上都有用于链接MKL和libgomp的库。这迫使我链接libmkl_intel_thread,而它又必须链接到libip5。

虽然我能够构建我的包,但是一些二进制文件同时链接到libgomp和libip5。我不是很肯定这是在造成问题,但已经发生了几次崩溃,链接组合是可疑的,即使它不会导致崩溃,它也肯定是一个可怕的低效。

我正在尝试用GCC 4.9.1来做这件事。

不幸的是,不能选择避免-fopenmp。原因是这是为了编译一个相当大的包,该包由几个子包组成,这些子包的Makefile格式不是最好的,并且以后可能会编译来自其他来源(插件)的其他包。强制执行通用编译器/链接器指令并不困难。但是,打开--enable-openmp会同时激活-fopenmp和用于触发与多线程相关的代码的定义。试图分离这三个(--enable-openmp、-fopenmp和链接到--enable-openmp的代码)是不可行的。

我浏览了手册页,但没有看到任何针对GCC的指令允许选择OpenMP库。英特尔的论坛有一个非常古老的讨论,他们建议在-fopenmp后面紧跟着指定一个静电库,然后是--as-Need。这看起来相当摇摇晃晃的,而且有很大可能会干扰插件包。livm-openmp似乎一度考虑过a-fopenmp=libiopp5指令,但它似乎在3.5中被删除了,我还是尝试使用GCC。

谢谢。

推荐答案

我想我现在已经有了答案;我已经与英特尔人员进行了多次交流,我想分享一下结果。这是他们的一些建议和我自己想出来的混合:

  1. 简单的回答是不行,GCC想在链接器阶段强制使用libgomp。如果libip也被链接,那么两个文库都将被链接。会叫哪一个呢?我不知道。

  2. 更长远的答案是,在某些发行版上,可以通过创建自定义libgomp.spec或更改随GCC一起安装的libgomp.spec来更改GCC的默认行为(设置-fopenmp时添加libgomp)。在我的发行版(自制)上,这是不可行的;"libgomp.spec"文件是空的,并且libgomp的规范内置在GCC中。所有这些都必须被推翻。而且每次更新GCC时都必须重做此操作。

  3. 在某些操作系统上,可能会替换指向libgomp的每个副本和链接,以及指向libiopp5的符号链接。然后,二进制文件将有多个链接指向同一个库,使用两个不同的名称。那会发生什么呢?我不知道。

    /li>
  4. 我最后做的是从GCC转到llvm的clang-omp实现。除非另有说明,否则它使用libip5。我对此的担忧是,我的项目的一部分使用Fortran,而没有llvm Fortran编译器。然而,事实证明,即使将-fopenmp赋予gfortran,只要llvm最终进行链接,它就会清除所有对libgomp的引用,并将其替换为libiopp5。clang-omp还可以使用-fopenmp=[libibip5|libgomp]选择OMP库,但我无法使其一致工作。不管怎么说,llvm3.5的clang-omp实现几乎涵盖了所有的openmp规范,到目前为止,在切换过程中似乎没有任何损失。事实上,性能有所提高。

  5. 我郑重声明,我使用龙蛋将gfortran用作llvm前端进行了实验。这本书不值一提。龙蛋与GCC 4.9不兼容,强制GCC 4.8它很难设置;随着版本的变化,似乎很难进行维护;llvm人员不确定DragonEgg将得到多少支持;而且在所有情况下,性能都不如仅使用llvm。

  6. 驱使我来到这里的问题是,如何获得一个包含C和Fortran组件的包,它使用OpenMP,针对MKL编译,我操作系统的MKL库与iomp5硬链接,不接受gomp。答案是,唯一可行的选择就是从GCC跳槽到创业板。

  7. 这确实留下了一个问题,就像openmp网站上宣称的那样,"iomp5‘插件’兼容‘GCC 4.9吗?"答案很简单,"不,"iomp5和GCC 4.9将不会相互协作-至少在没有对工具链进行实质性修改的情况下,没有可用的指导或文档,也不清楚是否有人成功地做到了这一点。

这篇关于告诉GCC不要链接libgomp,这样它就会链接libiop5的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆