我在以下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的行为?

谢谢你。

最佳答案

事实证明,问题出在BLAS。 SuiteSparse中的某些库需要BLAS,并且服务器上的BLAS库与OpenMP混为一谈,而MOSEK显然要求OpenMP对其代码进行并行化。无论如何,解决方案是使用带有标志“USE_OPENMP = 1”编译的OpenBLAS。

关于c++ - 影响Makefile中其他库的库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34771607/

10-13 07:40