我正在尝试在小型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
. 但是阿特拉斯有ATL_dgemv
. 那么为什么链接器找不到HPCC
所需的一切呢?
谢谢。
您的日志表明libhpl.a
需要libcblas.a
也没有libatlas.a
提供的dgemv_
符号(我假设您的最后一个命令是nm libatlas.a | grep dgemv
(。
dgemv_
中的尾随下划线强烈表明它需要 Fortran BLAS(而不是 C BLAS(库,因此您可以简单地将libcblas.a
替换为libblas.a
。
IIRC,另一种选择是调整HPL配置并指示它使用cblas而不是(Fortran(BLAS。