我有一个 MPI 代码(由其他人编写)需要计时。代码的基本布局如下。简而言之,该代码分两部分对矩阵 A
进行并行 SVD 求解:(1) 它首先将矩阵 A
平均分配给 n
处理器,然后 (2) 执行 SVD 求解:
int main(){
1. Code to split A among the different processors...
2. actual parallel SVD solve
}
我只想对代码的第 (2) 部分计时(在 A 分布在处理器之间后的 SVD 求解)。我尝试了以下,但我不确定输出是否正确:
int main(){
1. Code to split A among the different processors...
MPI_Barrier(MPI_COMM_WORLD);
double start = MPI_Wtime();
2. actual parallel SVD solve
MPI_Barrier(MPI_COMM_WORLD);
double end = MPI_Wtime();
if (MyPID == 0){ cout << end - start << endl;}
}
我是 MPI 的新手,不确定我是否正确使用了 MPI_Barrier 命令,或者我是否真的需要它。输出时间是否会正确地忽略第 (1) 部分所花费的时间?
最佳答案
如果我没理解错的话,你想做的都是分布式 SVD。你看过线性代数库了吗ScaLAPACK ?与其commands for singular value decomposition ,它应该完全满足您的需求。
关于您对 MPI_Barrier
的使用:没有太多内容:传递的通信器上的所有进程都等待该通信器上的所有其他进程到达这行代码。但是 MPI_Barrier
不保证在屏障同步后执行。其一,由于中断,即使在同一 CPU 类型上执行,每个进程的性能也略有不同;其次,在 MPI_Barrier
之后恢复执行时,在时间上存在微小差异。总的来说,您应该尽可能避免使用 MPI_Barrier
。我认为它更像是一种调试工具,而不是人们希望在生产代码中看到的东西。另外:当您计划使用集体通信时,您不需要 MPI_Barrier
。
总体设计的最后一句话:MPI 初学者经常犯的错误是,他们认为有一个 master 进程 来管理所有信息并将问题分发给工作节点是很有用的.然而,这种设计确实意味着大量的沟通和同步。通信(尤其是计算机之间)相对较慢,应不惜一切代价避免。一种更有益的方法通常是扁平化设计,其中每个流程都在处理自己的问题部分。
edit: 刚才只看到关于MPI_Wtime
的那一行:该代码片段似乎是正确的。再举一个例子,你可以看看 this tutorial .如果这个程序的唯一目的是测量时间,我猜第一个 MPI_Barrier
是可行的,但第二个肯定不行。为什么在停止计时之前必须同步您的流程? MPI_Wtime
对于执行它的进程是本地的。
还有一件事:如果您有权访问 VampirTrace (询问您的集群管理员)您可以进行更深入的分析并获得漂亮的图表:
附注:谁能推荐 VampirTrace 的免费变体?
关于c++ - 如何正确计时 MPI 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23380630/