我有一个串行程序,该程序使用ssyevr lapack例程对角矩阵。它运行正常,但有点慢。最近,我通过MacPorts下载了OpenMPI,目的是利用双核处理器(带有共享内存)来减少运行时间。
我的程序计算出一定数量的平均值,因此我想在一个进程中运行一半的集成,而在另一个进程中运行另一半。我需要在每个进程之间进行较小的通信(mpi_reduce和mpi_barrier在最后合并数据)。
我认为链接到-llapack可以与串行程序一起使用,但是发现使用mpifort编译程序时需要链接-lblas和-latlas。
如果我不为blas和atlas添加标志,则会出现以下错误:
Undefined symbols for architecture x86_64:
"_ATL_cGetNB", referenced from:
_ATL_ilaenv in liblapack.a(ATL_ilaenv.o)
"_ATL_dGetNB", referenced from:
_ATL_ilaenv in liblapack.a(ATL_ilaenv.o)
"_ATL_sGetNB", referenced from:
_ATL_ilaenv in liblapack.a(ATL_ilaenv.o)
"_ATL_zGetNB", referenced from:
_ATL_ilaenv in liblapack.a(ATL_ilaenv.o)
"_cblas_scopy", referenced from:
_ATL_slarfb in liblapack.a(ATL_slarfb.o)
"_cblas_sdot", referenced from:
_ATL_slarftFC.part.0 in liblapack.a(ATL_slarft.o)
_ATL_slarftFR.part.2 in liblapack.a(ATL_slarft.o)
_ATL_slarftBC.part.1 in liblapack.a(ATL_slarft.o)
_ATL_slarftBR.part.3 in liblapack.a(ATL_slarft.o)
_ATL_slarftFC in liblapack.a(ATL_slarft.o)
_ATL_slarftBC in liblapack.a(ATL_slarft.o)
_ATL_slarftFR in liblapack.a(ATL_slarft.o)
...
"_cblas_sgemm", referenced from:
_ATL_slarfb in liblapack.a(ATL_slarfb.o)
_ATL_slarft_blockFC in liblapack.a(ATL_slarft.o)
_ATL_slarft_blockFR in liblapack.a(ATL_slarft.o)
_ATL_slarft_blockBC in liblapack.a(ATL_slarft.o)
_ATL_slarft_blockBR in liblapack.a(ATL_slarft.o)
"_cblas_strmm", referenced from:
_ATL_slarfb in liblapack.a(ATL_slarfb.o)
_ATL_slarft_blockFC in liblapack.a(ATL_slarft.o)
_ATL_slarft_blockFR in liblapack.a(ATL_slarft.o)
_ATL_slarft_blockBC in liblapack.a(ATL_slarft.o)
_ATL_slarft_blockBR in liblapack.a(ATL_slarft.o)
"_isamax_", referenced from:
_sstein_ in liblapack.a(sstein.o)
"_lsame_", referenced from:
_ssyevr_ in liblapack.a(ssyevr.o)
_ilaenv_ in liblapack.a(ilaenv.o)
_slansy_ in liblapack.a(slansy.o)
_sormtr_ in liblapack.a(sormtr.o)
_sstebz_ in liblapack.a(sstebz.o)
_sstemr_ in liblapack.a(sstemr.o)
_ssytrd_ in liblapack.a(ssytrd.o)
...
"_saxpy_", referenced from:
_sstein_ in liblapack.a(sstein.o)
_slatrd_ in liblapack.a(slatrd.o)
_ssytd2_ in liblapack.a(ssytd2.o)
"_scopy_", referenced from:
_ssyevr_ in liblapack.a(ssyevr.o)
_sstein_ in liblapack.a(sstein.o)
_sstemr_ in liblapack.a(sstemr.o)
_slarre_ in liblapack.a(slarre.o)
_slarrv_ in liblapack.a(slarrv.o)
_slarrf_ in liblapack.a(slarrf.o)
"_sdot_", referenced from:
_sstein_ in liblapack.a(sstein.o)
_slatrd_ in liblapack.a(slatrd.o)
_ssytd2_ in liblapack.a(ssytd2.o)
"_sgemv_", referenced from:
_slatrd_ in liblapack.a(slatrd.o)
_slarf_ in liblapack.a(slarf.o)
"_sger_", referenced from:
_slarf_ in liblapack.a(slarf.o)
"_snrm2_", referenced from:
_sstein_ in liblapack.a(sstein.o)
_slarfg_ in liblapack.a(slarfg.o)
"_sscal_", referenced from:
_ssyevr_ in liblapack.a(ssyevr.o)
_sstein_ in liblapack.a(sstein.o)
_sstemr_ in liblapack.a(sstemr.o)
_slarrv_ in liblapack.a(slarrv.o)
_slatrd_ in liblapack.a(slatrd.o)
_slarfg_ in liblapack.a(slarfg.o)
"_sswap_", referenced from:
_ssyevr_ in liblapack.a(ssyevr.o)
_sstemr_ in liblapack.a(sstemr.o)
"_ssymv_", referenced from:
_slatrd_ in liblapack.a(slatrd.o)
_ssytd2_ in liblapack.a(ssytd2.o)
"_ssyr2_", referenced from:
_ssytd2_ in liblapack.a(ssytd2.o)
"_ssyr2k_", referenced from:
_ssytrd_ in liblapack.a(ssytrd.o)
"_xerbla_", referenced from:
_ssyevr_ in liblapack.a(ssyevr.o)
_sormtr_ in liblapack.a(sormtr.o)
_sstebz_ in liblapack.a(sstebz.o)
_sstein_ in liblapack.a(sstein.o)
_sstemr_ in liblapack.a(sstemr.o)
_ssterf_ in liblapack.a(ssterf.o)
_ssytrd_ in liblapack.a(ssytrd.o)
...
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
我之前多次遇到此错误。当您忘记链接库时,就会发生这种情况。错误显示为
"_This_routine" was called within the routine:
_That_routine in this_library.a(That_routine.o)
That_routine,在库this_library中找到,它调用了找不到的例程“ This_routine”。在BLAS或ATLAS中都可以找到所有缺少的例程。因此,使用它们的编译器标志将解决此问题。
通常,我会很高兴继续前进,但是尽管进行了这些更改,我的代码仍无法成功运行,并且我有充分的理由相信并行化版本没有错误。我已经在Sharcnet上成功运行了它(可能未使用同一版本!!)。
编辑::运行mpifort --showme
后,我得到
/opt/local/bin/gfortran-mp-7 -I/opt/local/include/openmpi-mp -Wl,-flat_namespace -Wl,-commons,use_dylibs -I/opt/local/lib/openmpi-mp -L/opt/local/lib -L/opt/local/lib/openmpi-mp -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -lmpi
我不太确定它会告诉我什么。