You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:00:53