如果您的集群是同构的,则保存的 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)
变得不同,这是最优顺序算法从一个进程到另一个进程变化的线索。 在这种情况下,顺序操作的挂钟时间也可能因一个进程而异。因此,检查进程之间的负载平衡可能是有益的。 正如 FFTW 的文档中关于 load balance 所指出的那样:
当您在异构机器上进行并行处理时,负载平衡尤其困难; ... FFTW 不处理这个问题,但是,它假定您的进程在速度相当的硬件上运行,因此目标是尽可能平等地划分问题。
这个假设与fftw_mpi_gather_wisdom();执行的操作一致
(如果不同进程为同一问题创建的计划不一样,fftw_mpi_gather_wisdom 会任意选择其中一个计划。)如果进程运行在非相同的硬件...
2D 和 3D fft 中的转置操作需要大量通信:其中一种实现是调用 MPI_Alltoall 几乎涉及整个数组。因此,节点之间的良好连接(infiniband...)可以证明是有用的。
让我们知道您是否在一次跑步中发现了不同的最佳计划,以及这些计划有何不同!