Sockets 当运行MPI时,有没有一种方法可以先执行顺序代码,然后再运行并行代码

Sockets 当运行MPI时,有没有一种方法可以先执行顺序代码,然后再运行并行代码,sockets,parallel-processing,pthreads,mpi,Sockets,Parallel Processing,Pthreads,Mpi,我正在编写代码,我需要初始化变量并按顺序执行一系列任务,并且只执行一次。接下来,我正在使用pthreading运行并行进程,然后返回顺序代码对数据进行排序并执行二进制搜索。并行进程只是同时从多个(大约35个)套接字进行多次读取。我被要求使用MPI实现相同的设置,我目前的理解是,如果我使用MPI,每个进程都将执行整个程序,视差处理并不局限于放置MPI_Init_线程和MPI_Finalize的行。我的理解正确吗?或者,在使用MPI时,有没有办法在并行代码前后执行顺序代码? 在调用其他MPI例程之前

我正在编写代码,我需要初始化变量并按顺序执行一系列任务,并且只执行一次。接下来,我正在使用pthreading运行并行进程,然后返回顺序代码对数据进行排序并执行二进制搜索。并行进程只是同时从多个(大约35个)套接字进行多次读取。我被要求使用MPI实现相同的设置,我目前的理解是,如果我使用MPI,每个进程都将执行整个程序,视差处理并不局限于放置MPI_Init_线程和MPI_Finalize的行。我的理解正确吗?或者,在使用MPI时,有没有办法在并行代码前后执行顺序代码?

  • 在调用其他MPI例程之前调用MPI_Init。它的 目的是初始化MPI环境
  • 在计算结束时调用MPI_Finalize,它 执行各种清理任务以终止MPI 环境
  • MPI_Init还去除了所有与MPI相关的命令行参数
如果要执行顺序代码,可以执行以下操作

 if (myrank == 0){ 
 //code
 }

并且主线程(id=0)将单独执行代码,这样您就不会在该位置出现并行现象。

您的理解是正确的。您可以添加几行代码,并仅在秩0上执行某些作业(请记住,其他MPI任务处于活动状态,并且可能正在旋转)。另一种方法是启动1个MPI任务,然后在并行性需要额外的MPI任务时启动
MPI\u Comm\u spawn()
。请记住
MPI\u Comm\u spawn()
语义不是很直观,如果您是在资源管理器下运行的,那么这可能不是最好的选择,因此从所有MPI任务开始是最简单的选择。