用fftw避免别名/类型惩罚

时间:2014-07-15 15:22:17

标签: c++ fftw strict-aliasing type-punning

我想我有一个锯齿问题。 我正在使用fftw-library,它支持就地FFT。这意味着,我称之为fftw-function,其界面类似于:

void fftwFunction(double* input, fftw_complex* output);

其中fftw_complexdouble[2]。 "就地"表示inputoutput数组可以指向同一个物理数组。 (注意:提供更好的性能。)

现在,我正在使用它:

class fftwClass
{
public:
  void AllocateMemory(size_t numBytes)
  {
    void* allocatedMemory = fftw_malloc(numBytes); // Aligned malloc
    mRealValues = reinterpret_cast<double*>(allocatedMemory);
    mFourierValues = reinterpret_cast< std::complex<double>* >(allocatedMemory);
  }

  void DoForwardFFT()
  {
    // Transformation from the real to the fourier-space.
    fftwFunction(mRealValues, mFourierValues);
  }

  void DoSomethingReal()
  {
    // Read and modify mRealValues
    // E.g.:
    mRealValues[0] = 5;
  }

  void DoSomethingFourier()
  {
    // Read and modify mFourierValues
    // E.g.:
    mFourierValues[0] = 5;
  }

private:
  double* mRealValues;
  std::complex<double>* mFourierValues;
};

通话顺序可以是:AllocateMemory()DoSomethingReal()DoForwardFFT()DoSomethingFourier()

我的问题:

  • mRealValuesmFourierValues指向同一个数组,但具有不同的类型。因此,我在DoSomethingReal()DoSomethingFourier()中遇到了别名/类型惩罚问题,我还没有?
  • 虽然gcc(-Wall -Wextra),英特尔和微软的编译器到目前为止都没有对任何别名问题发出警告,并且该程序运行正常:可能会出现一个无声问题混叠
  • 有哪些解决方案可以解决这个问题?

对于gcc,以下编译没有警告,但这是否解决了这个问题?

__attribute__((__may_alias__)) double* mRealValues;
__attribute__((__may_alias__)) std::complex<double>* mFourierValues;

关于转换为std::complex的注意事项:fftw推荐它,据我所知,这是C ++ 11中定义的行为。在任何情况下,我都有一个static_assert来检查大小是否匹配,这不是我的问题 在任何情况下,实际代码看起来都不同,因为fftw的使用更复杂(当然我清理已分配的内存)。

另请注意,我知道this帖子,但它没有回答我的问题。

0 个答案:

没有答案