已合并
fix CQ overflow #4953
hu-yiliang11创建于 8月31日
fix CQ overflow #4953
已合并
hu-yiliang11创建于 8月31日
共 4 个文件变更+20-20
@@ -372,7 +372,7 @@ HcclResult TransportDeviceIbverbs::BuildMemDetailsRmaMgrs()
372 372 
373HcclResult TransportDeviceIbverbs::AddWrList(373HcclResult TransportDeviceIbverbs::AddWrList(
374 void* dstMemPtr, const void* srcMemPtr, u64 srcMemSize, u32 srcKey, u32 dstKey, WqeType wqeType, WrAuxInfo& aux,374 void* dstMemPtr, const void* srcMemPtr, u64 srcMemSize, u32 srcKey, u32 dstKey, WqeType wqeType, WrAuxInfo& aux,
375- std::vector<WrInformation>& wrInfoVec)375+ std::vector<WrInformation>& wrInfoVec, bool isLast)
376{376{
377 HCCL_DEBUG("TransportDeviceIbverbs AddWrList start");377 HCCL_DEBUG("TransportDeviceIbverbs AddWrList start");
378 if (srcMemSize == 0) {378 if (srcMemSize == 0) {
@@ -381,7 +381,7 @@ HcclResult TransportDeviceIbverbs::AddWrList(
381 WrInformation wrInfoTmp;381 WrInformation wrInfoTmp;
382 wrInfoTmp.wrData.dstAddr = static_cast<u64>(reinterpret_cast<uintptr_t>(dstMemPtr));382 wrInfoTmp.wrData.dstAddr = static_cast<u64>(reinterpret_cast<uintptr_t>(dstMemPtr));
383 wrInfoTmp.wrData.rkey = dstKey;383 wrInfoTmp.wrData.rkey = dstKey;
384- wrInfoTmp.wrData.sendFlags = fence_ ? (RA_SEND_SIGNALED | RA_SEND_FENCE) : RA_SEND_SIGNALED;384+ wrInfoTmp.wrData.sendFlags = fence_ ? (RA_SEND_SIGNALED | RA_SEND_FENCE) : (isLast ? RA_SEND_SIGNALED : 0);
385 fence_ = false;385 fence_ = false;
386 wrInfoTmp.wrData.immData = 0;386 wrInfoTmp.wrData.immData = 0;
387 wrInfoTmp.wrData.wrId = 0;387 wrInfoTmp.wrData.wrId = 0;
@@ -414,8 +414,8 @@ HcclResult TransportDeviceIbverbs::AddWrList(
414 }414 }
415 CHK_RET(GetWrDataAddr(dstMemPtr, wqeType, wrInfoTmp.wrDataAddr, wrInfoTmp.notifyId));415 CHK_RET(GetWrDataAddr(dstMemPtr, wqeType, wrInfoTmp.wrDataAddr, wrInfoTmp.notifyId));
416 HCCL_DEBUG(416 HCCL_DEBUG(
417- "wrInfoTmp dst_addr[0x%llx] memList addr[0x%llx] len[%llu]", wrInfoTmp.wrData.dstAddr,417+ "wrInfoTmp dst_addr[0x%llx] memList addr[0x%llx] len[%llu] isLast[%u]", wrInfoTmp.wrData.dstAddr,
418- wrInfoTmp.wrData.memList.addr, srcMemSize);418+ wrInfoTmp.wrData.memList.addr, srcMemSize, isLast);
419 wrInfoVec.push_back(wrInfoTmp);419 wrInfoVec.push_back(wrInfoTmp);
420 HCCL_DEBUG("TransportDeviceIbverbs AddWrList end");420 HCCL_DEBUG("TransportDeviceIbverbs AddWrList end");
421 return HCCL_SUCCESS;421 return HCCL_SUCCESS;
@@ -452,7 +452,7 @@ TransportDeviceIbverbs::GetMemInfo(UserMemType memType, void** dstMemPtr, unsign
452 452 
453HcclResult TransportDeviceIbverbs::ConstructPayLoadWqe(453HcclResult TransportDeviceIbverbs::ConstructPayLoadWqe(
454 void* dstMemPtr, u32 dstKey, const void* src, u32 srcKey, u64 len, WqeType wqeType, WrAuxInfo& aux,454 void* dstMemPtr, u32 dstKey, const void* src, u32 srcKey, u64 len, WqeType wqeType, WrAuxInfo& aux,
455- std::vector<WrInformation>& wrInfoVec, u32 txSendDataTimes)455+ std::vector<WrInformation>& wrInfoVec, u32 txSendDataTimes, bool isLast)
456{456{
457 HcclResult ret;457 HcclResult ret;
458 // 发送数据Wqe458 // 发送数据Wqe
@@ -463,7 +463,7 @@ HcclResult TransportDeviceIbverbs::ConstructPayLoadWqe(
463 void* txdstMemPtr = reinterpret_cast<void*>(reinterpret_cast<char*>(dstMemPtr) + txSendDataOffset);463 void* txdstMemPtr = reinterpret_cast<void*>(reinterpret_cast<char*>(dstMemPtr) + txSendDataOffset);
464 464 
465 const void* txsrcMemPtr = reinterpret_cast<const void*>(reinterpret_cast<const char*>(src) + txSendDataOffset);465 const void* txsrcMemPtr = reinterpret_cast<const void*>(reinterpret_cast<const char*>(src) + txSendDataOffset);
466- ret = AddWrList(txdstMemPtr, txsrcMemPtr, txSendDataSize, srcKey, dstKey, wqeType, aux, wrInfoVec);466+ ret = AddWrList(txdstMemPtr, txsrcMemPtr, txSendDataSize, srcKey, dstKey, wqeType, aux, wrInfoVec, isLast);
467 CHK_PRT_RET(467 CHK_PRT_RET(
468 ret != HCCL_SUCCESS,468 ret != HCCL_SUCCESS,
469 HCCL_ERROR(469 HCCL_ERROR(
@@ -1472,6 +1472,7 @@ TransportDeviceIbverbs::BatchTransferImpl(const HcommBatchTransferDesc* transfer
1472 remoteAddr, length, static_cast<int>(wqeType));1472 remoteAddr, length, static_cast<int>(wqeType));
1473 1473 
1474 if (localAddr != nullptr) {1474 if (localAddr != nullptr) {
1475+ bool isLast = (i == descNum - 1);
1475 u32 txSendDataTimes = (length == 0) ? 1 : (length + RDMA_SEND_MAX_SIZE - 1) / RDMA_SEND_MAX_SIZE;1476 u32 txSendDataTimes = (length == 0) ? 1 : (length + RDMA_SEND_MAX_SIZE - 1) / RDMA_SEND_MAX_SIZE;
1476 RdmaAddrKeyResolveParam resolve{};1477 RdmaAddrKeyResolveParam resolve{};
1477 resolve.remoteAddr = remoteAddr;1478 resolve.remoteAddr = remoteAddr;
@@ -1480,7 +1481,7 @@ TransportDeviceIbverbs::BatchTransferImpl(const HcommBatchTransferDesc* transfer
1480 CHK_RET(ResolveRdmaAddrsAndKeys(resolve));1481 CHK_RET(ResolveRdmaAddrsAndKeys(resolve));
1481 CHK_RET(ConstructPayLoadWqe(1482 CHK_RET(ConstructPayLoadWqe(
1482 resolve.transRemoteAddr, resolve.dstKey, resolve.transLocalAddr, resolve.srcKey, length, wqeType, aux,1483 resolve.transRemoteAddr, resolve.dstKey, resolve.transLocalAddr, resolve.srcKey, length, wqeType, aux,
1483- wrInfoVec, txSendDataTimes));1484+ wrInfoVec, txSendDataTimes, isLast));
1484 }1485 }
1485 }1486 }
1486 1487 
@@ -320,16 +320,14 @@ HcclResult TransportDeviceRoceMem::RdmaPostSend(
320 sendWr[index].sg_list = &sge[index];320 sendWr[index].sg_list = &sge[index];
321 sendWr[index].wr.rdma.remote_addr = remoteMems[index].addr;321 sendWr[index].wr.rdma.remote_addr = remoteMems[index].addr;
322 sendWr[index].wr.rdma.rkey = remoteMems[index].key;322 sendWr[index].wr.rdma.rkey = remoteMems[index].key;
323- sendWr[index].next = (index == last) ? nullptr : &sendWr[index + 1]; // 第一个WR指向第二个WR323+ sendWr[index].next = (index == last) ? nullptr : &sendWr[index + 1]; // 第一个WR指向第二个WR
324- sendWr[index].send_flags = (index == last) ?324+ sendWr[index].send_flags = fence ? (IBV_SEND_SIGNALED | IBV_SEND_FENCE) : 0; // addfence时才需要回复CQE
325- (fence ? (IBV_SEND_SIGNALED | IBV_SEND_FENCE) : IBV_SEND_SIGNALED) :
326- 0; // 最后一个WR才需要回复CQE
327 sendWr[index].opcode = static_cast<enum ibv_wr_opcode>(opCode);325 sendWr[index].opcode = static_cast<enum ibv_wr_opcode>(opCode);
328 HCCL_DEBUG(326 HCCL_DEBUG(
329 "[TransportDeviceRoceMem][RdmaPostSend] Direct ibv_post_send[%llu], opcode=[0x%x], "327 "[TransportDeviceRoceMem][RdmaPostSend] Direct ibv_post_send[%llu], opcode=[0x%x], "
330- "remote_addr=[0x%llx], size=[%u], fence[%u]",328+ "remote_addr=[0x%llx], size=[%u], fence[%u], send_flags[%d]",
331 wrIdOffset_.load(), sendWr[index].opcode, sendWr[index].wr.rdma.remote_addr, sendWr[index].sg_list->length,329 wrIdOffset_.load(), sendWr[index].opcode, sendWr[index].wr.rdma.remote_addr, sendWr[index].sg_list->length,
332- fence);330+ fence, sendWr[index].send_flags);
333 }331 }
334 332 
335 struct ibv_send_wr* badWr = nullptr;333 struct ibv_send_wr* badWr = nullptr;
@@ -387,13 +387,13 @@ HcclResult TransportRoceMem::TransportRdmaWithType(
387 wr[0].dstAddr = remoteStartAddr;387 wr[0].dstAddr = remoteStartAddr;
388 wr[0].rkey = remoteRdmaRmaBuffer->GetKey();388 wr[0].rkey = remoteRdmaRmaBuffer->GetKey();
389 wr[0].op = static_cast<u32>(rdmaOp);389 wr[0].op = static_cast<u32>(rdmaOp);
390- wr[0].sendFlags = remainingBytes > MAX_RDMA_WQE_SIZE ? 0 : RA_SEND_SIGNALED;390+ wr[0].sendFlags = 0;
391 391 
392 struct SendWrRsp opRsp[WR_NUM];392 struct SendWrRsp opRsp[WR_NUM];
393 393 
394 HCCL_DEBUG(394 HCCL_DEBUG(
395- "Op type[%d], wr.wrId[%llu], src addr[%p], dest addr[%p], len[%u]", rdmaOp, wr[0].wrId,395+ "Op type[%d], wr.wrId[%llu], src addr[%p], dest addr[%p], len[%u], sendflags[%d]", rdmaOp, wr[0].wrId,
396- localRmaBufferSlice.addr, remoteRmaBufferSlice.addr, wr[0].memList.len);396+ localRmaBufferSlice.addr, remoteRmaBufferSlice.addr, wr[0].memList.len, wr[0].sendFlags);
397 u32 completeNum = 0;397 u32 completeNum = 0;
398 CHK_RET(HrtRaSendNormalWrlist(dataQpInfo_.qpHandle, wr, opRsp, WR_NUM, &completeNum));398 CHK_RET(HrtRaSendNormalWrlist(dataQpInfo_.qpHandle, wr, opRsp, WR_NUM, &completeNum));
399 CHK_RET(DoorBellSend(dataQpInfo_.qpMode, wr[0], opRsp[0], stream));399 CHK_RET(DoorBellSend(dataQpInfo_.qpMode, wr[0], opRsp[0], stream));
@@ -513,8 +513,9 @@ HcclResult TransportRoceMem::AddOpFence(const rtStream_t& stream)
513 CHK_RET(DoorBellSend(dataQpInfo_.qpMode, wr[0], opRsp[0], stream));513 CHK_RET(DoorBellSend(dataQpInfo_.qpMode, wr[0], opRsp[0], stream));
514 CHK_RET(WaitOpFence(stream));514 CHK_RET(WaitOpFence(stream));
515 HCCL_DEBUG(515 HCCL_DEBUG(
516- "[AddOpFence] wr.wrId[%llu], local addr[%p], remote addr[%p], len[%u], lkey[%u], rkey[%u]", wr[0].wrId,516+ "[AddOpFence] wr.wrId[%llu], local addr[%p], remote addr[%p], len[%u], lkey[%u], rkey[%u], sendFlags[%d]",
517- rdmaSignal_[0].addr, notifyMemMsg_[opType].addr, wr[0].memList.len, wr[0].memList.lkey, wr[0].rkey);517+ wr[0].wrId, rdmaSignal_[0].addr, notifyMemMsg_[opType].addr, wr[0].memList.len, wr[0].memList.lkey, wr[0].rkey,
518+ wr[0].sendFlags);
518 return HCCL_SUCCESS;519 return HCCL_SUCCESS;
519}520}
520 521