告诉 GCC *不*链接 libgomp,以便它链接 libiomp5

2023-11-27

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

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

虽然我能够构建我的包,但一些二进制文件同时链接到 libgomp 和 libiomp5。我不是positive这导致了问题,但是已经发生了一些崩溃,联动组合是可疑的,即使它没有导致崩溃,它的效率也肯定是可怕的低下。

我正在尝试使用 gcc 4.9.1 来做到这一点。

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

我浏览了手册页,没有看到任何允许选择 openmp 库的 gcc 指令。英特尔的论坛有一个非常古老的讨论,他们建议在 -fopenmp 之后立即指定一个静态库,然后是 --as-needed。这看起来很不稳定,而且很有可能干扰插件包。 llvm-openmp 似乎曾经考虑过 -fopenmp=libiomp5 指令,但它似乎已在 3.5 版本中被删除,无论如何我都在尝试使用 gcc。

Thanks.


GCC 不支持链接 Intel OpenMP 运行时库。 GCC 的内部代码转换器将 OpenMP 指令转换为ligomp- 特定的调用和那些具有与公开的 API 不同的 APIlibiomp。此外,将两个独立的 OpenMP 运行时混合到一个可执行文件中(或者混合到单个进程中,如果支持 OpenMP 的模块是动态加载的)会导致灾难。这就是 MKL 的多线程驱动程序有两种版本的原因 - Intel 版本和 GNU 版本。某些机器上缺少后者可能是安装缺陷。

Edit:显然,Intel OpenMP 运行时提供了一个 GNU 兼容层,这意味着它可以用作libgomp。至少有这些符号:

$ nm libiomp5.a | sort | grep GOMP_
0000000000000000 T GOMP_barrier@@VERSION
0000000000000000 T GOMP_barrier@GOMP_1.0
0000000000000000 T __kmp_api_GOMP_barrier
0000000000000000 T __kmp_api_GOMP_barrier_10_alias
...

在这种情况下,你要做的是:

  • keep -fopenmp编译代码,以便 GCC 识别 OpenMP 编译指示并将代码转换为相应的调用libgomp;
  • 如果使用GCC来链接可执行文件或共享库,do not通过它-fopenmp链接阶段的选项;相反,通过-L/path/to/libiomp5 -liomp5;
  • 如果使用 GNU ld 链接可执行文件/模块,则替换-lgomp with -liomp5.

如果无法进行上述更改,那么英特尔论坛上的帖子就有意义,因为链接器解析链接时符号引用的方式,尽管它实际上更像是一种黑客攻击。通过-Wl,--as-needed强制 GNU ld 不发出DT_NEEDED命令行上跟随它的任何库的标签,除非该库满足未定义的符号引用,假设 GCC 驱动程序将插入-lgomp在用户提供的选项之后的某处。这个想法是为了防止libgomp即使没有未解析的引用,也不会与可执行文件链接GOMP_...,通常不应该是这种情况,因为所有引用,即使是来自动态加载模块的引用,都应该满足libiomp5。预防libgomp防止被 RTLD 加载是至关重要的,因为其中有一些构造函数例程,无论是否导入符号都会调用这些例程,并且这些例程可能会干扰 IOMP。

链接器技巧在 OS X 等非 ELF 系统上不起作用。Mach-O 链接编辑器不支持--as-needed尽管可能有不同的机制可以在该操作系统上实现相同的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

告诉 GCC *不*链接 libgomp,以便它链接 libiomp5 的相关文章

  • 使用基类指针创建对象时缺少派生类析构函数

    在下面的代码示例中 未调用派生类析构函数 知道为什么吗 我有一个具有虚函数的基类 现在我使用基类指针来创建派生类的新对象 我的理解是 当派生类对象被销毁时 首先调用派生类的析构函数 然后调用基类 但是我只看到基类的析构函数被调用 有谁知道我
  • 如何使用 GCC 在 C 上编译库?

    我用这些文件创建了一个库pila h and pila c 我编译文件pila c with gcc pila c c这个库运行良好 我已经测试过了 然后我又做了一个图书馆 这个库有文件pila funciones extra h and
  • 如何使用 #pragma 在 G++ 中启用优化

    我想在没有命令行参数的情况下启用 g 优化 我知道 GCC 可以通过写来做到这一点 pragma GCC optimize 2 在我的代码中 但它似乎在 G 中不起作用 此页面可能有帮助 http gcc gnu org onlinedoc
  • 垂直和水平平行度

    最近在并行领域工作 我了解到有两个术语 垂直并行 和 水平并行 有人说openmp 共享内存并行 是垂直并行 而mpi 分布式内存并行 是水平并行 为什么这些术语这么称呼 我不明白原因 这么称呼它们只是术语吗 这些术语似乎没有被广泛使用 也
  • gcc 的 -Wbad-function-cast 的目的是什么?

    根据此处答案的建议 我打开了 Wbad function cast看看我的代码是否有 gcc 可以捕获的任何不良行为 结果出现了这个示例 unsigned long n int crossover int pow n 14 这里并不重要cr
  • 列出 C 常量/宏

    有没有办法使GNU C 预处理器 cpp 或其他一些工具 列出给定点上的所有可用宏及其值C file 我正在寻找特定于系统的宏 同时移植一个已经精通 UNIX 的程序并加载一堆稀疏的 UNIX 系统文件 只是想知道是否有比寻找定义更简单的方
  • C 程序的“编译器正确”命令

    这是关于中提到的编译步骤Linux 期刊文章 https www linuxjournal com article 6463 C 程序是使用编译的cpp cc1 as and ld该文章中的命令 我能够执行这些步骤cpp as and ld
  • 如何更改 Xcode 中的编译器

    我正在 Xcode 4 6 3 中编译 C 代码 但我不知道我正在使用哪个编译器 我需要使用 gcc 4 2 提前致谢 If you really需要更改为 gcc 您可以在构建设置中执行此操作
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • C++ while 循环优化无法正常工作

    我有这个代码段 include
  • c - 将 .data 发送到不同的部分

    我想把其中的符号 data为特定 C 文件生成的节并将它们放在不同的节中 例如 mydata 在最终的可执行文件中 例如 normaldata c char my str this should appear in data special
  • GCC 对潜在有效的代码抛出 init-list-lifetime 警告?

    我在 Debian不稳定的GCC 9 3 0上运行 我从事的一个项目最近发生了变化 引入了类似于下面的代码 include
  • gcc 不太可能使用宏

    我正在编写一段关键代码 其逻辑大致如下 if expression is true do something with extremely low latency before the nuke blows up This branch i
  • 如何检查给定调用站点的重载决策集

    如何检查重载解析集 我在多个调用站点中使用了 4 个相互竞争的函数 在一个调用站点中 我期望调用一个函数 但编译器会选择另一个函数 我不知道为什么 这不是微不足道的 为了了解发生了什么 我正在使用enable if disable if打开
  • Gcc 4.2 版本缺失

    在我的带有 osx lion 和 XCode 4 1 的新 macbook pro 上 我遇到了一些 gcc 问题 In usr bin我找不到gcc 4 2 我只有以下版本 i686 apple darwin11 llvm gcc 4 2
  • 错误:“uint16_t”未声明? [复制]

    这个问题在这里已经有答案了 我有代码 include
  • CPU Relax 指令和 C++11 原语

    我注意到许多使用特定于操作系统的原语实现的无锁算法 例如所描述的自旋锁here http locklessinc com articles locks 使用 Linux 特定的原子原语 经常使用 cpurelax 指令 使用 GCC 可以通
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc

随机推荐

  • spring-mvc中如何传递参数来重定向页面

    我写了以下控制器 RequestMapping value logOut method RequestMethod GET public String logOut Model model RedirectAttributes redire
  • 检查在自定义 Chrome 选项卡中打开哪个网址

    chrome自定义选项卡中是否有类似于Webview的onPageStarted的功能 在 onNavigation 捆绑包始终为空 根据设计 Chrome 自定义选项卡不可能做到这一点 您可以知道用户已经导航 但无法知道他们去了哪里 看
  • 检测浏览器关闭/导航到其他页面并注销的最佳方法

    我正在 GWT 中编写一个应用程序 我需要检测用户何时离开我的应用程序或何时关闭浏览器窗口 onUnload 事件 并执行注销 会话失效和其他一些清理任务 注销操作由 servlet 执行 我目前正在通过挂钩 onUnload 事件并打开一
  • 检查 LatLngBounds.Builder 是否为空

    这是我的代码 LatLngBounds Builder builder new LatLngBounds Builder for int x firstVisibleItem x lt lastVisibleItem x builder i
  • 如何提取直接 Facebook 视频 url

    我正在尝试从 facebook 视频链接中提取 facebook 视频文件页面的 url 但我无法继续操作 例如 我的 Facebook 视频网址是 https www facebook com nerdandco videos 16621
  • 如何在 Woocommerce 中检查产品是否具有特定产品属性

    我想确定产品是否具有属性 例如 if product has attribute pa color do something 我怎样才能做到这一点 您只需使用WC Product method get attribute 这边走 If ne
  • 在 keras 中加载模型后的不同预测

    我在 Keras 中构建了一个序列模型 经过训练后它给了我很好的预测 但是当我保存然后加载模型时 我没有在同一数据集上获得相同的预测 为什么 请注意 我检查了模型的权重 它们以及模型的架构都是相同的 并使用 model summary 和
  • 使用 Java 邮件服务器进行测试

    我正在测试一个应用程序 该应用程序从邮箱中取出邮件 根据该邮件的内容执行某些操作 然后根据操作的结果发送响应邮件 我正在寻找一种为此应用程序编写测试的方法 理想情况下 我希望这些测试能够启动自己的邮件服务器 将我的测试电子邮件推送到该邮件服
  • 如何等待 Angular Google 地图将 getGMap 附加到控制对象

    我一直在尝试在google maps Map由创建的对象ui gmap google map指令来自Angular 谷歌地图库 我需要动态地执行此操作 因此 至少通过我的简短测试 似乎使用events上的参数ui gmap google m
  • ccAvenue 支付网关中 ios 9 中的安全错误

    在发布 iOS 9 之前 我将 ccAvenue paymeny 网关集成到我的 iOS 应用程序中 付款已成功转移到 iOS 8 中的商家帐户 当我在 iOS 9 中测试我的应用程序时 付款已转移到商家帐户 但显示安全错误 我也改变lib
  • 函数的返回类型是重整名称的一部分吗?

    假设我有两个具有相同参数类型和名称的函数 不在同一个程序中 std string foo int x return hello int foo int x return x 编译后它们会具有相同的损坏名称吗 返回类型是 C 中重整名称的一部
  • 如何从OpenStreetMap中找到路口?

    如何在OpenStreetMap中提取路口 我需要路口的经度和纬度 谢谢 曾经有过类似的问题here 没有直接的 API 调用来检索交集 但是您可以查询给定边界框中的所有方式 例如直接通过API或通过立交桥API 并查找由两种或多种方式共享
  • 仅从 ELF 二进制文件中提取我的函数名称

    我正在编写一个脚本 用于提取二进制文件中的所有函数 由用户编写 以下 shell 脚本提取我的函数名称以及一些以以下开头的库函数 readelf s a out gawk if 4 FUNC 3 0 7 13 8 main print b
  • php + gd 的图像比较

    使用 php 比较两个图像的最佳方法是什么图形绘制 GD 库 这是场景 我有一张图像 我想找到给定集合中哪张图像与其最相似 最相似的图像实际上是同一张图像 不是像素完美匹配 而是同一张图像 我在示例中戏剧化了两个图像与第一张图像之间的差异
  • 代理后面的Java应用程序在linux中使用http_proxy变量

    我正在考虑一个简单的Java应用程序 命令行 它连接到互联网来下载XML文件 问题是我的Ubuntu正在使用代理通过用户名和密码连接到互联网 通过http proxy http
  • Rabbit 消息侦听器执行失败,并且未设置 ErrorHandler。无法调用参数类型 = [class [B] 的目标方法,

    我正在使用 spring amqprabbitmq 并使用发送消息 Message message MessageBuilder withBody item toString getBytes setReplyTo importReply
  • 当 shell=True 时如何确定 subprocess.Popen() 失败

    Windows 版本的 Python 2 6 4 有什么方法可以确定使用 shell True 时 subprocess Popen 是否失败 shell False 时 Popen 成功失败 gt gt gt import subproc
  • 为什么 bad_alloc(const char*) 在 Visual C++ 2012 中被设为私有?

    我只是想使用 Visual Studio 2012 候选版本 C 编译一个更大的项目 该项目现在使用VS2010编译 我只是贪图 C 11 的东西 所以我尝试了 除了我自己可以解释的事情之外 该项目使用如下代码 ostringstream
  • Mac OS X 上的黑莓开发

    我最近开始为移动设备创建应用程序 并成功完成了 iPhone 的应用程序 我现在将注意力转向黑莓 但尚未找到令人信服的文章或网站来说明可以做到这一点 也找不到有关如何做到这一点的教程 可以在 Mac OS X 上开发 Blackberry
  • 告诉 GCC *不*链接 libgomp,以便它链接 libiomp5

    我需要找出一个可以输入 gcc 的编译器 链接器指令 以便在指定 fopenmp 时它不会自动链接 libgomp 原因是我正在尝试针对英特尔的 MKL BLAS 进行构建 MKL 需要添加单独的 Intel 库来处理多线程 例如 libm