什么是 -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 以及什么程序使用它进行编译?的主要内容,如果未能解决你的问题,请参考以下文章