我目前正在努力提高多线程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);我现在的问题是:如何使用来创建这些计划?
在fftw3 文档中我只能找到
fftw_complex *in;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);我理解为一个一维的例子。我是否必须投影我的3D数组,还是在这种情况下不可能/不建议使用fftw_malloc?
发布于 2021-11-23 19:15:52
malloc及其表亲(如您的fftw_malloc)分配一维缓冲区,因此在您的示例中,您需要的是创建一个足够大的缓冲区,以容纳您的三维数据:
fftw_malloc(sizeof(fftw_complex) * RES * RES * RES);我读到为了获得最好的性能,应该使用fftw_malloc函数。
每当你看到这样的陈述时,问“为什么”是很重要的。具体来说,非对齐分配会导致分页损失,因此这个malloc变量试图分配对齐内存。这不是魔术,你也可以自己做,例如使用异种。
https://stackoverflow.com/questions/70086334
复制相似问题