尝试编译 HPCC 基准时无法 link 到 BLAS/ATLAS
Cannot link to BLAS/ATLAS when trying to compile HPCC benchmark
我正在尝试在小型 RHEL 桌面上编译 HPCC 基准测试。在 linking 之前一切似乎都很好。我的 link 命令是
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
link 失败并出现几个错误,所有错误都与 link 用户找不到的 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
有一个 dgemv
HPCC
应该(我认为)能够插入,但它需要 ATL_dgemv
。但是 ATLAS 有 ATL_dgemv
。那么,为什么 link 人找不到 HPCC
所需的一切?
谢谢。
您的日志表明 libhpl.a
需要 dgemv_
符号,而 libcblas.a
和 libatlas.a
均未提供(我假设您的最后一条命令是 nm libatlas.a | grep dgemv
).
dgemv_
中的尾部下划线强烈表明它需要 Fortran BLAS(而不是 C BLAS)库,因此您只需将 libcblas.a
替换为 libblas.a
.
IIRC,另一种选择是调整 HPL 配置并指示它使用 cblas 而不是 (Fortran) BLAS。
我正在尝试在小型 RHEL 桌面上编译 HPCC 基准测试。在 linking 之前一切似乎都很好。我的 link 命令是
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
link 失败并出现几个错误,所有错误都与 link 用户找不到的 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
有一个 dgemv
HPCC
应该(我认为)能够插入,但它需要 ATL_dgemv
。但是 ATLAS 有 ATL_dgemv
。那么,为什么 link 人找不到 HPCC
所需的一切?
谢谢。
您的日志表明 libhpl.a
需要 dgemv_
符号,而 libcblas.a
和 libatlas.a
均未提供(我假设您的最后一条命令是 nm libatlas.a | grep dgemv
).
dgemv_
中的尾部下划线强烈表明它需要 Fortran BLAS(而不是 C BLAS)库,因此您只需将 libcblas.a
替换为 libblas.a
.
IIRC,另一种选择是调整 HPL 配置并指示它使用 cblas 而不是 (Fortran) BLAS。