开发OpenMPI的MCA组件:如何基于自定义NIC的BTL推进MPI_Recv?
自定义NIC BTL组件开发问题:MPI_Recv挂起排查与解决
问题背景
我正在为一款自定义NIC开发BTL组件,已通过研读btl.h文件梳理组件所需实现的调用流程。我使用一个简单的MPI_Send+MPI_Recv测试用例(在TCP BTL下运行正常)进行开发测试,测试代码如下:
int ping_pong_count = 1; int partner_rank = (world_rank + 1) % 2; printf("MY RANK: %d PARTNER: %d\n",world_rank,partner_rank); if (world_rank == 0) { // Increment the ping pong count before you send it ping_pong_count++; MPI_Send(&ping_pong_count, 1, MPI_INT, partner_rank, 0, MPI_COMM_WORLD); printf("%d sent and incremented ping_pong_count %d to %d\n", world_rank, ping_pong_count, partner_rank); } else { MPI_Recv(&ping_pong_count, 1, MPI_INT, partner_rank, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); printf("%d received ping_pong_count %d from %d\n", world_rank, ping_pong_count, partner_rank); } MPI_Finalize();
发送阶段执行情况
在MPI_Send阶段,我的组件代码中以下函数被调用:
- mca_btl_mycomp_add_procs
- mca_btl_mycomp_prepare_src
- mca_btl_mycomp_send(返回值设为1,表示发送阶段已完成)
测试输出显示发送成功:
0 sent and incremented ping_pong_count 2 to 1
接收端问题
随后我在btl_mycomp_component_progress函数中实现了如下调用:
mca_btl_active_message_callback_t *reg = mca_btl_base_active_message_trigger + tag; reg->cbfunc(&my_btl->super, &desc);
我参考了其他BTL的实现,认为此代码可解除MPI_Recv的轮询等待,但实际测试仍挂起。我还查看了ob1的mca_pml_ob1_recv_frag_callback_match函数,发现它已匹配到我的片段。
疑问
- 如何通知框架工作已完成,让MPI_Recv返回至用户应用?
- 我哪里出错了?
- 有没有方法排查代码在等待什么及等待位置?
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

