【问题标题】:Libraries affecting other libraries in a Makefile影响 Makefile 中其他库的库
【发布时间】:2016-01-13 16:14:24
【问题描述】:

我在以下 Makefile 中遇到了一个奇怪的问题:

# Mosek path
MOSEKPATH = /autofs/fs1.ece/fs1.eecg.najm/b/b1/power_grid_code/mosek

# Include paths
INCPATHS = -I$(MOSEKPATH)/7/tools/platform/linux64x86/h -I/usr/include/suitesparse -I../include

# Libraries paths
LIBPATHS = -L$(MOSEKPATH)/7/tools/platform/linux64x86/bin

# Link libraries
LIBS = -lboost_timer-mt -lboost_system -lumfpack -lamd -lcolamd -lcholmod -lccolamd -lcamd -lbtf -lcsparse -lcxsparse -lklu -lldl -lspqr -llapack -lblas
MOSEKLIB = -lmosek64
LDOPT = -Wl,-rpath-link,$(MOSEKPATH)/7/tools/platform/linux64x86/bin -Wl,-rpath,'/autofs/fs1.ece/fs1.eecg.najm/b/b1/power_grid_code/mosek/7/tools/platform/linux64x86/bin' -pthread -lc -lm

# Specify compiler
CC = g++-4.7 -m64

# Compiler flags
FLAGS = -O3 -Wall -g

lo1: lo1.c
    $(CC) $(FLAGS) -c $(INCPATHS)          -o lo1.o lo1.c
    $(CC) $(FLAGS) $(LIBPATHS) lo1.o $(LIBS) $(MOSEKLIB) $(LDOPT) -o lo1 

clean:
    rm -f lo1 *.o 

我从MOSEK 提供的示例中获得了大部分内容。 Makefile 工作正常,结果符合预期。问题是,我使用的 MOSEK 版本是多线程的(MOSEK 7.1)。 MOSEK 应该检测机器上的核心数量,并使用它们。当我按原样使用 Makefile 时,MOSEK 只检测到一个内核,并且只使用一个线程:

Computer
  Platform               : Linux/64-X86    
  Cores                  : 1              

但是,当我在没有 $(LIBS) 的情况下编译时,MOSEK 确实检测到 4 个内核:

Computer
  Platform               : Linux/64-X86    
  Cores                  : 4               

我在 lo1.c 中的代码暂时不使用 $(LIBS),但我稍后会在 lo1.c 中使用这些库。这些库是如何影响 MOSEK 的行为的?

谢谢。

【问题讨论】:

  • 您是否尝试找出 哪个 库导致此问题? (通过列表进行二分搜索等)
  • @EtanReisner 似乎问题出在 umfpack 和它之后的库,但不是任何特定的库。我必须将它们全部删除才能正常工作。即使只让 "$(LIBS) = -umfpack " 也没用。
  • 所以使用 boost 是可以的,但是使用从 umfpack 到最后的任何库(甚至一次一个)会破坏这个?还是只有 umfpack 会破坏它?
  • @EtanReisner 所以我尝试分别添加库,一次一个,似乎有问题的库是 umfpack、lapack 和 blas。
  • 看看这些图书馆是否有你可以询问的社区可能是有意义的?或者看看 MOSEK 是这样做的。这里的人可能对此有想法,但他们是否看到这个问题是真正的问题。我对这些作品一无所知,所以我真的无法再提供帮助了,抱歉。

标签: c++ c makefile mosek


【解决方案1】:

原来问题出在 BLAS 上。 SuiteSparse 中的一些库需要 BLAS,而服务器上的 BLAS 库会与 OpenMP 混淆,而 MOSEK 显然需要 OpenMP 来并行化其代码。无论如何,解决方案是使用 OpenBLAS,使用标志“USE_OPENMP=1”编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多