是否可以将共享内存用于 FFTW

is that possible to use shared memory for fftw?

本文关键字:内存 用于 FFTW 共享 是否      更新时间:2023-10-16

我有一个用傅里叶变换实现的数值计算问题。我正在使用 fftw 来实现 FFT,但被 FFT 处理的信号很奇怪。一半的信号来自一个阵列,另一半来自其他阵列。在当前代码中,我只是复制数据

#include <iostream>
#include <vector>
#include <complex>
#include <fftw3.h>
using namespace std;
void main(void)
{
  std::vector< std::complex<double> > V1(4);
  std::vector< std::complex<double> > V2(4);
  std::vector< std::complex<double> > V(8);
  for (int i=0; i<4; i++) V[i] = V1[i] = std::complex<double>(i, i);
  for (int i=0; i<4; i++) V[i+4] = V2[i] = std::complex<double>(i+4, i+4);
  fftw_complex* in = reinterpret_cast<fftw_complex*>(&V[0]);
  fftw_plan plan = fftw_plan_dft_1d(8, in, in, FFTW_FORWARD, FFTW_MEASURE);
  fftw_execute(plan);
}

这段代码效果很好。但是我希望让大数组引用 V1 和 V2 而不是复制数据。我尝试以下代码,但它不起作用,它说输入数组是**(双指针?

std::vector< std::complex<double> > V1(4);
std::vector< std::complex<double> > V2(4);
fftw_complex *in[8];
for (int i=0; i<4; i++) in[i] = reinterpret_cast<fftw_complex*>(&V1[i]);
for (int i=0; i<4; i++) in[i+4] = reinterpret_cast<fftw_complex*>(&V2[i]);
for (int i=0; i<4; i++) V1[i] = std::complex<double>(i, i);
for (int i=0; i<4; i++) V2[i] = std::complex<double>(i+4, i+4);
fftw_plan plan = fftw_plan_dft_1d(8, in, in, FFTW_FORWARD, FFTW_MEASURE);
fftw_execute(plan);
无论如何,这是

将"引用"数组作为 fftw 的输入吗?2d数组会发生什么,是否可以让2d-fftw的输入数组引用两个单独的2d数组?

如果我理解正确,您想采用两个单独的矢量对象:

vector<fftw_complex> V1, V2;

并将它们各自的内容组合成另一个

vector<fftw_complex> V;

没有任何复制。这是不可能的,因为V1V2一起占用的内存不是连续的。然而,V占用的内存(与任何vector一样)必须是连续的。如果你想避免在你给出的示例中复制,你可以通过使用指针来实现,如下所示:

void main(void)
{
    std::complex<double>* V1;
    std::complex<double>* V2;
    std::vector< std::complex<double> > V(8);
    V1=&V[0];V2=&V[4];
    for (int i=0; i<4; i++) V1[i] = std::complex<double>(i, i);
    for (int i=0; i<4; i++) V2[i] = std::complex<double>(i+4, i+4);
    fftw_complex* in = reinterpret_cast<fftw_complex*>(&V[0]);
    fftw_plan plan = fftw_plan_dft_1d(8, in, in, FFTW_FORWARD, FFTW_MEASURE);
    fftw_execute(plan);
 }

当然,这在您的程序中可能是可行的,也可能是不可行的。您的第二个代码段有一个主要问题:

fftw_complex *in[8];
定义一个由 8

个指向复数的指针组成的数组,而不是一个由 8 个复数组成的数组,因此它不适合作为fftw_plan_dft_1d的输入,即使它这样做了,结果也毫无意义,因为你给它提供一系列内存地址而不是你的数据。