Open MPI和gfortran需要不同的编译器标志吗?

时间:2018-08-21 22:52:43

标签: openmpi lapack blas compiler-flags atlas

我有一个串行程序,该程序使用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

我不太确定它会告诉我什么。

0 个答案:

没有答案