C++ 如何正确计时MPI代码

C++ 如何正确计时MPI代码,c++,performance,mpi,timing,C++,Performance,Mpi,Timing,我有一个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求解)。我尝试了以

我有一个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;}
}
intmain(){
1.用于在不同处理器之间拆分A的代码。。。
MPI_屏障(MPI_通信世界);
双启动=MPI_Wtime();
2.实际并行SVD求解
MPI_屏障(MPI_通信世界);
双端=MPI_Wtime();

如果(MyPID==0){cout如果我理解正确,你想做的就是做一个分布式SVD。你看过线性代数库吗?有了它,它应该能做你需要的事情

至于您对
MPI\u屏障的使用
:没有太多:在经过的通信器上的所有进程都会等待,直到该通信器上的其他每个进程都到达这一行代码。但是
MPI\u屏障
不能保证屏障后的执行是同步的。首先,每个进程的性能变化很小第二,即使由于中断而在同一CPU类型上执行,在
MPI\u屏障
之后恢复执行时,时间上也会有微小的差异。总体而言,您应该尽可能避免
MPI\u屏障
。我认为它更像是一种调试工具,而不是人们希望在生产代码中看到的工具。此外:当您计划使用集体通信时,您不需要MPI\U屏障

总体设计的最后一句话:MPI初学者经常犯的错误是,他们认为使用一个主进程来管理所有信息并将问题分发给工作节点是有用的。然而,这种设计确实意味着大量的通信和同步。通信(尤其是计算机之间的通信)比较慢,应该不惜一切代价避免。一个更有益的方法通常是平面设计,每个过程都在自己的问题部分进行思考

编辑:刚才只看到了一行关于
MPI\u时间的内容:那段代码似乎是正确的。再举一个例子,你可以看看。如果这个程序的唯一目的是测量时间,我想第一个
MPI\u屏障
在某种程度上是可行的,但第二个肯定是不可行的。你为什么要同步呢在停止计时之前关闭进程?
MPI\u Wtime
是正在执行计时的进程的本地时间

还有一件事:如果您有权访问(询问您的群集管理员),您可以进行更深入的分析并获得漂亮的图表:


p、 美国:有人能推荐一个VampirTrace的免费版本吗?

niklasfi,有一个俄罗斯项目
openvampir
:但我没有检查它。而且我认为大多数MPI都有内置跟踪,例如MPICH有
jumpshot
s:OpenMPI的常见问题解答说TUD有免费的从Vampir的OTF到LaTeX的转换器