什么是更安全和有效的std :: complex或fftw_malloc?

时间:2016-11-01 12:53:10

标签: c++ std fftw

我正在使用一个带有fftw_malloc分配指针的库,但我的数据为std::complex<double>*

分配和释放内存最有效率是什么?

#include <fftw3.h>
#include <iostream>

int main()
{
    std::complex<double> * p1, *p2;
    std::vector< complex<double> > v;
    int N=10;

    //Allocating memory 
    p1 = (std::complex<double> *) fftw_malloc( sizeof(std::complex<double>) * N);
    p2 = new std::complex<double>[N];
    v.reserve(N);

    //Do some stuff
    manipulate(p1);
    manipulate(p2);
    manipulate(v.data());

    //Freeing memory 
    fftw_free(p1);
    delete[] p2;

}

鉴于应该避免施放,我们可以说p2p1更安全吗?

1 个答案:

答案 0 :(得分:0)

http://fftw.org/fftw3_doc/SIMD-alignment-and-fftw_005fmalloc.html#SIMD-alignment-and-fftw_005fmalloc中,您应该使用FFTW的分配例程,因为它们提供了特定的对齐方式。如果不使用它们的例程(或不保证对齐),则必须使用相同的缓冲区来创建和执行计划。使用它们的例程可以实现更好的矢量化,因此可以实现更快的代码。

一种解决方案是使用FFTW ++(http://fftwpp.sf.net),它包装了FFTW for C ++,并提供了内置对齐的Array类。否则,您可以创建一个对齐的分配器类,该类将为您std::vector提供正确的对齐方式。例如,

template<typename Tdata>
class fftw_allocator : public std::allocator<Tdata>
{
public:
    template <typename U>
    struct rebind { typedef fftw_allocator other; };
    Tdata* allocate(size_t n) { return (Tdata*) fftw_malloc(sizeof(Tdata) * n); }
    void deallocate(Tdata* data, std::size_t size) { fftw_free(data); }
};

std::vector<std::complex<double>, fftw_allocator<std::complex<double> > > f(n);

然后,向量f将使用FFTW的分配函数进行分配和释放内存。