Предположим, что я хочу использовать LAPACK для решения системы линейных уравнений в C (GCC). Я создал эту проблему следующим образом:Разница между функциями xxxxx_(), LAPACK_xxxxx() и LAPACKE_xxxxx()
/* Want to solve Ax=b */
int n = ...; // size
double *A = ...; // nxn matrix
double *b = ...; // length-n vector
int m = 1; // number of columns in b (needs to be in a variable)
double *pivot; // records pivoting
int info; // return value
Теперь я, кажется, можно использовать один из трех функций, чтобы решить эту проблему. Первый заключается в следующем:
dgesv_(&n, &m, A, &n, pivot, b, &n, &info);
Я был удивлен, увидев, что это не требует каких-либо #include
с, что кажется ... странно.
Вторая функция имеет почти такую же подпись, для префикса LAPACK_
, который я думаю, вызывает меньше двусмысленности и, возможно, является исключением менее подвержен ошибкам:
#include <lapack/lapacke.h>
LAPACK_dgesv(&n, &m, A, &n, pivot, b, &n, &info);
Обратите внимание, что это требует от меня, чтобы включить lapacke.h
.
Третья функция изменяет подпись несколько вернув info
и не принимать все аргументы в качестве указателей:
#include <lapack/lapacke.h>
info = LAPACKE_dgesv(LAPACK_COL_MAJOR, n, m, A, n, pivot, b, n);
Опять же, эта функция требует lapacke.h
. Это также требует ссылки на дополнительную библиотеку с -llapacke
. Все три функции нуждаются в -llapack
.
Я пытаюсь выяснить различия между этими функциями. Я сделал некоторые шныряли и я нашел следующие макросы в lapacke.h
и связанные файлы заголовков:
#define LAPACK_GLOBAL(name,NAME) name##_
#define LAPACK_dgesv LAPACK_GLOBAL(dgesv,DGESV)
Таким образом, кажется, что LAPACK_dgesv()
и dgesv_()
разные названия для той же самой функции. Однако оказалось, что LAPACKE_dgesv()
- это что-то другое, возможно, с другой реализацией, особенно учитывая тот факт, что ему нужна дополнительная библиотека.
Итак, мой вопрос: каковы различия между этими двумя функциями? В документации указано, что LAPACKE является интерфейсом C для LAPACK, но как насчет функции dgesv_()
? Очевидно, что я могу использовать его, как правило, без LAPACKE и без компиляции чего-либо в Fortran, так как это отличается?
Спасибо.
Update
Любопытно, что функция dgemm_()
(матричное умножение) не имеет никакого LAPACK_dgemm()
эквивалента. Что происходит?
DGEMM не является процедурой LAPACK. DGESV_ - символ Фортрана, принимающий одностороннее соглашение о подчеркивании. Для этого нужно использовать целое число правильного размера для Fortran. – Jeff