Ниже моя оболочка C для подпрограммы Fortran ZHEEVR из известной числовой библиотеки LAPACK:
void zheevr(char jobz, char range, char uplo, int n, doublecomplex* a, int lda, double vl, double vu, int il, int iu, double abstol, double* w, doublecomplex* z, int ldz, int* info)
{
int m;
int lwork = -1;
int liwork = -1;
int lrwork = -1;
int* isuppz = alloc_memory(sizeof(int) * 2 * n);
zheevr_(&jobz, &range, &uplo, &n, a, &lda, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, isuppz, small_work_doublecomplex, &lwork, small_work_double, &lrwork, small_work_int, &liwork, &info);
lwork = (int) small_work_doublecomplex[0].real;
liwork = small_work_int[0];
lrwork = (int) small_work_double[0];
doublecomplex* work = alloc_memory(sizeof(doublecomplex) * lwork);
double* rwork = alloc_memory(sizeof(double) * lrwork);
int* iwork = alloc_memory(sizeof(int) * liwork);
zheevr_(&jobz, &range, &uplo, &n, a, &lda, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, isuppz, work, &lwork, rwork, &lrwork, iwork, &liwork, info);
free(iwork);
free(rwork);
free(work);
free(isuppz);
}
Эта функция вызывается в моем приложении сотни тысяч раз для диагонализации комплексной матрицы «a» (имена параметров соответствуют условию Фортрана для этой функции) для одного и того же размера матрицы. Я думаю, что размеры рабочих массивов в большинстве случаев будут одинаковыми, так как диагональные матрицы будут иметь одинаковую структуру. Мои вопросы:
- Могут ли повторяющиеся вызовы alloc / free ("alloc_memory" - простая оболочка вокруг malloc glibc) вызвать снижение производительности и насколько сильно?
- Имеет ли значение порядок свободных? Должен ли я освободить последний выделенный массив первым или последним?