带有MPI的FFTW3 1D变换速度较慢

带有MPI的FFTW3 1D变换速度较慢,mpi,fft,fftw,Mpi,Fft,Fftw,我正在使用MPI测试FFTW 1D c2c转换。 在编译并运行FFTW3教程上的2D示例后,我发现使用8个节点时,执行速度比只使用一个节点快2倍(使用大尺寸,如4096x4096) 所以我将这个例子修改为1D,但出现了一些问题,因为我看到了这个时间: 1 node = 0.763668 s 2 nodes = 1.540884 s 4 nodes = 1.336446 s 8 nodes = 0.851646 s 我的代码: #include <fftw3-mpi.h>

我正在使用MPI测试FFTW 1D c2c转换。 在编译并运行FFTW3教程上的2D示例后,我发现使用8个节点时,执行速度比只使用一个节点快2倍(使用大尺寸,如4096x4096)

所以我将这个例子修改为1D,但出现了一些问题,因为我看到了这个时间:

1 node  = 0.763668 s
2 nodes = 1.540884 s
4 nodes = 1.336446 s
8 nodes = 0.851646 s
我的代码:

    #include <fftw3-mpi.h>
    # include <stdlib.h>
    # include <stdio.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    # include <time.h>
    #include <math.h>

    int main(int argc, char **argv)
    {
       //const ptrdiff_t N0 = 4096;
       const ptrdiff_t N0 = 4194304 ;
       //const ptrdiff_t N0 = 8388608;
       fftw_plan planForw,planBack;
       fftw_complex *data,*dataOut,*data2;
       ptrdiff_t alloc_local, local_ni, local_i_start, i, j,local_no, local_o_start;
       int index,size;
       double startwtime, endwtime;
       MPI_Init(&argc, &argv);
       fftw_mpi_init();
       MPI_Comm_rank(MPI_COMM_WORLD,&index);
       MPI_Comm_size(MPI_COMM_WORLD,&size);

       /* get local data size and allocate */
       alloc_local = fftw_mpi_local_size_1d(N0, MPI_COMM_WORLD,FFTW_FORWARD, FFTW_ESTIMATE,
                                                  &local_ni, &local_i_start,&local_no, &local_o_start);
       data = fftw_alloc_complex(alloc_local);
       dataOut = fftw_alloc_complex(alloc_local);
       data2 = fftw_alloc_complex(alloc_local);
             /* create plan  */
       planForw = fftw_mpi_plan_dft_1d(N0, data, data2, MPI_COMM_WORLD,
                                         FFTW_FORWARD, FFTW_ESTIMATE);
       planBack = fftw_mpi_plan_dft_1d(N0, data2, dataOut, MPI_COMM_WORLD,
                                         FFTW_BACKWARD, FFTW_ESTIMATE);
       /* initialize data to some function my_function(x,y) */
       for (i = 0; i < local_ni; ++i) 
       {
        data[i][0] =rand() / (double)RAND_MAX;
        data[i][1] =rand() / (double)RAND_MAX;
       }
       if(index==0){
        startwtime = MPI_Wtime();

        }

        fftw_execute(planForw);
        fftw_execute(planBack);
        if(index==0){
        endwtime = MPI_Wtime();
            printf("wall clock time = %f\n",
                           endwtime-startwtime);


       }

             fftw_destroy_plan(planForw);
         fftw_destroy_plan(planBack);
             MPI_Finalize();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
//常数ptrdiff_t N0=4096;
常数ptrdiff_t N0=4194304;
//常数ptrdiff_t N0=8388608;
fftw_planForw,planBack;
fftw_复合体*数据,*数据输出,*数据2;
ptrdiff t alloc\u local,local\u ni,local\u i\u start,i,j,local\u no,local\u o\u start;
int索引,大小;
双开始时间,结束时间;
MPI_Init(&argc,&argv);
fftw_mpi_init();
MPI通信排名(MPI通信世界和索引);
MPI_通信大小(MPI_通信世界和大小);
/*获取本地数据大小并分配*/
alloc_local=fftw_mpi_local_size_1d(N0,mpi_COMM_WORLD,fftw_FORWARD,fftw_ESTIMATE,
&本地启动、本地启动、本地否和本地启动);
数据=fftw_alloc_复合体(alloc_局部);
dataOut=fftw_alloc_复合体(alloc_局部);
数据2=fftw_alloc_复合体(alloc_局部);
/*创建计划*/
planForw=fftw\U mpi\U plan\U dft\U 1d(N0,数据,数据2,mpi通信世界,
FFTW_向前,FFTW_估计);
planBack=fftw\U mpi\U plan\U dft\U 1d(N0,数据2,数据输出,mpi通信世界,
FFTW_向后,FFTW_估计);
/*将数据初始化到某个函数my_函数(x,y)*/
对于(i=0;i
2D和3D FFT的并行执行效率远远高于1D FFT。多维FFT本质上是每个方向上的一系列独立1D FFT,可与零通信并行执行。在切换执行1D FFT的方向时,仅当数据被全局转置时才涉及通信。谢谢,但在我尝试使用mpi之前,我对FFTW多线程进行了相同的测试,并且当我使用4个线程(使用intel i7四核)进行大容量时,我的速度比仅使用一个线程快2,5倍。也许我的MPI代码有问题?没什么问题。内存在线程之间共享,每个线程都可以访问正在转换的所有数据。在MPI情况下,消息必须在中间步骤的不同进程之间交换。这种通信开销会导致性能下降。您还应该设置一个
MPI\u屏障(MPI\u COMM\u WORLD)在数据初始化之后,只是为了确保所有进程(大致)同步。是的,我也尝试了MPI_Barrier结果不变。您知道fftw\u mpi\u local\u size\u 1d(local n out和local out start)的最后两个参数的可用性吗?我从来没有使用过它们,我也不知道为什么我可以使用它们。最后两个输出参数是什么,这一点非常清楚。有些情况下,输出数组的大小与输入数组的大小不同(例如,在r2c前向变换中),并且如果数据点的数量不能被进程数量的平方整除,则
local\u no
可能与
local\u ni
不同。