我正在尝试将犰狳矩阵(mat)保存到 hdf5 文件中。我在 CentOS 集群上,使用 anaconda,没有 root 权限。
我创建了一个环境
arma12
,在其中我首先安装了 hdf5,然后安装了犰狳。 conda env export --from-history
结果是
name: arma12
channels:
- defaults
dependencies:
- hdf5
- armadillo
prefix: /home/keshav/.conda/envs/arma12
版本为
hdf5-1.14.2
和armadillo-12.6.4
。 conda list
的详细输出为
# packages in environment at /home/keshav/.conda/envs/arma12:
#
# Name Version Build Channel
_libgcc_mutex 0.1 conda_forge conda-forge
_openmp_mutex 4.5 2_gnu conda-forge
c-ares 1.19.1 hd590300_0 conda-forge
ca-certificates 2023.7.22 hbcca054_0 conda-forge
hdf5 1.14.2 nompi_h4f84152_100 conda-forge
keyutils 1.6.1 h166bdaf_0 conda-forge
krb5 1.21.2 h659d440_0 conda-forge
libaec 1.0.6 hcb278e6_1 conda-forge
libcurl 8.2.1 hca28451_0 conda-forge
libedit 3.1.20191231 he28a2e2_2 conda-forge
libev 4.33 h516909a_1 conda-forge
libgcc-ng 13.1.0 he5830b7_0 conda-forge
libgfortran-ng 13.1.0 h69a702a_0 conda-forge
libgfortran5 13.1.0 h15d22d2_0 conda-forge
libgomp 13.1.0 he5830b7_0 conda-forge
libnghttp2 1.52.0 h61bc06f_0 conda-forge
libssh2 1.11.0 h0841786_0 conda-forge
libstdcxx-ng 13.1.0 hfd8a6a1_0 conda-forge
libzlib 1.2.13 hd590300_5 conda-forge
ncurses 6.4 hcb278e6_0 conda-forge
openssl 3.1.2 hd590300_0 conda-forge
zstd 1.5.5 hfc55251_0 conda-forge
使用的最少测试代码是
# include <iostream>
# include <armadillo>
using namespace std;
using namespace arma;
int main()
{ cout<< "Hello world"<< endl;
arma_version ver;
cout << "ARMA version: "<< ver.as_string() << endl;
mat A(2,2, fill::ones);
cout<< A<< endl;
A.save(hdf5_name("A.hdf5", "A"));
return 1;
}
并且通过
gcc/12.2.0
with 编译
g++ -std=c++17 -O3 test.cpp -I$(ARMA)/include -L$(ARMA)/lib -Wl,-rpath=$(ARMA)/lib -DARMA_USE_HDF5 -larmadillo -lhdf5
哪里
ARMA=/home/keshav/.conda/envs/arma12
。编译没有错误并给出一个可执行文件 a.out
,在 ldd ./a.out
上给出结果
linux-vdso.so.1 => (0x00007ffc5dffb000)
libarmadillo.so.12 => /home/keshav/.conda/envs/arma12/lib/libarmadillo.so.12 (0x00002b8a88204000)
libhdf5.so.310 => /home/keshav/.conda/envs/arma12/lib/libhdf5.so.310 (0x00002b8a88280000)
libstdc++.so.6 => /home/keshav/.conda/envs/arma12/lib/libstdc++.so.6 (0x00002b8a886ac000)
libm.so.6 => /lib64/libm.so.6 (0x00002b8a888a7000)
libgcc_s.so.1 => /home/keshav/.conda/envs/arma12/lib/libgcc_s.so.1 (0x00002b8a88ba9000)
libc.so.6 => /lib64/libc.so.6 (0x00002b8a88bc4000)
libblas.so.3 => /home/keshav/.conda/envs/arma12/lib/./libblas.so.3 (0x00002b8a88f88000)
libarpack.so.2 => /home/keshav/.conda/envs/arma12/lib/./libarpack.so.2 (0x00002b8a8b14e000)
/lib64/ld-linux-x86-64.so.2 (0x0000563928b22000)
libcrypto.so.3 => /home/keshav/.conda/envs/arma12/lib/./libcrypto.so.3 (0x00002b8a8b19d000)
libcurl.so.4 => /home/keshav/.conda/envs/arma12/lib/./libcurl.so.4 (0x00002b8a8b6aa000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b8a8b75b000)
libsz.so.2 => /home/keshav/.conda/envs/arma12/lib/./libsz.so.2 (0x00002b8a8b977000)
libz.so.1 => /home/keshav/.conda/envs/arma12/lib/./libz.so.1 (0x00002b8a8b982000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b8a8b99d000)
librt.so.1 => /lib64/librt.so.1 (0x00002b8a8bba1000)
libgfortran.so.5 => /home/keshav/.conda/envs/arma12/lib/././libgfortran.so.5 (0x00002b8a8bdaa000)
libnghttp2.so.14 => /home/keshav/.conda/envs/arma12/lib/././libnghttp2.so.14 (0x00002b8a8bf55000)
libssh2.so.1 => /home/keshav/.conda/envs/arma12/lib/././libssh2.so.1 (0x00002b8a8bf83000)
libssl.so.3 => /home/keshav/.conda/envs/arma12/lib/././libssl.so.3 (0x00002b8a8bfc8000)
libgssapi_krb5.so.2 => /home/keshav/.conda/envs/arma12/lib/././libgssapi_krb5.so.2 (0x00002b8a8c06a000)
libzstd.so.1 => /home/keshav/.conda/envs/arma12/lib/././libzstd.so.1 (0x00002b8a8c0be000)
libquadmath.so.0 => /home/keshav/.conda/envs/arma12/lib/./././libquadmath.so.0 (0x00002b8a8c1d2000)
libkrb5.so.3 => /home/keshav/.conda/envs/arma12/lib/./././libkrb5.so.3 (0x00002b8a8c20c000)
libk5crypto.so.3 => /home/keshav/.conda/envs/arma12/lib/./././libk5crypto.so.3 (0x00002b8a8c2e2000)
libcom_err.so.3 => /home/keshav/.conda/envs/arma12/lib/./././libcom_err.so.3 (0x00002b8a8c2fa000)
libkrb5support.so.0 => /home/keshav/.conda/envs/arma12/lib/./././libkrb5support.so.0 (0x00002b8a8c301000)
libkeyutils.so.1 => /home/keshav/.conda/envs/arma12/lib/./././libkeyutils.so.1 (0x00002b8a8c30f000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00002b8a8c316000)
即所有库都是链接的。
但是当我通过
./a.out
执行文件时,输出是
Hello world
ARMA version: 12.6.4 (Cortisol Retox)
1.0000 1.0000
1.0000 1.0000
即它正确打印
A
矩阵,但代码无限期停止(至少 5 分钟)。按 Ctrl-C
终止时,ls
显示未创建 hdf5 文件,而是在每次运行后创建 A.hdf5.tmp_*
文件。
注意:我的 CentOS 支持 anaconda 版本
2021.11
和我正在使用的 conda 版本 4.10.3
。由于GLIBC
版本,任何更高版本的anaconda都无法安装。
我期待一个简单的 hdf5 文件。如果
A.save(hdf5_name("A.hdf5", "A"));
被注释(或通过保存到 dat 文件替换,不停止),则此代码运行,但也没有 hdf5 文件。
我尝试了很多事情
arma-12.6.4
在本地计算机上运行代码。在这里,我没有使用 anaconda,犰狳是通过 cmake 安装的,hdf5 通过自制程序安装的。我在 Macbook Air M1 上运行了这个。 arma-12.6.4
默认找不到hdf5。 hdf5 位于 /opt/homebrew/Cellar/hdf5/1.14.2
,并且g++ -std=c++17 test.cpp -DARMA_USE_HDF5 -larmadillo -lhdf5 -lm -Wl,-rpath,/opt/homebrew/Cellar/hdf5/1.14.2/lib/ -I/opt/homebrew/Cellar/hdf5/1.14.2/include -L/opt/homebrew/Cellar/hdf5/1.14.2/lib
执行。但是
./a.out
给出 zsh: segmentation fault ./a.out
。
arma-11.4.4
在本地计算机上运行代码,该代码是在删除 arma-12.6.4
的所有实例后通过 cmake 安装的。这里没有问题。 g++ -O2 -std=c++17 -larmadillo test.cpp
给出了一个可执行文件,该文件立即终止了文件 A.hdf5
。arma-11.4.4
的新环境中安装了arma11
,但仍然存在同样的问题。可执行文件的链接方式与 arma12
类似,但与 arma11
库链接。没有 hdf5 文件,也没有看到终止。我不知道如何使
arma-12.6.4
与hdf5一起工作,无论是本地还是远程。虽然 arma-11.4.4
在本地运行,请帮助我了解如何使用 hdf5 在集群上运行它。其他一切(对角化和 arma 计算)在这两种情况下都运行良好。我猜 conda hdf5 安装有一些问题,还有 arma-12.6.4
版本。
文档指出:“可以通过在包含犰狳头之前定义
ARMA_USE_HDF5
来启用HDF5支持”和“与HDF5库的链接”。
因此请在您的程序中尝试以下操作:
#define ARMA_USE_HDF5
#include <armadillo>
然后将
-lhdf5
添加到编译器标志中。例如:
g++ program.cpp -o program -O2 -larmadillo -lhdf5
如果 HDF5 库不在常规系统路径中,您将需要使用
-L
标志指定路径。