【问题标题】:Allocate 3D Array for FFTW using fftw_malloc使用 fftw_malloc 为 FFTW 分配 3D 数组
【发布时间】:2022-01-02 06:25:11
【问题描述】:

我目前正在尝试提高我的多线程 FFTW 实现的性能。在 fftw3 的文档中,我读到为了获得最佳性能,应该使用 fftw_malloc 函数来分配 DFT 的输入和输出数据。

由于我正在处理大小为 256*256*256 的大型 3D 数组,因此我必须在堆上创建它们

const unsigned int RES = 256;

std::complex<double>(*V)[RES][RES];
V = new std::complex<double>[RES][RES][RES];

在初始化之后,我根据

为 3D DFT 变换创建多线程(就地)fftw_plans
int N_Threads = omp_get_max_threads();
fftw_init_threads();
fftw_plan_with_nthreads(N_Threads);

fftw_complex *input_V = reinterpret_cast<fftw_complex*>(opr.V);
fftw_plan FORWARD_V = fftw_plan_dft_3d(RES, RES, RES, input_V, input_V, FFTW_FORWARD, FFTW_MEASURE);
fftw_plan BACKWARD_V = fftw_plan_dft_3d(RES, RES, RES, input_V, input_V, FFTW_BACKWARD, FFTW_MEASURE);

我现在的问题是:如何改用fftw_malloc 创建这些计划?

在fftw3 documentation我只能找到

fftw_complex *in;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

我理解为一维示例。我是否必须投影我的 3D 数组,或者在这种情况下不可以/不建议使用 fftw_malloc

【问题讨论】:

    标签: c++ arrays 3d malloc fftw


    【解决方案1】:

    malloc 及其表亲(如您的fftw_malloc)分配单维缓冲区,因此在您的情况下,您想要创建一个足够大的缓冲区来保存您的三维数据:

    fftw_malloc(sizeof(fftw_complex) * RES * RES * RES);
    

    我读到,为了获得最佳性能,应该使用 fftw_malloc 函数

    每当你看到这样的陈述时,问“为什么”很重要。具体来说,非对齐分配会导致分页惩罚,因此这个malloc 变体试图分配对齐的内存。这不是魔法,您当然也可以自己做,例如使用aligned_alloc

    【讨论】:

    • 非常感谢您的回答。只是为了确保我正确理解这一点:使用fftw_malloc 命令,我将分配内存,但仍需要对其进行初始化。所以要创建计划,我还应该将我的V[RES][RES][RES] 数组更改为像fftw_malloc 一样的一维row-major format
    • 是的,您基本上将手动或使用辅助函数进行多维索引。
    猜你喜欢
    • 2020-10-23
    • 2012-03-16
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2017-01-12
    • 2013-07-09
    • 2015-12-06
    • 2017-01-18
    相关资源
    最近更新 更多