在MPI_Waitall执行期间能否运行其他进程?
问题:当MPI_Waitall处于阻塞状态时,是否可以执行一个进程?
代码示例:
recv(....) send(....) stream(..) // 我希望在Waitall执行期间运行的进程 MPI_Waitall(...)
用户期望在MPI_Waitall的阻塞阶段执行stream()进程,询问该操作是否可行。
回答
你当前的写法不可行。因为MPI_Waitall是阻塞式调用,它会暂停当前进程的执行,直到所有指定的MPI请求完成。而你的stream()调用是在MPI_Waitall之前执行的,会在MPI_Waitall开始阻塞前就运行完毕,根本不会在Waitall的阻塞阶段执行。
要实现“在等待MPI请求完成的同时运行stream()”的需求,有两种常见方案:
方案1:使用非阻塞MPI操作+轮询
用非阻塞版的通信接口(MPI_Irecv、MPI_Isend)发起通信,拿到请求句柄,然后循环调用MPI_Testall检查请求是否完成,在每次轮询的间隙执行stream():
MPI_Request reqs[2]; MPI_Irecv(... , &reqs[0]); MPI_Isend(... , &reqs[1]); int flag; do { MPI_Testall(2, reqs, &flag, MPI_STATUS_IGNORE); stream(); // 每次轮询间隙执行stream } while (!flag);
这种方式不需要多线程,所有操作都在同一个进程/线程里完成,适合简单场景。
方案2:使用多线程
如果你的MPI库支持多线程(初始化时需要指定合适的线程级别,比如MPI_Init_thread并传入MPI_THREAD_MULTIPLE),可以用一个线程专门调用MPI_Waitall阻塞等待,另一个线程运行stream():
// 初始化MPI时指定线程支持 int provided; MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided); if (provided < MPI_THREAD_MULTIPLE) { // 处理不支持多线程的情况 } // 创建线程运行stream pthread_t stream_thread; pthread_create(&stream_thread, NULL, (void*)stream, NULL); // 主线程等待MPI请求完成 MPI_Waitall(...); // 等待stream线程执行完毕 pthread_join(stream_thread, NULL);
这种方式适合stream()是计算密集型、需要持续运行的场景,但要注意线程间的资源同步问题,以及确认MPI库的线程支持能力。
内容的提问来源于stack exchange,提问作者Shetaanshu Gupta
相关产品推荐
相关产品推荐

