Mpi 多维实数据的FFTW并行导数

Mpi 多维实数据的FFTW并行导数,mpi,fftw,Mpi,Fftw,我想建立一个2D MPI并行谱微分代码。 以下代码似乎可以很好地处理x导数,包括串行和并行: alloc_local = fftw_mpi_local_size_2d(N0,N1,MPI_COMM_WORLD,&local_n0, &local_0_start); fplan_u = fftw_mpi_plan_dft_2d(N0,N1,ptr_u,uhat,MPI_COMM_WORLD,FFTW_FORWARD,FFTW_ESTIMATE); bplan_x = fftw_mp

我想建立一个2D MPI并行谱微分代码。 以下代码似乎可以很好地处理x导数,包括串行和并行:

alloc_local = fftw_mpi_local_size_2d(N0,N1,MPI_COMM_WORLD,&local_n0, &local_0_start);
fplan_u = fftw_mpi_plan_dft_2d(N0,N1,ptr_u,uhat,MPI_COMM_WORLD,FFTW_FORWARD,FFTW_ESTIMATE);
bplan_x = fftw_mpi_plan_dft_2d(N0,N1,uhat_x,ptr_ux,MPI_COMM_WORLD,FFTW_BACKWARD,FFTW_ESTIMATE);

ptr_u   = fftw_alloc_real(alloc_local);
ptr_ux  = fftw_alloc_real(alloc_local);
uhat    = fftw_alloc_complex(alloc_local);
uhat_x  = fftw_alloc_complex(alloc_local);


fftw_execute(fplan_u);

// first renormalize the transform...
for (int j=0;j<local_n0;j++)
for (int i=0;i<N1;i++)
    uhat[j*N1+i] /= (double)(N1*local_n0);

// then compute the x-derivative
for (int j=0;j<local_n0;j++)
for (int i=0;i<N1/2;i++)
    uhat_x[j*N1+i] = I*pow(i,1)*uhat[j*N1+i]/(double)N0;
for (int j=0;j<local_n0;j++)
for (int i=N1/2;i<N1;i++)
    uhat_x[j*N1+i] = -I*pow(N1-i,1)*uhat[j*N1+i]/(double)N0;

fftw_execute(bplan_x);
这在转置计划中是不可能的

编辑:奇怪的是,如果我用3个MPI进程运行上述代码,例如:

my_rank: 0 alloc_local: 87552 local_n0: 171 local_0_start: 0
my_rank: 1 alloc_local: 87552 local_n0: 171 local_0_start: 171
my_rank: 2 alloc_local: 87040 local_n0: 170 local_0_start: 342

我得到的结果仍然是错误的,但看起来比我使用2、4或8个过程得到的结果更接近正确的解决方案。

目前,我看到的唯一问题是
pow(N1-(j+local\u n0*rank),1)
应该是
pow(n0-(j+local\u n0*rank),1)
。但是,由于同样的问题也出现在代码的顺序部分,我假设它不能解决您的问题。尝试打印
local\u n0
:它可能在所有进程上都不相同,从而使
(j+local\u n0*rank)
的频率错误。如果
N0
是进程数的倍数
size
,是否存在问题?实际上,
N1
应该是
N0
。这不是一个真正的问题,因为我现在使用的是
N0=N1
。关于你评论的第二部分,这里有一个第一个测试:我的排名:1 alloc\u local:65536 local\u n0:128 local\u 0开始:128我的排名:0 alloc\u local:65536 local\u n0:128 local\u 0开始:0我的排名:2 alloc\u local:65536 local\u n0:128 local\u 0开始:256我的排名:3 alloc\u local\u n0:128 local\u开始:384所以
local\u n0在所有进程上都是一样的,在这种情况下,问题存在于
N0=512
size=2,4,8,
。目前,我看到的唯一问题是
pow(N1-(j+local\u N0*rank),1)
,应该是
pow(N0-(j+local\u N0*rank),1)
。但是,由于同样的问题也出现在代码的顺序部分,我假设它不能解决您的问题。尝试打印
local\u n0
:它可能在所有进程上都不相同,从而使
(j+local\u n0*rank)
的频率错误。如果
N0
是进程数的倍数
size
,是否存在问题?实际上,
N1
应该是
N0
。这不是一个真正的问题,因为我现在使用的是
N0=N1
。关于你评论的第二部分,这里有一个第一个测试:我的排名:1 alloc\u local:65536 local\u n0:128 local\u 0开始:128我的排名:0 alloc\u local:65536 local\u n0:128 local\u 0开始:0我的排名:2 alloc\u local:65536 local\u n0:128 local\u 0开始:256我的排名:3 alloc\u local\u n0:128 local\u开始:384所以
local\u n0在所有进程上都是一样的,在这种情况下,
N0=512
size=2,4,8,…
存在问题。
uhat[i*N0+j] = fhat[i*N0+j]/(pow((double)i,2)+pow((double)j,2)))
my_rank: 0 alloc_local: 87552 local_n0: 171 local_0_start: 0
my_rank: 1 alloc_local: 87552 local_n0: 171 local_0_start: 171
my_rank: 2 alloc_local: 87040 local_n0: 170 local_0_start: 342