【问题标题】:Reusing FFTW wisdom on clusters在集群上重用 FFTW 智慧
【发布时间】:2023-04-03 15:20:01
【问题描述】:

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

这是正确的,还是智慧与生成它的物理硬件完全无关?

【问题讨论】:

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

标签: mpi cluster-computing fft fftw


【解决方案1】:

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

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

(fftw_mpi_transpose_pairwise_register 0 #x1040 #x1040 #x0 #x394c59f5 #xf7d5729e #xe8cf4383 #xce624769)

确实,转置 2D(或 3D)数组有不同的算法:in the folder mpi of the source of fftw、文件transpose-pairwise.ctranspose-alltoall.ctranspose-recurse.c 实现这些算法。设置标志FFTW_MEASUREFFTW_EXHAUSTIVE 后,运行这些算法以选择最快的算法,如here 所述。结果可能取决于进程网络的拓扑结构(每个节点上有多少进程?这些节点如何连接?)。 如果最佳计划取决于进程运行的位置和网络拓扑,则使用智慧实用程序将不是决定性的。 否则,使用智慧功能可以在构建计划时节省一些时间。

要测试最优计划是否改变,您可以执行几次运行并将生成的计划保存在文件中:再现性测试!

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);

最后,要比较生成的智慧文件,请在 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

此脚本检查文件中的所有行是否也存在于其他文件中,遵循Check if all lines from one file are present somewhere in another file 在我的个人电脑上,使用mpirun -np 4 main,所有的智慧文件都是相同的,除了行的排列。

如果文件从一个运行到另一个不同,它可能归因于进程之间的通信模式......或每个进程的 dft 顺序性能。上面这段代码保存了每个进程的最优计划。如果是与顺序操作相关的行,不带fftw_mpi,如:

  (fftw_codelet_n1fv_10_sse2 0 #x1440 #x1440 #x0 #xa9be7eee #x53354c26 #xc32b0044 #xb92f3bfd)

变得不同,这是最优顺序算法从一个进程到另一个进程变化的线索。 在这种情况下,顺序操作的挂钟时间也可能因一个进程而异。因此,检查进程之间的负载平衡可能是有益的。 正如 FFTW 的文档中关于 load balance 所指出的那样:

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

这个假设与fftw_mpi_gather_wisdom();执行的操作一致

(如果不同进程为同一问题创建的计划不一样,fftw_mpi_gather_wisdom 会任意选择其中一个计划。)如果进程运行在非相同的硬件...

2D 和 3D fft 中的转置操作需要大量通信:其中一种实现是调用 MPI_Alltoall 几乎涉及整个数组。因此,节点之间的良好连接(infiniband...)可以证明是有用的。

让我们知道您是否在一次跑步中发现了不同的最佳计划,以及这些计划有何不同!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多