首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用fftw_malloc为FFTW分配三维阵列

利用fftw_malloc为FFTW分配三维阵列
EN

Stack Overflow用户
提问于 2021-11-23 18:51:29
回答 1查看 130关注 0票数 0

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

由于我处理的是大小为256*256*256的大型3D数组,所以我必须在堆中创建它们

代码语言:javascript
复制
const unsigned int RES = 256;

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

在初始化之后,我为3D DFT转换创建了多线程(就地) fftw_plans。

代码语言:javascript
复制
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);

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

在fftw3 文档中我只能找到

代码语言:javascript
复制
fftw_complex *in;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

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

EN

回答 1

Stack Overflow用户

发布于 2021-11-23 19:15:52

malloc及其表亲(如您的fftw_malloc)分配一维缓冲区,因此在您的示例中,您需要的是创建一个足够大的缓冲区,以容纳您的三维数据:

代码语言:javascript
复制
fftw_malloc(sizeof(fftw_complex) * RES * RES * RES);

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70086334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档