什么是 -lnuma 以及什么程序使用它进行编译?

Posted

技术标签:

【中文标题】什么是 -lnuma 以及什么程序使用它进行编译?【英文标题】:What is -lnuma and what program uses it for compilation? 【发布时间】:2012-02-22 09:03:36 【问题描述】:

我正在 Linux 桌面上使用 openmpi 和 mpicxx 编译消息传递程序。我的 makefile 执行以下操作:

mpicxx -c readinp.cpp
mpicxx -o exp_fit driver.cpp readinp.o 

此时我收到以下错误:

/usr/lib64/gcc/x86_64-suse-linux/4.5/../../../../x86_64-suse-linux/bin/ld: cannot find -lnuma

我的问题是:

什么是-lnuma?它在用什么?我应该如何链接到它?

【问题讨论】:

【参考方案1】:

感谢乔纳森·杜尔西!

在 Ubuntu 上,软件包名称为 libnuma-dev。apt-get install libnuma-dev

【讨论】:

【参考方案2】:

构建脚本找不到 numa 库 - NUMA(非统一内存访问)。 -l 选项告诉链接器链接库,但您的系统以太没有安装正确的,或者您的链接器搜索路径不完整/错误。

尝试在您的包管理器(apt 或 rpm)中查询包 libnuma。

【讨论】:

我知道其他人在这个系统上使用 OpenMPI 进行编译。我的用户帐户是否可能根本没有访问权限?我需要添加库所在的路径吗?如果是这样,我如何找到所说的路径? 这可能取决于您的发行版在哪里可以找到这些东西。大多数发行版将二进制文件和头文件分离到像“libnuma”和“libnuma-devel”这样的包中。尝试搜索两者。如果已安装,您应该能够查询路径(例如 rpm -ql libnuma 或 dpkg -L libnuma)。【参考方案3】:

OpenMPI,我认为是 mpich2,使用libnuma(“Linux 内核支持的 NUMA(非统一内存访问)策略的简单编程接口”)来实现内存关联——以确保特定MPI 任务靠近运行任务的核心,而不是完全保存在另一个套接字上的缓存中。这对于多核节点的性能很重要。

如果您的链接器找不到库,您可能需要使用 YaST 安装 libnuma-devel。

【讨论】:

【参考方案4】:

我在安装了 NUMA 库的远程服务器上工作时遇到了同样的错误。特别是,文件/usr/lib64/libnuma.so.1 存在。链接器似乎只查找名称为libnuma.so 的文件。创建符号链接

ln -s /usr/lib64/libnuma.so.1 /usr/lib64/libnuma.so

如here 所述,可能有效,但就我而言,我无权在/usr/lib64 中创建文件。我通过在我有写权限的其他位置创建符号链接来解决这个问题:

ln -s /usr/lib64/libnuma.so.1 /some/path/libnuma.so

然后将此路径添加到编译标志。在你的情况下,这将是

mpicxx -L/some/path -o exp_fit driver.cpp readinp.o

在我的较大构建过程(编译fftw)的情况下,我添加了LDFLAGS 环境变量的路径,

export LDFLAGS="$LDFLAGS -L/some/path"

解决了这个问题。

【讨论】:

正确的解决方法是让您的系统管理员安装开发包(libnuma-dev 在 ubuntu 上,numactl-devel 在 RHEL 上,...)。 libnuma 用于构建 Open MPI,但大多数 MPI 应用不太可能直接使用它(这意味着 libnuma.so.1 在运行时应该足够了)

以上是关于什么是 -lnuma 以及什么程序使用它进行编译?的主要内容,如果未能解决你的问题,请参考以下文章

如何编译JCEF以及内嵌到桌面应用程序中

什么样的数据库以及如何创建它来对文本进行分层分类?

java-uf命令使用

什么是 nestjs typeorm 中的 getRepositoryToken 以及何时使用它?

什么是WebView以及如何测试它

如何用javac 和java 编译运行整个Java工程