Библиотеки, влияющие на другие библиотеки в Makefile

Я сталкиваюсь со странной проблемой в следующем 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?

Спасибо.

5

Решение

Оказывается, проблема была с BLAS. Для некоторых библиотек из SuiteSparse требуется BLAS, а библиотеки BLAS на сервере портятся с OpenMP, который, по-видимому, требуется MOSEK для распараллеливания своего кода. В любом случае, решение было использовать OpenBLAS, скомпилированный с флагом «USE_OPENMP = 1».

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]