在 macos 和 cluster 上,armadillo 12.6.2 没有 hdf5 文件

问题描述 投票:0回答:1

我正在尝试将犰狳矩阵(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 文件。

我尝试了很多事情

  1. 使用
    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

  1. 使用
    arma-11.4.4
    在本地计算机上运行代码,该代码是在删除
    arma-12.6.4
    的所有实例后通过 cmake 安装的。这里没有问题。
    g++ -O2 -std=c++17 -larmadillo test.cpp
    给出了一个可执行文件,该文件立即终止了文件
    A.hdf5
  2. 在名为
    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
版本。

hdf5 armadillo
1个回答
0
投票

文档指出:“可以通过在包含犰狳头之前定义

ARMA_USE_HDF5
来启用HDF5支持”和“与HDF5库的链接”。

因此请在您的程序中尝试以下操作:

#define ARMA_USE_HDF5
#include <armadillo>

然后将

-lhdf5
添加到编译器标志中。例如:

g++ program.cpp -o program -O2 -larmadillo -lhdf5

如果 HDF5 库不在常规系统路径中,您将需要使用

-L
标志指定路径。

© www.soinside.com 2019 - 2024. All rights reserved.