我正在尝试在一个小型RHEL桌面上编译HPCC基准测试。在链接之前,一切看起来都很好。我的链接命令是
mpicc -DAdd_ -DF77_INTEGER=int -DStringSunStyle -I../../../include \
-I../../../include/myarch -I/path/to/my/ATLAS_build/include \
-I/usr/include/openmpi-x86_64 -fomit-frame-pointer -O3 -funroll-loops \
-W -Wall -lm -o ../../../../hpcc ../../../lib/bugzilla/libhpl.a \
/path/to/my/ATLAS_build/lib/libcblas.a \
/path/to/my/ATLAS_build/lib/libatlas.a -L/usr/lib64/openmpi/lib链接失败并出现几个错误,所有这些错误都与链接器找不到的BLAS/ATLAS对象有关。其中有几个是:
../../../lib/myarch/libhpl.a(HPL_dcopy.o): In function `HPL_dcopy':
HPL_dcopy.c:(.text+0x1e): undefined reference to `dcopy_'
../../../lib/myarch/libhpl.a(HPL_daxpy.o): In function `HPL_daxpy':
HPL_daxpy.c:(.text+0x2f): undefined reference to `daxpy_'
../../../lib/myarch/libhpl.a(HPL_dscal.o): In function `HPL_dscal':
HPL_dscal.c:(.text+0x22): undefined reference to `dscal_'
../../../lib/myarch/libhpl.a(HPL_idamax.o): In function `HPL_idamax':
HPL_idamax.c:(.text+0x1a): undefined reference to `idamax_'
../../../lib/myarch/libhpl.a(HPL_dgemv.o): In function `HPL_dgemv':
HPL_dgemv.c:(.text+0xba): undefined reference to `dgemv_'
HPL_dgemv.c:(.text+0x136): undefined reference to `dgemv_'这是我真的不明白的地方。以dgemv为例。libhpl.a确实调用了它:
>$ nm libhpl.a | grep dgemv
HPL_dgemv.o:
U dgemv_现在,libcblas.a有一个对它的引用,但需要ATLAS中的版本:
>$ nm libcblas.a | grep dgemv
cblas_dgemv.o:
U ATL_dgemv最后,ATLAS有ATL_dgemv吗?
ATL_dgemv.o:
0000000000000000 T ATL_dgemv所以,是的,它确实是这样的。所以CBLAS有一个HPCC应该(我认为)能够插入的dgemv,但是它需要ATL_dgemv。但是ATLAS有ATL_dgemv。那么,为什么链接器无法找到HPCC所需的所有内容呢
谢谢。
发布于 2019-10-08 08:10:47
您的日志表明libhpl.a需要libcblas.a和libatlas.a都没有提供的dgemv_符号(我假设您的最后一个命令是nm libatlas.a | grep dgemv)。
dgemv_中的尾随下划线强烈表明它需要Fortran BLAS(而不是C BLAS)库,因此您可以简单地用libblas.a替换libcblas.a。
IIRC,另一个选项是调整HPL配置,并指示它使用cblas而不是(Fortran) BLAS。
https://stackoverflow.com/questions/58276422
复制相似问题