Mpi 在集群上重用FFTW智慧

Mpi 在集群上重用FFTW智慧,mpi,cluster-computing,fft,fftw,Mpi,Cluster Computing,Fft,Fftw,我正在使用多个节点在集群上运行分布式MPI程序,其中我利用了的MPI FFT。为了节省时间,我从一次跑步重复到下一次跑步。为了产生这种智慧,FFTW用许多不同的算法进行了实验,而不是针对给定的问题。我担心,因为我在集群上工作,所以存储为一组CPU/节点的智慧的最佳解决方案可能不是执行相同任务的其他CPU/节点集的最佳解决方案,因此我不应该重用智慧,除非我在与收集智慧的运行完全相同的CPU/节点上运行 这是正确的,还是智慧完全不在乎生成它的物理硬件?如果您的集群是同构的,那么保存的fftw计划可能

我正在使用多个节点在集群上运行分布式MPI程序,其中我利用了的MPI FFT。为了节省时间,我从一次跑步重复到下一次跑步。为了产生这种智慧,FFTW用许多不同的算法进行了实验,而不是针对给定的问题。我担心,因为我在集群上工作,所以存储为一组CPU/节点的智慧的最佳解决方案可能不是执行相同任务的其他CPU/节点集的最佳解决方案,因此我不应该重用智慧,除非我在与收集智慧的运行完全相同的CPU/节点上运行


这是正确的,还是智慧完全不在乎生成它的物理硬件?

如果您的集群是同构的,那么保存的fftw计划可能是有意义的,尽管进程的连接方式可能会影响mpi相关操作的最佳计划。但是,如果您的集群不是同质的,那么保存fftw计划可能是次优的,并且与负载平衡相关的问题可能很难解决

查看fftw和fftw_mpi为2D c2c转换生成的WITH文件,我可以看到可能与需要mpi通信的转置等阶段相关的附加行,例如:

(fftw_mpi_transpose_pairwise_register 0 #x1040 #x1040 #x0 #x394c59f5 #xf7d5729e #xe8cf4383 #xce624769)
  (fftw_codelet_n1fv_10_sse2 0 #x1440 #x1440 #x0 #xa9be7eee #x53354c26 #xc32b0044 #xb92f3bfd)
事实上,有不同的算法用于转置2D(或3D)数组:、文件
成对转置.c
全部转置.c
转置递归.c
实现这些算法。当设置标志
FFTW_MEASURE
FFTW_depensive
时,运行这些算法以选择最快的,如前所述。结果可能取决于进程网络的拓扑结构(每个节点上有多少进程?这些节点如何连接?)如果最佳计划取决于进程运行的位置和网络拓扑,则使用WITH实用程序将不会起决定性作用。否则,使用WITH功能可以在制定计划时节省一些时间

要测试是否更改了最佳计划,您可以执行两次运行并将生成的计划保存在文件中:可复制性测试

int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
fftw_mpi_gather_wisdom(MPI_COMM_WORLD);
if (rank == 0) fftw_export_wisdom_to_filename("wisdommpi.txt");

/* save the plan on each process ! Depending on the file system of the cluster, performing communications can be required */
char filename[42];
sprintf(filename, "wisdom%d.txt",rank);
fftw_export_wisdom_to_filename(filename);
最后,要比较生成的WITH文件,请尝试使用bash脚本:

for filename in wis*.txt; do
  for filename2 in wis*.txt; do
    echo "."
    if grep -Fqvf "$filename" "$filename2"; then
        echo "$filename"
        echo "$filename2"
            echo $"There are lines in file1 that don’t occur in file2."
    fi
  done
done
此脚本检查文件中的所有行是否也存在于其他文件中,如下所示 在我的个人电脑上,使用
mpirun-np4 main
,除了行的排列之外,所有WITH文件都是相同的

如果不同运行的文件不同,则可能是由于进程之间的通信模式。。。或每个过程dft的顺序性能。上面的代码保存了每个流程的最佳计划。如果行与顺序操作相关,但不包含
fftw\u mpi
,例如:

(fftw_mpi_transpose_pairwise_register 0 #x1040 #x1040 #x0 #x394c59f5 #xf7d5729e #xe8cf4383 #xce624769)
  (fftw_codelet_n1fv_10_sse2 0 #x1440 #x1440 #x0 #xa9be7eee #x53354c26 #xc32b0044 #xb92f3bfd)
不同的是,这是一个线索,最优顺序算法从一个过程变化到另一个过程在这种情况下,顺序操作的挂钟时间也可能因进程而异。因此,检查进程之间的负载平衡可能具有指导意义。正如FFTW文档中所注意到的:

当您在异构机器上并行时,负载平衡尤其困难。。。FFTW不处理这个问题,但是它假设您的进程在速度相当的硬件上运行,因此目标是尽可能平均地分配问题

这一假设与公司执行的操作一致

(如果不同进程为同一问题创建的计划不相同,fftw_mpi_gather_wisdom将任意选择其中一个计划。)如果进程在不相同的硬件上运行,这两个功能可能会导致不同进程的次优计划

2D和3D fft中的转置操作需要大量通信:其中一个实现是调用几乎涉及整个阵列的MPI_Alltoall。因此,节点(infiniband…)之间的良好连接可能非常有用


如果您在不同的跑步中发现不同的最佳计划,请告知我们,以及这些计划的差异

智慧是特定于给定硬件配置的。如果所有节点上的硬件都相同,那么您可以重用WITH,但是如果您有不同的配置(CPU、时钟速度、内存速度、缓存大小等),那么WITH可能不应该重用(除非系统非常相似)。我通常使用类似的节点。节点之间的通信时间是多少?当然,这在很大程度上取决于我的工作分配了哪一组特定的节点,因为电缆长度不同。也就是说,与节点2和3上的作业相比,节点0和1上的作业可能具有不同的最佳智慧,即使所有节点都相同。这是正确的吗?哦-我刚刚注意到你正在使用FFTW的MPI构建-在这种情况下我不确定。我只使用单线程非MPI构建,任何给定系统中的所有节点都是相同的。然而,智慧是一种低级的东西——它只是根据经验为给定的CPU和FFTW计划选择最佳蝴蝶。