C语言 在尝试编译HPCC基准时无法链接到BLAS/ATLAS



我正在尝试在小型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。

最新更新