Связывание программы gsl c ++ с Intel MKL - PullRequest
0 голосов
/ 25 октября 2018

Я написал эту тестовую программу.

#include <gsl/gsl_matrix.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_cblas.h>
#include <gsl/gsl_blas.h>

int main () {
        gsl_vector* v = gsl_vector_calloc(5);
        gsl_matrix* m = gsl_matrix_calloc(5, 5);

        gsl_blas_dgemv(CblasNoTrans, 1.0, m, v, 0.0, v);
}

Я компилирую и связываю ее, используя следующую команду.

g++ -g -DMKL_ILP64 mkl_example.cpp -L$HOME/intel/mkl/lib/intel64/ -lgsl -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lm

Я получаю ошибку сегментации в строке, где я делаю gsl_blas_dgemv.Трассировка стека выглядит следующим образом:

#0  0x00007fffeeb5db0a in mkl_blas_mc3_xdgemv () from $HOME/intel/mkl/lib/intel64/libmkl_mc3.so
#1  0x00007ffff5b190be in mkl_blas_dgemv () from $HOME/intel/mkl/lib/intel64/libmkl_sequential.so
#2  0x00007ffff70e0b51 in mkl_blas__dgemv () from $HOME/intel/mkl/lib/intel64/libmkl_intel_ilp64.so
#3  0x00007ffff7108054 in cblas_dgemv () from $HOME/intel/mkl/lib/intel64/libmkl_intel_ilp64.so
#4  0x00007ffff7a0cfa4 in gsl_blas_dgemv () from /usr/lib64/libgsl.so.0
#5  0x000000000040086e in main () at mkl.cpp:10

С другой стороны, при связывании с открытым blas работает та же программа.Я что-то здесь упускаю?Как правильно использовать Intel MKL с gsl?

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Я столкнулся с этой проблемой несколько дней назад (GCC 8.2, IMKL 2019.2, GSL 1.15) и сумел исправить ошибку, переключившись с 64-битного интерфейса MKL (ILP) на 32-битный интерфейс (LP).Я подозреваю, что при переходе от вызова libgsl к вызову libmkl при использовании 64-битного интерфейса существует какое-то несоответствие размера параметра.По сути, вы бы изменили свою команду компиляции / ссылки с этой

g++ -g -DMKL_ILP64 mkl_example.cpp -L$HOME/intel/mkl/lib/intel64/ -lgsl -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lm

на эту

g++ -g mkl_example.cpp -L$HOME/intel/mkl/lib/intel64/ -lgsl -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lm

Я добавлю, что включение ответа -Wl,--no-as-needed из ответа Каве может также потребоваться, если выявно не связывают MKL статически.(Я должен был включить его, чтобы все необходимые файлы MKL .so отображались при запуске ldd в двоичном файле результата.) Однако я ожидаю, что вы получите сообщение об ошибке «символ не найден» во время выполнения вместоошибка сегментации, если это была единственная проблема.

0 голосов
/ 27 февраля 2019

libgsl принимает 32-битное целое число, но когда вы компилируете с опцией -DMKL_ILP64 и ссылаетесь на библиотеку ...- lmkl_intel_ ilp64 , в этом случае вы передаете 64-битное целое число.Это причина проблемы.

0 голосов
/ 26 октября 2018

Пожалуйста, подтвердите, что вы можете запустить программу следующим образом:

g++ -g mkl_example.cpp -L$HOME/intel/mkl/lib/intel64/ -lgsl -lmkl_intel -lmkl_sequential -lmkl_core -lm

Похоже, что вы связываете библиотеки Intel MKL с различными уровнями интерфейса.

Следующим шагом будет попытка сделать следующее:

g++ -g -DMKL_ILP64 mkl_example.cpp -L$HOME/intel/mkl/lib/intel64/ -Wl, --no-as-needed -lgsl -lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lm

Последний изменяет вашу команду компиляции для включения -Wl, --no-as-needed, что гарантирует, что все указанные библиотеки будут записаны в соответствии с требованиямиво время выполнения.

...