搞了快两天,终于在本机上运行了HPCC 性能测试。现在就把HPCC的安装方法给大家分享一下。
1. 改写编译脚本
HPCC 官方给出的运行指导实在是太简单了,根本就没有多大的实用价值。这里还要给大家说一点的就是运行HPCC一定需要MPI,但是没有BLAS也是可以的,或者根据我的经验,使用BLAS反而没法运行HPCC。首先选择一个编译模板,将这个模板改写成我们需要的编译脚本。我选择的编译模板是“Make.Linux_PII_CBLAS”(编译模板位于hpcc-1.5.0/hpcc-1.5.0/hpl/setup下),根据本机的情况,改写如下:
MPdir = /home/andywang/mpich-install //本机安装mpi的位置
MPinc = -I$(MPdir)/include //mpi头文件所在的位置
MPlib = $(MPdir)/lib/libmpi.a //mpi静态库所在的位置
LAdir = $(HOME)/clapack/lib //blas所在的位置
LAinc = //由于HPCC中没有用到blas的头文件,所以这个地方可以空着
LAlib = $(LAdir)/blas_LINUX.a $(LAdir)/lapack_LINUX.a $(LAdir)/libf2c.a
LINKER = $(CC)
以上结果还不是最终结果,运行前先把名字改一下“Make.Linux”
回到主文件夹下执行命令“make arch=Linux”
结果错误如下:
/usr/bin/gcc -DHPL_CALL_CBLAS -I../../../include -I../../../include/Linux -I/home/andywang/mpich-install/include -fomit-frame-pointer -O0 -funroll-loops -o ../../../../hpcc ../../../lib/Linux/libhpl.a /home/andywang/clapack/lib/blas_LINUX.a /home/andywang/clapack/lib/lapack_LINUX.a /home/andywang/clapack/lib/libf2c.a /home/andywang/mpich-install/lib/libmpi.a -lm /home/andywang/mpich-install/lib/libmpi.a(lib_libmpi_la-initthread.o):在函数‘MPIR_Init_thread’中: initthread.c:(.text+0xa3):对‘pthread_mutexattr_init’未定义的引用 initthread.c:(.text+0xb0):对‘pthread_mutexattr_settype’未定义的引用 initthread.c:(.text+0xd7):对‘pthread_mutexattr_init’未定义的引用 initthread.c:(.text+0xe4):对‘pthread_mutexattr_settype’未定义的引用 /home/andywang/mpich-install/lib/libmpi.a(lib_libmpi_la-mpit_initthread.o):在函数‘PMPI_T_init_thread’中: mpit_initthread.c:(.text+0x1d6):对‘pthread_mutexattr_init’未定义的引用 mpit_initthread.c:(.text+0x1e3):对‘pthread_mutexattr_settype’未定义的引用 /home/andywang/mpich-install/lib/libmpi.a(lib_libmpi_la-errutil.o):在函数‘MPIR_Err_init’中: errutil.c:(.text+0x290):对‘pthread_mutexattr_init’未定义的引用 errutil.c:(.text+0x29d):对‘pthread_mutexattr_settype’未定义的引用 /home/andywang/mpich-install/lib/libmpi.a(lib_libmpi_la-async.o):在函数‘MPIR_Init_async_thread’中: async.c:(.text+0x353):对‘pthread_mutexattr_init’未定义的引用 async.c:(.text+0x360):对‘pthread_mutexattr_settype’未定义的引用 /home/andywang/mpich-install/lib/libmpi.a(lib_libmpi_la-mpiu_thread_posix.o):在函数‘MPIU_Thread_create’中: mpiu_thread_posix.c:(.text+0x8d):对‘pthread_create’未定义的引用 /home/andywang/mpich-install/lib/libmpi.a(lib_libmpi_la-ch3_init.o):在函数‘MPIDI_CH3I_Shm_supported’中: ch3_init.c:(.text+0x19):对‘pthread_mutexattr_init’未定义的引用 ch3_init.c:(.text+0x26):对‘pthread_mutexattr_setpshared’未定义的引用 ch3_init.c:(.text+0x30):对‘pthread_mutexattr_destroy’未定义的引用 /home/andywang/mpich-install/lib/libmpi.a(lib_libmpi_la-ch3_win_fns.o):在函数‘MPIDI_CH3I_Win_allocate_shm’中: ch3_win_fns.c:(.text+0x2c95):对‘pthread_mutexattr_init’未定义的引用 ch3_win_fns.c:(.text+0x2cab):对‘pthread_mutexattr_setpshared’未定义的引用 ch3_win_fns.c:(.text+0x2cd7):对‘pthread_mutexattr_destroy’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdtest.o):在函数‘HPL_pdtest’中: HPL_pdtest.c:(.text+0xa29):对‘cblas_’未定义的引用 HPL_pdtest.c:(.text+0xb7f):对‘cblas_dgemv’未定义的引用 HPL_pdtest.c:(.text+0xbe2):对‘cblas_dgemv’未定义的引用 ../../../lib/Linux/libhpl.a(pdmatcmp.o):在函数‘pdmatcmp’中: pdmatcmp.c:(.text+0x15e):对‘cblas_idamax’未定义的引用 pdmatcmp.c:(.text+0x214):对‘cblas_daxpy’未定义的引用 pdmatcmp.c:(.text+0x244):对‘cblas_idamax’未定义的引用 ../../../lib/Linux/libhpl.a(pdtrans.o):在函数‘dmv2mx_’中: pdtrans.c:(.text+0x14e3):对‘cblas_dcopy’未定义的引用 pdtrans.c:(.text+0x1625):对‘cblas_dcopy’未定义的引用 pdtrans.c:(.text+0x1cf7):对‘cblas_daxpy’未定义的引用 pdtrans.c:(.text+0x1e41):对‘cblas_daxpy’未定义的引用 ../../../lib/Linux/libhpl.a(pdtrans.o):在函数‘pdtrans’中: pdtrans.c:(.text+0x2b34):对‘cblas_dscal’未定义的引用 ../../../lib/Linux/libhpl.a(tstdgemm.o):在函数‘HPCC_TestDGEMM’中: tstdgemm.c:(.text+0x61f):对‘cblas_dgemm’未定义的引用 tstdgemm.c:(.text+0x789):对‘cblas_dgemv’未定义的引用 tstdgemm.c:(.text+0x7d5):对‘cblas_dgemv’未定义的引用 tstdgemm.c:(.text+0x830):对‘cblas_dgemv’未定义的引用 tstdgemm.c:(.text+0x8b0):对‘cblas_dgemv’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdlange.o):在函数‘HPL_pdlange’中: HPL_pdlange.c:(.text+0x916):对‘cblas_idamax’未定义的引用 HPL_pdlange.c:(.text+0xb7d):对‘cblas_idamax’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdpancrN.o):在函数‘HPL_pdpancrN’中: HPL_pdpancrN.c:(.text+0x20b):对‘cblas_dgemv’未定义的引用 HPL_pdpancrN.c:(.text+0x260):对‘cblas_dcopy’未定义的引用 HPL_pdpancrN.c:(.text+0x2cf):对‘cblas_dscal’未定义的引用 HPL_pdpancrN.c:(.text+0x394):对‘cblas_dgemv’未定义的引用 HPL_pdpancrN.c:(.text+0x49e):对‘cblas_dscal’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdpancrT.o):在函数‘HPL_pdpancrT’中: HPL_pdpancrT.c:(.text+0x208):对‘cblas_dgemv’未定义的引用 HPL_pdpancrT.c:(.text+0x260):对‘cblas_dcopy’未定义的引用 HPL_pdpancrT.c:(.text+0x2cf):对‘cblas_dscal’未定义的引用 HPL_pdpancrT.c:(.text+0x394):对‘cblas_dgemv’未定义的引用 HPL_pdpancrT.c:(.text+0x49e):对‘cblas_dscal’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdpanllN.o):在函数‘HPL_pdpanllN’中: HPL_pdpanllN.c:(.text+0x1c2):对‘cblas_dtrsv’未定义的引用 HPL_pdpanllN.c:(.text+0x235):对‘cblas_dscal’未定义的引用 HPL_pdpanllN.c:(.text+0x2ce):对‘cblas_dgemv’未定义的引用 HPL_pdpanllN.c:(.text+0x348):对‘cblas_dcopy’未定义的引用 HPL_pdpanllN.c:(.text+0x41f):对‘cblas_dscal’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdpanllT.o):在函数‘HPL_pdpanllT’中: HPL_pdpanllT.c:(.text+0x1c5):对‘cblas_dtrsv’未定义的引用 HPL_pdpanllT.c:(.text+0x238):对‘cblas_dscal’未定义的引用 HPL_pdpanllT.c:(.text+0x2d4):对‘cblas_dgemv’未定义的引用 HPL_pdpanllT.c:(.text+0x34b):对‘cblas_dcopy’未定义的引用 HPL_pdpanllT.c:(.text+0x422):对‘cblas_dscal’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdpanrlN.o):在函数‘HPL_pdpanrlN’中: HPL_pdpanrlN.c:(.text+0x19f):对‘cblas_dscal’未定义的引用 HPL_pdpanrlN.c:(.text+0x1ee):对‘cblas_daxpy’未定义的引用 HPL_pdpanrlN.c:(.text+0x287):对‘cblas_dger’未定义的引用 HPL_pdpanrlN.c:(.text+0x369):对‘cblas_dscal’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdpanrlT.o):在函数‘HPL_pdpanrlT’中: HPL_pdpanrlT.c:(.text+0x1bc):对‘cblas_dscal’未定义的引用 HPL_pdpanrlT.c:(.text+0x21d):对‘cblas_daxpy’未定义的引用 HPL_pdpanrlT.c:(.text+0x2cf):对‘cblas_dger’未定义的引用 HPL_pdpanrlT.c:(.text+0x3b1):对‘cblas_dscal’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdrpanllN.o):在函数‘HPL_pdrpanllN’中: HPL_pdrpanllN.c:(.text+0x219):对‘cblas_dtrsm’未定义的引用 HPL_pdrpanllN.c:(.text+0x2ce):对‘cblas_dgemm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdrpanllT.o):在函数‘HPL_pdrpanllT’中: HPL_pdrpanllT.c:(.text+0x20e):对‘cblas_dtrsm’未定义的引用 HPL_pdrpanllT.c:(.text+0x2b8):对‘cblas_dgemm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdrpancrN.o):在函数‘HPL_pdrpancrN’中: HPL_pdrpancrN.c:(.text+0x25f):对‘cblas_dgemm’未定义的引用 HPL_pdrpancrN.c:(.text+0x34b):对‘cblas_dgemm’未定义的引用 HPL_pdrpancrN.c:(.text+0x3e9):对‘cblas_dtrsm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdrpancrT.o):在函数‘HPL_pdrpancrT’中: HPL_pdrpancrT.c:(.text+0x254):对‘cblas_dgemm’未定义的引用 HPL_pdrpancrT.c:(.text+0x340):对‘cblas_dgemm’未定义的引用 HPL_pdrpancrT.c:(.text+0x3de):对‘cblas_dtrsm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdrpanrlN.o):在函数‘HPL_pdrpanrlN’中: HPL_pdrpanrlN.c:(.text+0x268):对‘cblas_dtrsm’未定义的引用 HPL_pdrpanrlN.c:(.text+0x35f):对‘cblas_dgemm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdrpanrlT.o):在函数‘HPL_pdrpanrlT’中: HPL_pdrpanrlT.c:(.text+0x268):对‘cblas_dtrsm’未定义的引用 HPL_pdrpanrlT.c:(.text+0x35f):对‘cblas_dgemm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdupdateNN.o):在函数‘HPL_pdupdateNN’中: HPL_pdupdateNN.c:(.text+0x261):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateNN.c:(.text+0x2d2):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNN.c:(.text+0x3a3):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateNN.c:(.text+0x414):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNN.c:(.text+0x5b9):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateNN.c:(.text+0x635):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNN.c:(.text+0x6bc):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNN.c:(.text+0x787):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateNN.c:(.text+0x803):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNN.c:(.text+0x88a):对‘cblas_dgemm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdupdateNT.o):在函数‘HPL_pdupdateNT’中: HPL_pdupdateNT.c:(.text+0x261):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateNT.c:(.text+0x2d2):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNT.c:(.text+0x3a3):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateNT.c:(.text+0x414):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNT.c:(.text+0x5b6):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateNT.c:(.text+0x632):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNT.c:(.text+0x6b9):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNT.c:(.text+0x776):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateNT.c:(.text+0x7f2):对‘cblas_dgemm’未定义的引用 HPL_pdupdateNT.c:(.text+0x879):对‘cblas_dgemm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdupdateTN.o):在函数‘HPL_pdupdateTN’中: HPL_pdupdateTN.c:(.text+0x261):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateTN.c:(.text+0x2d2):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTN.c:(.text+0x3a3):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateTN.c:(.text+0x414):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTN.c:(.text+0x5b9):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateTN.c:(.text+0x635):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTN.c:(.text+0x6bc):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTN.c:(.text+0x787):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateTN.c:(.text+0x803):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTN.c:(.text+0x88a):对‘cblas_dgemm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdupdateTT.o):在函数‘HPL_pdupdateTT’中: HPL_pdupdateTT.c:(.text+0x261):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateTT.c:(.text+0x2d2):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTT.c:(.text+0x3a3):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateTT.c:(.text+0x414):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTT.c:(.text+0x5b6):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateTT.c:(.text+0x632):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTT.c:(.text+0x6b9):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTT.c:(.text+0x776):对‘cblas_dtrsm’未定义的引用 HPL_pdupdateTT.c:(.text+0x7f2):对‘cblas_dgemm’未定义的引用 HPL_pdupdateTT.c:(.text+0x879):对‘cblas_dgemm’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_dlocmax.o):在函数‘HPL_dlocmax’中: HPL_dlocmax.c:(.text+0xaf):对‘cblas_idamax’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdmxswp.o):在函数‘HPL_pdmxswp’中: HPL_pdmxswp.c:(.text+0x1aa):对‘cblas_dcopy’未定义的引用 HPL_pdmxswp.c:(.text+0x1ec):对‘cblas_dcopy’未定义的引用 HPL_pdmxswp.c:(.text+0x4fc):对‘cblas_dcopy’未定义的引用 HPL_pdmxswp.c:(.text+0x709):对‘cblas_dcopy’未定义的引用 HPL_pdmxswp.c:(.text+0x750):对‘cblas_dcopy’未定义的引用 ../../../lib/Linux/libhpl.a(HPL_pdtrsv.o):在函数‘HPL_pdtrsv’中: HPL_pdtrsv.c:(.text+0xf5c):对‘cblas_dtrsv’未定义的引用 HPL_pdtrsv.c:(.text+0xf9b):对‘cblas_dcopy’未定义的引用 HPL_pdtrsv.c:(.text+0x1551):对‘cblas_dgemv’未定义的引用 HPL_pdtrsv.c:(.text+0x1691):对‘cblas_daxpy’未定义的引用 HPL_pdtrsv.c:(.text+0x1712):对‘cblas_dtrsv’未定义的引用 HPL_pdtrsv.c:(.text+0x1762):对‘cblas_dcopy’未定义的引用 HPL_pdtrsv.c:(.text+0x17d1):对‘cblas_dgemv’未定义的引用 collect2: error: ld returned 1 exit status Makefile.hpcc:50: recipe for target '../../../../hpcc' failed make[1]: *** [../../../../hpcc] Error 1 make[1]: Leaving directory '/home/andywang/hpcc-1.5.0/hpcc-1.5.0/hpl/lib/arch/build' Makefile:7: recipe for target 'all' failed make: *** [all] Error 2
再运行以下,有关于pthread的错误已经得到解决。再来看看有关于cblas的错误,这些未定义的引用都是来自于blas,看看blas_LINUX.a中的相关符号,
nm blas_LINUX.a | grep idamax idamax.o: 0000000000000000 T f2c_idamax
BLLIB = /home/andywang/clapack/lib/blas_LINUX.a //本机上安装blas的位置 CBLIB = ../lib/cblas_$(PLAT).a //生成的cblas的位置与名称
LAlib = $(LAdir)/cblas_LINUX.a $(LAdir)/blas_LINUX.a $(LAdir)/lapack_LINUX.a $(LAdir)/libf2c.a
结果又出现如下错误:
make arch=Linux mkdir hpl/lib/Linux mkdir: 无法创建目录"hpl/lib/Linux": 文件已存在 Makefile:7: recipe for target 'all' failed make: [all] Error 1 (ignored) ( cd hpl/lib/arch/build ; make arch=Linux -f Makefile.hpcc ) make[1]: Entering directory '/home/andywang/hpcc-1.5.0/hpcc-1.5.0/hpl/lib/arch/build' /usr/bin/gcc -DHPL_CALL_CBLAS -I../../../include -I../../../include/Linux -I/home/andywang/mpich-install/include -fomit-frame-pointer -O0 -funroll-loops -o ../../../../hpcc ../../../lib/Linux/libhpl.a /home/andywang/clapack/lib/cblas_LINUX.a /home/andywang/clapack/lib/blas_LINUX.a /home/andywang/clapack/lib/lapack_LINUX.a /home/andywang/clapack/lib/libf2c.a /home/andywang/mpich-install/lib/libmpi.a -lpthread -lm /home/andywang/clapack/lib/cblas_LINUX.a(cblas_dscal.o):在函数‘cblas_dscal’中: cblas_dscal.c:(.text+0x22):对‘dscal_’未定义的引用 /home/andywang/clapack/lib/cblas_LINUX.a(cblas_dcopy.o):在函数‘cblas_dcopy’中: cblas_dcopy.c:(.text+0x21):对‘dcopy_’未定义的引用 /home/andywang/clapack/lib/cblas_LINUX.a(cblas_daxpy.o):在函数‘cblas_daxpy’中: cblas_daxpy.c:(.text+0x32):对‘daxpy_’未定义的引用 /home/andywang/clapack/lib/cblas_LINUX.a(idamaxsub.o):在函数‘idamaxsub_’中: idamaxsub.f:(.text+0x7):对‘idamax_’未定义的引用 /home/andywang/clapack/lib/cblas_LINUX.a(cblas_dgemv.o):在函数‘cblas_dgemv’中: cblas_dgemv.c:(.text+0x13e):对‘dgemv_’未定义的引用 cblas_dgemv.c:(.text+0x187):对‘dgemv_’未定义的引用 /home/andywang/clapack/lib/cblas_LINUX.a(cblas_dger.o):在函数‘cblas_dger’中: cblas_dger.c:(.text+0xa9):对‘dger_’未定义的引用 cblas_dger.c:(.text+0xe1):对‘dger_’未定义的引用 /home/andywang/clapack/lib/cblas_LINUX.a(cblas_dtrsv.o):在函数‘cblas_dtrsv’中: cblas_dtrsv.c:(.text+0x16e):对‘dtrsv_’未定义的引用 /home/andywang/clapack/lib/cblas_LINUX.a(cblas_dgemm.o):在函数‘cblas_dgemm’中: cblas_dgemm.c:(.text+0x134):对‘dgemm_’未定义的引用 cblas_dgemm.c:(.text+0x1c7):对‘dgemm_’未定义的引用 /home/andywang/clapack/lib/cblas_LINUX.a(cblas_dtrsm.o):在函数‘cblas_dtrsm’中: cblas_dtrsm.c:(.text+0x14d):对‘dtrsm_’未定义的引用 collect2: error: ld returned 1 exit status Makefile.hpcc:50: recipe for target '../../../../hpcc' failed make[1]: *** [../../../../hpcc] Error 1 make[1]: Leaving directory '/home/andywang/hpcc-1.5.0/hpcc-1.5.0/hpl/lib/arch/build' Makefile:7: recipe for target 'all' failed make: *** [all] Error 2
CC = gcc -DNO_BLAS_WRAP
如此就可以保持函数的本来形式。再次编译,又会出现一些错误(这些错误由于疏忽忘记记录了),解决这些问题后才算是将HPCC编译好,但编译好后在运行过程中还是会出现
** On entry to DGEMM , parameter number 8 had an illegal value