gpt4 book ai didi

c - glibc中重复内存分配的效率

转载 作者:太空宇宙 更新时间:2023-11-04 00:14:52 24 4
gpt4 key购买 nike

下面是我对来自著名的 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 约定)以获得相同的矩阵大小。我认为工作数组的大小在大多数情况下都是相同的,因为对角化矩阵的结构相同。我的问题是:

  1. 重复的 alloc/free(“alloc_memory”是 glibc 的 malloc 的简单包装)调用是否会损害性能,严重程度如何?
  2. free 的顺序重要吗?我应该先释放最后分配的数组,还是最后释放?

最佳答案

  • 你会使用 C99 吗? (答案:是的,您已经在使用 C99 符号 - 在需要时声明变量。)
  • 数组的大小是否合理(不是太大)?

如果两个答案都是"is",请考虑使用 VLA - 可变长度数组:

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[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[lwork];
double rwork[lrwork];
int iwork[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);
}

使用 VLA 的一个好处是,您无需做任何事情。

(未经测试的代码!)

关于c - glibc中重复内存分配的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/962181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com