MPI/OpenMP混合代码中的单功能计时
我有一个MPI/OpenMP的混合代码。我想知道每个MPI进程在特定功能(比如A)上花费的时间是多少。此函数在OpenMP do/for循环内被调用,其上的各种函数也以非常复杂的方式调用(例如,其他一些函数,比如B和C可能调用a,a也可能在OpenMP do/for循环内)。我的计划如下:MPI/OpenMP混合代码中的单功能计时,mpi,openmp,Mpi,Openmp,我有一个MPI/OpenMP的混合代码。我想知道每个MPI进程在特定功能(比如A)上花费的时间是多少。此函数在OpenMP do/for循环内被调用,其上的各种函数也以非常复杂的方式调用(例如,其他一些函数,比如B和C可能调用a,a也可能在OpenMP do/for循环内)。我的计划如下: double A() { time1 = MPI_Wtime(); //compute result... //Note: inside this function there is no OpenMP
double A()
{
time1 = MPI_Wtime();
//compute result...
//Note: inside this function there is no OpenMP or MPI calls...
// just pure computation of results...
time2 = MPI_Wtime();
printf("myRank=%d timeSpent=%f\n", myRank, (time2-time1));
return result;
}
每个MPI进程的所有时间之和是否为该MPI进程为此功能花费的总时间?如果没有,请你告诉我如何正确得到它,谢谢 我建议不要重新发明轮子,而是使用一些已经为分析而构建的专业级软件,例如,或
这里有一个不错的开始我们不想重新发明轮子,也不想重新发明MPI分析器。那很难 许多集群系统的制造商提供了非常强大的工具。例如,Cray机器通常配有CrayPat
此外,还有像这样的自由软件这样的方法,每个线程/MPI进程都有自己的时间1和time2@pyCthon您能否建议一种仅获取每个MPI进程的方法?谢谢@torem,VampirTrace在完全检测模式下(默认模式)将跟踪MPI作业中所有进程中代码的每个函数的执行情况(或者您可以编写一个过滤器,将其限制为
a()
),然后Vampir(商业)或Scalasca(开源)可用于分析OTF跟踪。@HristoIliev谢谢,但在我使用的机器中,我没有吸血鬼赛跑…:(Scalasca是开源的,您可以自己构建它(这样做不需要管理员权限).VampirTrace也是开源的。至于Vampir,我认为您可以获得评估许可证。如果您使用Intel MPI,则有可能Intel的跟踪分析器和收集器作为软件包的一部分。它与VampirTrace+Vampir具有几乎相同的跟踪和分析能力,因为它们都来自同一父项目。我使用了crayPat.对于我的函数A,只得到一个结果,即不是每个我正在运行的MPI进程,表中显示“用户时间(约)100.055秒”,这是哪个MPI进程?@torem您想解决负载不平衡问题?我想我提到的链接给出了如何做到这一点的确切说明。您应该发布编译行,并可能就此打开一个CrayPat特定的问题。也许您应该使用发出的patreport命令修改您的帖子。因为CrayPat是用来显示exac的我尝试使用gprof,但它没有为每个MPI进程创建gmon文件,它只创建了一个gmon.out。然后我创建了“gprof a.exe gmon.out”,它没有给我任何信息……你需要添加环境变量,而且(如果你在linux上)如果你向下滚动,你不需要在第三个链接中为你的对象文件创建.exe