Предотвращение псевдонимов / типизирования с помощью fftw

Я думаю, у меня есть проблема с алиасами.
Я использую библиотеку fftw, которая поддерживает встроенные FFT. Это означает, что я вызываю функцию fftw, интерфейс которой похож на этот:

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

где fftw_complex является double[2], «На месте» означает, что input а также output массивы могут указывать на один и тот же физический массив. (Примечание: дает лучшую производительность.)

Теперь я использую это так:

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(),

Мои вопросы:

  • mRealValues а также mFourierValues указывают на один и тот же массив, но имеют разные типы. Поэтому у меня есть проблема с наложением алиасов DoSomethingReal() а также DoSomethingFourier()не так ли?
  • Хотя гкц (-Wall -Wextra) ни Intel, ни компилятор Microsoft до сих пор не предупредили меня ни о какой проблеме с псевдонимами, и программа работает нормально: может ли быть тихая проблема из-за псевдонимов?
  • Какие возможные решения для решения этой проблемы?

Для gcc следующие компиляции без предупреждения, но решает ли это проблему?

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

Примечание о приведении к std::complex: FFTW рекомендует, и, насколько я знаю, это определенное поведение в C ++ 11. В любом случае у меня есть static_assert на месте, чтобы проверить, что размеры соответствуют, и это не мой вопрос.
В любом случае, реальный код выглядит иначе, так как использование fftw более сложное (и, конечно, я очищаю выделенную память).

Также обратите внимание, я знаю о этот пост, но он не отвечает на мой вопрос.

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]