已合并
fix CQ overflow #4953
hu-yiliang11创建于 8月31日
fix CQ overflow #4953
已合并
共 4 个文件变更+20-20
| @@ -372,7 +372,7 @@ HcclResult TransportDeviceIbverbs::BuildMemDetailsRmaMgrs() | |||
| 372 | 372 | ||
| 373 | HcclResult TransportDeviceIbverbs::AddWrList( | 373 | HcclResult 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 | ||
| 453 | HcclResult TransportDeviceIbverbs::ConstructPayLoadWqe( | 453 | HcclResult 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 | // 发送数据Wqe | 458 | // 发送数据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指向第二个WR | 323 | + 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 | ||