C++ 主线程可以为所有线程调用一次MPI\u Win\u lock\u all()吗?

C++ 主线程可以为所有线程调用一次MPI\u Win\u lock\u all()吗?,c++,mpi,openmp,mpi-rma,C++,Mpi,Openmp,Mpi Rma,我正在编写一个具有MPI-3远程内存访问功能的混合MPI/OpenMP代码。我假设MPI_线程_序列化可用 我能做这个吗 MPI_Win_lock_all(0, win); #pragma omp parallel { ... #pragma omp critical(getRemoteData) { MPI_Get(buf, len, MPI_UINT64_T, t_rank, localOffset, len, MPI_UIN

我正在编写一个具有MPI-3远程内存访问功能的混合MPI/OpenMP代码。我假设MPI_线程_序列化可用

我能做这个吗

 MPI_Win_lock_all(0, win);
 #pragma omp parallel 
 {
      ...
      #pragma omp critical(getRemoteData)
      {
           MPI_Get(buf, len, MPI_UINT64_T, t_rank, localOffset, len, MPI_UINT64_T, win);
           MPI_Win_flush(t_rank, win);
      }
      ...

 }
 MPI_Win_unlock_all(win);
在这里,主线程为整个MPI进程调用一次锁定和解锁。OMP线程在需要时调用MPI_Get。我可以为每个MPI_Get调用lock和unlock,但我认为这需要更多的时间


看起来确实有效。但是,我不确定这是否正确使用

是的,这是MPI的正确用法。这是MPI_线程_序列化应该提供的保护级别。窗口访问时代是MPI实现中的进程级操作,它将一个单独的操作系统进程映射到每个级别(实际上所有的生产级实现都是这样)。我同意@hristoliev。是的,这是MPI的正确用法。这是MPI_线程_序列化应该提供的保护级别。窗口访问时代是MPI实现中的进程级操作,它将一个单独的操作系统进程映射到每个级别(实际上所有的生产级实现都是如此)。我同意@hristoliev的观点。