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

开发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函数,发现它已匹配到我的片段。

疑问

  1. 如何通知框架工作已完成,让MPI_Recv返回至用户应用?
  2. 我哪里出错了?
  3. 有没有方法排查代码在等待什么及等待位置?

内容的提问来源于stack exchange,提问作者Michele

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:33:27