以下は、よく知られている LAPACK 数値ライブラリの Fortran ZHEEVR ルーチンの C ラッパーです。
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" (パラメーター名はこの関数の Fortran 規則に従います) を対角化します。対角化された行列は同じ構造になるため、作業配列のサイズはほとんどの場合同じになると思います。私の質問は次のとおりです。
- alloc/free (「alloc_memory」は glibc の malloc の単純なラッパーです) 呼び出しを繰り返すと、パフォーマンスが低下する可能性がありますか?
- フリーの順番は関係ありますか?最後に割り当てられた配列を最初に解放するべきですか、それとも最後に解放すべきですか?