2016-01-13 7 views
5

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

Однако, когда я компилируется без $ (ЛИЭС), MOSEK делает обнаружение 4 ядра:

Computer 
    Platform    : Linux/64-X86  
    Cores     : 4    

Код, который у меня есть в lo1.c, теперь не использует $ (LIBS), но мне понадобятся эти библиотеки позже, в lo1.c. Почему эти библиотеки влияют на поведение MOSEK?

спасибо.

+0

Вы пытались выяснить, какая * библиотека вызывает это? (Двоичный поиск по списку и т. Д.) –

+0

@EtanReisner Кажется, проблема связана с umfpack и библиотеками, которые приходят после него, но не в какой-либо конкретной. Мне пришлось удалить все, чтобы он работал. Даже разрешение «$ (LIBS) = -umfpack» только не сработало. –

+0

Так что, используя boost, хорошо, но с помощью любой из библиотек от umfpack до конца (даже по одному) это нарушает? Или это только umfpack? –

ответ

0

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

Смежные вопросы