C++ 将R2R FFT从FFTW移植到CUFT
我正在尝试将一些代码从CPU移植到GPU,其中包括一些FFT。因此,在CPU代码上,使用C++ 将R2R FFT从FFTW移植到CUFT,c++,cuda,fft,fftw,cufft,C++,Cuda,Fft,Fftw,Cufft,我正在尝试将一些代码从CPU移植到GPU,其中包括一些FFT。因此,在CPU代码上,使用fftw\u plan\u many\u r2r分别对其实部和imag部分转换一些复杂数组。函数foo表示R2R转换例程,并为复杂数组的每个部分调用两次 void foo(vector_double &evg) { int nx = Dims[0], ny = Dims[1], nz = Dims[2]; const int nxny[] = {ny, nx};
fftw\u plan\u many\u r2r
分别对其实部和imag部分转换一些复杂数组。函数foo表示R2R转换例程,并为复杂数组的每个部分调用两次
void foo(vector_double &evg) {
int nx = Dims[0], ny = Dims[1], nz = Dims[2];
const int nxny[] = {ny, nx};
const int n = nx*ny*nz;
const fftw_r2r_kind kinds[] = {FFTW_RODFT00, FFTW_RODFT00};
if (evg.size() != n)
throw std::runtime_error ("*** weird size of evg");
fftw_plan p;
p = fftw_plan_many_r2r(2, nxny, nz,
&evg[0], nxny, 1, nx*ny,
&evg[0], nxny, 1, nx*ny,
kinds, FFTW_ESTIMATE);
// actual FFT
fftw_execute(p);
}
void bar(vector_complex &evg) {
vector_double tmp;
tmp = evg.real();
foo(tmp);
evg.real() = tmp;
tmp = evg.imag();
foo(tmp);
evg.imag() = tmp;
}
那么,既然没有从FFTW R2R到CUFT的直接转换,我如何在CUDA上获得相同的结果呢?
P.S.vector_double和vector_complex是特征向量,如果这有帮助的话
我不能提供解决方案,但是评论的大小是有限的,所以我把它放在这里:
2(N+1)
-大小转换,而不仅仅是N
),并且必须进行更多的内存分配,因此它不会像r2c或c2c情况那样快。但根据我的经验,即使是较旧的主流GPU也比使用FFT的CPU快得多(比如一个数量级),所以至少可以获得一些加速