Я сталкиваюсь со странной проблемой в следующем 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 для распараллеливания своего кода. В любом случае, решение было использовать OpenBLAS, скомпилированный с флагом «USE_OPENMP = 1».
Других решений пока нет …