我正在使用多个节点在集群上运行分布式MPI程序,我使用FFTW的MPI FFT。为了节省时间,我将wisdom从一次运行重用到另一次运行。为了产生这种智慧,FFTW实验采用了许多不同的算法,而不是针对给定的问题。我担心因为我在集群上工作,对于一组CPU /节点存储为智慧的最佳解决方案可能不是执行相同任务的其他一组CPU /节点的最佳解决方案,因此我不应该重用智慧,除非我在与收集智慧的运行完全相同的CPU /节点上运行。
这是正确的,还是智慧对生成它的物理硬件完全无动于衷?
答案 0 :(得分:2)
如果您的群集是同质的,则保存的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.c
,transpose-alltoall.c
和transpose-recurse.c
实现这些算法。当设置了标志FFTW_MEASURE
或FFTW_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)
变得不同,这是最佳顺序算法从一个过程变为另一个过程的线索。 在这种情况下,顺序操作的挂钟时间也可能因处理而异。因此,检查进程之间的负载平衡可能具有指导意义。正如在关于load balance的FFTW文档中所注意到的那样:
执行的操作一致当您在异构机器上进行并行化时,负载平衡尤其困难; ...然而,FFTW并不处理这个问题 - 它假设您的进程在速度相当的硬件上运行,因此目标是尽可能平均地分配问题。
(如果不同流程针对同一问题创建的计划不同,fftw_mpi_gather_wisdom将任意选择其中一个计划。)如果流程在非流程上运行,这两个功能都可能导致不同流程的次优计划相同的硬件...
2D和3D fft中的转置操作需要大量通信:其中一个实现是调用MPI_Alltoall,几乎涉及整个阵列。因此,节点之间的良好连接(infiniband ......)可以证明是有用的。
如果您发现不同的优化计划从一次运行到另一次运行以及这些计划有何不同,请告诉我们!