Код C, использующий blas, lapack и openmp, работающий с gcc 4.9, но выдающий ошибку времени выполнения с gcc 6
Я написал код на C.
Вы можете найти исходный код здесь.
Он использует библиотеки blas, lapack и openmp.
Я собрал библиотеки blas и lapack, следуя этим инструкциям.
Я использую эти флаги, чтобы сообщить компилятору библиотекам, на которые он должен ссылаться: -lblas -llapack -fopenmp
,
Я использовал gcc 4.9
и программа может работать правильно.
Недавно я обновил gcc до gcc 6, и он показывает много предупреждающих сообщений о неявном объявлении функций blas и lapack:
src/PSIRWLS-train.c:152:17: warning: implicit declaration of function 'dgemm_' [-Wimplicit-function-declaration]
dgemm_(&trans, &trans, &(dataset.l), &ncols, &size,&factorA, KSC, &(dataset.l), miZ, &size, &factor, miKSM, &(dataset.l));
И когда я запускаю приложение, появляется ошибка ошибки сегментации.
Я совершенно заблудился из-за различий в gcc 4.9 и gcc 6, знаете ли вы какие-либо объяснения по этому поводу?
2 ответа
Задача решена.
1 - Некоторые флаги по умолчанию отличаются в gcc 4 и 6. gcc 6 показывает предупреждения, когда вы не объявляете функции blas и lapack следующим образом:
внешняя пустота dgemm _ (...)
2 - это отпугнуло меня инициализацией одной переменной, которую нужно было инициализировать до 0. Я закодировал int i,j = 0; когда мне нужно было кодировать int i = 0, j = 0;
gcc 4 инициализировал i в 0 (и программа работала правильно), а gcc 6 - нет (создавая ошибку сегментации, потому что эти переменные должны были индексироваться)
Однажды у меня была похожая проблема, и кажется весьма вероятным, что в вашем коде есть неопределенное поведение (например, двойное освобождение), которое обрабатывается специфичным для компилятора образом. Возможно, это изменилось между gcc 4.9 и 6.0.
Трудно сказать, не зная вашего кода, но вы можете сами использовать ряд инструментов для отслеживания этой проблемы, например, GDB или особенно memcheck от valgrind (отлично сработал для меня):
valgrind --tool memcheck <your binary here>
Это будет сообщать о местах ошибок памяти и неопределенного поведения в вашем коде.