我正在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?什么在使用它?我应该如何与它联系呢?
答案 0 :(得分:3)
构建脚本找不到numa库 - NUMA(非统一内存访问)。 -l选项告诉链接器链接库,但系统ether没有安装正确的或者链接器的搜索路径不完整/错误。
尝试查询包管理器(apt或rpm)以获取包libnuma。
答案 1 :(得分:2)
OpenMPI,我认为mpich2使用libnuma(`Linux内核支持的NUMA(非统一内存访问)策略的简单编程接口')用于内存亲和性 - 确保内存为特定的MPI任务与运行任务的核心保持接近,而不是完全保存在另一个套接字的缓存中。这对于多核节点的性能非常重要。
如果链接器找不到库,则可能需要使用YaST来安装libnuma-devel。
答案 2 :(得分:1)
感谢Jonathan Dursi!
在Ubuntu上,包名是libnuma-dev。
apt-get install libnuma-dev
答案 3 :(得分:0)
在安装了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"
解决了该问题。