我有一个 MPI 应用程序,它需要在专用通信线程内异步响应传入消息和请求完成。执行此操作的明显方法是交替调用 MPI_Iprobe 和 MPI_Testsome 的繁忙等待。如果我这样做,我应该担心性能吗?只使用两个线程并吃掉上下文切换时间会更好吗?
如果架构非特定的答案不合理,我会选择 BlueGene/Q 或 Cray XE6。
不幸的是(就 MPI_Testsome 成本而言),我希望一次有 O(100) 个请求处于活动状态。
笔记:
- 我的内存有限,因此尽快检测到已完成的请求很重要。完成的请求可能会释放足够的空间来在其他线程上安排更多计算。
- 传入的消息大小不一,而且我没有足够的内存来为所有消息分配缓冲区,所以我不能切换到 MPI_Irecvs 而不是 MPI_Iprobes。
- 遗憾的是,MPI 不允许您使用传入消息大小的上限来执行 MPI_Irecv,因为这可以完美地解决我的问题。