【问题标题】:Can FFTW use an alternate user supplied malloc and free?FFTW 可以使用备用用户提供的 malloc 和 free 吗?
【发布时间】:2016-01-12 23:50:02
【问题描述】:

我的工作环境需要对 malloc() 和 free() 使用替代的类似工作的调用。我想调用 FFTW,但是如果 FFTW 内部调用 malloc() 和 free() 出于自己的目的,它会搞砸我所在的内存管理环境,所以我需要一种方法来告诉 FFTW 使用备用我提供而不是 malloc 和 free 的函数。我怎么做?

【问题讨论】:

  • 你想使用什么分配器?其中许多可以通过 LD_PRELOAD 激活。
  • MATLAB 的 mxMalloc / mxFree。此代码需要能够编译为独立的可执行文件和 MATLAB MEX 库。我希望它在两种情况之间尽可能地运行相同。我需要独立的 FFTW;我更喜欢将它用于 MATLAB MEX 以及代码的一致性和简单性。

标签: malloc free fftw


【解决方案1】:

我当然希望你的底层 mex 编译器是 gcc / GNU binutils。如果没有,您可能需要更改 mex 编译器,以便它是。这个答案非常特定于 GNU ld...

将以下内容添加到使用 mexFunction 编译的代码中:

void *
__wrap_malloc(size_t size)
{
    return mxMalloc(size);
}


void
__wrap_free(void *ptr)
{
    return mxFree(ptr);
}


void *
__wrap_memalign(size_t alignment __attribute__((__unused__)), size_t size)
{
    return mxMalloc(size);
}

顺便说一句,我通过执行 objdump -T libfftw3.so 并查找堆管理函数的 *UND* 条目来获得要包装的三个函数列表。只有他们三个出现了。

现在,将以下内容添加到您的 mex 命令行:

CLIBS='-Wl,--wrap=malloc,--wrap=free,--wrap=memalign,-Bstatic,-lfftw3,-Bdynamic $CLIBS'

通过强制链接器静态引入 libfftw3,它可以使用重定向到 MATLAB 的堆管理函数的自定义包装器来包装指定的堆调用。

如果你想花哨的话,你可以在 memalign() 包装器中手动强制对齐,并返回一个正确对齐的指针,但是你必须跟踪每个分配以在 free() 时间撤消指针更改.我只是天真地假设 MATLAB 的分配器将返回已经为零模最大有用对齐的指针,认为 MATLAB 对此的需求类似于 FFTW。

另外,请记住在退出 mexFunction 的过程中销毁所有计划和 fftw_cleanup()。 MATLAB 将在您的 mexFunction 返回时强制释放您的 mexFunction(或您的 mexFunction 调用的 FFTW)分配的任何内容,除非您明确地 mexMakeMemoryPersistent() 它。

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 2017-06-14
    • 2010-11-12
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2016-12-29
    • 2012-01-17
    相关资源
    最近更新 更多