我使用多个节点在集群上运行分布式MPI程序,其中我使用了FFTW的MPI。为了节省时间,我从一次运行到另一次运行重用智慧。为了产生这种智慧,FFTW实验用了很多不同的算法和什么不是针对给定的问题。我担心,由于我正在处理集群,对于一组CPU/节点来说,作为智慧存储的最佳解决方案可能不是执行相同任务的其他一组CPU/节点的最佳解决方案,因此,除非我运行的CPU/节点与智慧集中的运行点完全相同,否则我不应该重用智慧。
这是正确的,还是智慧在某种程度上完全漠视于产生它的物理硬件?
发布于 2018-03-21 22:18:52
如果您的集群是同构的,则保存的fftw计划可能是有意义的,尽管进程连接的方式可能会影响mpi相关操作的最佳计划。但是,如果您的集群不是同构的,那么保存fftw计划可能是次优的,与负载平衡相关的问题很难解决。
查看fftw和fftw_mpi为2D c2c转换生成的智慧文件,我可以看到可能与需要mpi通信的换位等阶段相关的附加行,例如:
(fftw_mpi_transpose_pairwise_register 0 #x1040 #x1040 #x0 #x394c59f5 #xf7d5729e #xe8cf4383 #xce624769)
实际上,转换2D (或3D)数组有不同的算法:fftw的来源、transpose-pairwise.c
、transpose-alltoall.c
和transpose-recurse.c
实现了这些算法。设置标志FFTW_MEASURE
或FFTW_EXHAUSTIVE
时,运行这些算法以选择最快的,如声明的这里。结果可能取决于进程网络的拓扑结构(每个节点上有多少个进程?这些节点如何连接?)。如果最优计划取决于进程运行的地点和网络拓扑,则使用智能实用程序将不是决定性的。否则,使用智能功能可以在计划构建时节省一些时间。
要测试最优计划是否更改,可以执行几次运行,并将结果计划保存在文件中:可复制性测试!
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
此脚本检查文件中的所有行是否也存在于其他文件中,按照个人计算机上的检查一个文件中的所有行是否存在于另一个文件中的某个位置。,使用mpirun -np 4 main
,除行排列之外,所有智慧文件都是相同的。
如果文件从一次运行到另一次运行有所不同,则可以将其归因于进程之间的通信模式.或dft对每个进程的顺序性能。上面的代码段保存了每个进程的最佳计划。如果行与顺序操作相关,其中不包含fftw_mpi
,如:
(fftw_codelet_n1fv_10_sse2 0 #x1440 #x1440 #x0 #xa9be7eee #x53354c26 #xc32b0044 #xb92f3bfd)
不同的是,最优序列算法从一个过程到另一个过程的变化是一个线索。在这种情况下,顺序操作的挂钟时间也可能因进程而异。因此,检查进程之间的负载平衡可能具有指导意义。是FFTW关于负载平衡的文档中所注意到的。
当您在异类机器上并行时,负载平衡特别困难;然而,FFTW并没有处理这个问题--它假设您的进程运行在速度相当的硬件上,因此目标是尽可能公平地分配问题。
此假设与fftw_mpi_gather_wisdom();
所执行的操作一致。
(如果不同进程为同一个问题创建的计划不相同,fftw_mpi_gather_wisdom将任意选择其中的一个。)如果进程在不相同的硬件上运行,这两种功能都可能导致对不同进程的次优计划。
二维和三维fft中的转置操作需要大量的通信:其中一个实现是调用MPI_Alltoall,几乎涉及整个数组。因此,节点之间具有良好的连接性(infiniband.)才能爱得有用。
让我们知道,如果您发现不同的最优计划从一个运行到另一个,以及这些计划是如何不同的!
https://stackoverflow.com/questions/49391699
复制相似问题