LCOV - code coverage report
Current view: top level - legacy/ascend910/platform/resource/transport/onesided - transport_ipc_mem.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 205 0
Test Date: 2026-08-18 17:47:01 Functions: 0.0 % 23 0

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3              :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4              :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5              :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6              :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7              :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8              :  * See LICENSE in the root of the software repository for the full text of the License.
       9              :  */
      10              : 
      11              : #include "transport_ipc_mem.h"
      12              : #include "log.h"
      13              : #include "dispatcher_pub.h"
      14              : #include "hccl_network.h"
      15              : 
      16              : namespace hccl {
      17              : using namespace std;
      18              : using LocalIpcRmaBufferMgr = NetDevContext::LocalIpcRmaBufferMgr;
      19              : 
      20            0 : TransportIpcMem::TransportIpcMem(
      21              :     const std::unique_ptr<NotifyPool>& notifyPool, const HcclNetDevCtx& netDevCtx, const HcclDispatcher& dispatcher,
      22            0 :     AttrInfo& attrInfo, bool aicpuUnfoldMode)
      23              :     : TransportMem(notifyPool, netDevCtx, dispatcher, attrInfo, aicpuUnfoldMode),
      24            0 :       sdid_(attrInfo.sdid),
      25            0 :       serverId_(attrInfo.serverId)
      26            0 : {}
      27              : 
      28            0 : TransportIpcMem::~TransportIpcMem() {}
      29              : 
      30              : HcclResult
      31            0 : TransportIpcMem::ExchangeMemDesc(const RmaMemDescs& localMemDescs, RmaMemDescs& remoteMemDescs, u32& actualNumOfRemote)
      32              : {
      33            0 :     return DoExchangeMemDesc(localMemDescs, remoteMemDescs, actualNumOfRemote);
      34              : }
      35              : 
      36            0 : HcclResult TransportIpcMem::EnableMemAccess(const RmaMemDesc& remoteMemDesc, RmaMem& remoteMem)
      37              : {
      38            0 :     std::string tempDesc = RmaMemDescCopyToStr(remoteMemDesc);
      39              : 
      40              :     // 创建远程缓冲区,并进行反序列化、打开
      41            0 :     std::shared_ptr<RemoteIpcRmaBuffer> tempRemoteBufferPtr = nullptr;
      42            0 :     EXCEPTION_CATCH((tempRemoteBufferPtr = make_shared<RemoteIpcRmaBuffer>(netDevCtx_)), return HCCL_E_PARA);
      43            0 :     HcclResult ret = tempRemoteBufferPtr->Deserialize(tempDesc);
      44            0 :     CHK_PRT_RET(
      45              :         (ret != HCCL_SUCCESS), HCCL_ERROR("[TransportIpcMem][EnableMemAccess]RemoteBuffer Deserialize failed."), ret);
      46              : 
      47            0 :     ret = tempRemoteBufferPtr->Open();
      48            0 :     CHK_PRT_RET((ret != HCCL_SUCCESS), HCCL_ERROR("[TransportIpcMem][EnableMemAccess]RemoteBuffer Open failed."), ret);
      49              : 
      50              :     BufferKey<uintptr_t, u64> tempKey(
      51            0 :         reinterpret_cast<uintptr_t>(tempRemoteBufferPtr->GetAddr()), tempRemoteBufferPtr->GetSize());
      52            0 :     auto resultPair = remoteIpcRmaBufferMgr_.Add(tempKey, tempRemoteBufferPtr);
      53            0 :     if (resultPair.first == remoteIpcRmaBufferMgr_.End()) {
      54              :         // 输入key与已有的内存重叠
      55            0 :         HCCL_ERROR("[TransportIpcMem][EnableMemAccess]The memory that is expected to enable"
      56              :                    " overlaps with the memory that has been enabled, please check params");
      57            0 :         return HCCL_E_INTERNAL;
      58              :     }
      59              : 
      60              :     // 已使能:输入key是表中某一最相近key的全集。 返回添加该key的迭代器,及false
      61              :     // 未使能:输入key是表中某一最相近key的空集。 返回添加成功的迭代器,及true
      62            0 :     std::string logInfo = resultPair.second ? "Enable memory access success!" :
      63            0 :                                               "Memory is already enabled, just increase the reference count.";
      64            0 :     HCCL_INFO("[TransportIpcMem][EnableMemAccess]:%s", logInfo.c_str());
      65              : 
      66              :     // 填充出参TransportRmaMem信息
      67            0 :     remoteMem.addr = tempRemoteBufferPtr->GetAddr();
      68            0 :     remoteMem.size = tempRemoteBufferPtr->GetSize();
      69            0 :     remoteMem.type = tempRemoteBufferPtr->GetMemType();
      70            0 :     return HCCL_SUCCESS;
      71            0 : }
      72              : 
      73            0 : HcclResult TransportIpcMem::DisableMemAccess(const RmaMemDesc& remoteMemDesc)
      74              : {
      75              :     // 内存去使能管理
      76            0 :     std::string tempDesc = RmaMemDescCopyToStr(remoteMemDesc);
      77            0 :     std::shared_ptr<RemoteIpcRmaBuffer> tempRemoteBuffer = make_shared<RemoteIpcRmaBuffer>(netDevCtx_);
      78            0 :     HcclResult ret = tempRemoteBuffer->Deserialize(tempDesc);
      79            0 :     CHK_PRT_RET(
      80              :         (ret != HCCL_SUCCESS), HCCL_ERROR("[TransportIpcMem][DisableMemAccess]RemoteBuffer Deserialize failed."), ret);
      81              : 
      82            0 :     ret = tempRemoteBuffer->Close();
      83            0 :     CHK_PRT_RET(
      84              :         (ret != HCCL_SUCCESS), HCCL_ERROR("[TransportIpcMem][DisableMemAccess]RemoteBuffer Close failed."), ret);
      85              : 
      86              :     BufferKey<uintptr_t, u64> tempKey(
      87            0 :         reinterpret_cast<uintptr_t>(tempRemoteBuffer->GetAddr()), tempRemoteBuffer->GetSize());
      88              :     try {
      89            0 :         if (remoteIpcRmaBufferMgr_.Del(tempKey)) {
      90              :             // 删除成功:输入key是表中某一最相近key的全集,计数-1后为0,返回true
      91            0 :             HCCL_INFO("[TransportIpcMem][DisableMemAccess]Memory reference count is 0, disable memory access.");
      92              :         } else {
      93              :             // 删除失败:输入key是表中某一最相近key的全集,计数不为0(存在其他remoteRank使用),返回false
      94            0 :             HCCL_INFO("[TransportIpcMem][DisableMemAccess]Memory reference count is larger than 0"
      95              :                       "(used by other RemoteRank), do not disable memory.");
      96              :         }
      97            0 :         return HCCL_SUCCESS;
      98            0 :     } catch (std::out_of_range& e) {
      99            0 :         HCCL_ERROR("[TransportIpcMem][DisableMemAccess] catch RmaBufferMgr Del exception: %s", e.what());
     100            0 :         return HCCL_E_NOT_FOUND;
     101            0 :     }
     102            0 : }
     103              : 
     104            0 : HcclResult TransportIpcMem::FillRmaBufferSlice(
     105              :     const HcclBuf& localMem, const HcclBuf& remoteMem, RmaBufferSlice& localRmaBufferSlice,
     106              :     RmaBufferSlice& remoteRmaBufferSlice)
     107              : {
     108            0 :     void* remoteAddr = remoteMem.addr;
     109            0 :     void* localAddr = localMem.addr;
     110            0 :     u64 byteSize = std::min(remoteMem.len, localMem.len);
     111              :     //  local-handle还在map中获取,remote-hanle从外部传入
     112            0 :     auto localKey = BufferKey<uintptr_t, u64>(reinterpret_cast<uintptr_t>(localAddr), byteSize);
     113              : 
     114            0 :     NetDevContext* netDevCtx = static_cast<NetDevContext*>(netDevCtx_);
     115            0 :     std::shared_ptr<LocalIpcRmaBufferMgr> localRmaBufferMgr = netDevCtx->GetlocalIpcRmaBufferMgr();
     116            0 :     if (!localRmaBufferMgr) {
     117            0 :         HCCL_ERROR("[TransportIpcMem] can't get LocalIpcRmaBufferMgr");
     118            0 :         return HCCL_E_INTERNAL;
     119              :     }
     120              : 
     121            0 :     auto localBuffer = localRmaBufferMgr->Find(localKey);
     122            0 :     CHK_PRT_RET(
     123              :         !localBuffer.first,
     124              :         HCCL_ERROR(
     125              :             "[TransportIpcMem][FillRmaBufferSlice] Can't find localBuffer by key {%p, %llu}", localAddr, byteSize),
     126              :         HCCL_E_INTERNAL);
     127            0 :     CHK_PRT_RET(
     128              :         !localBuffer.second->GetAddr(),
     129              :         HCCL_ERROR("[TransportIpcMem][FillRmaBufferSlice] The addr of local Buffer or remote buffer is nullptr."),
     130              :         HCCL_E_NOT_FOUND);
     131            0 :     CHK_PRT_RET(
     132              :         !localBuffer.second->GetDevAddr(),
     133              :         HCCL_ERROR("[TransportIpcMem][FillRmaBufferSlice] The dev addr of local Buffer is nullptr."), HCCL_E_NOT_FOUND);
     134            0 :     CHK_RET(CheckHcclBuffer(localAddr, localBuffer.second.get()));
     135              : 
     136            0 :     RmaBuffer* remoteBuffer = static_cast<RmaBuffer*>(remoteMem.handle);
     137            0 :     CHK_PRT_RET(
     138              :         !remoteBuffer->GetDevAddr(),
     139              :         HCCL_ERROR("[TransportIpcMem][FillRmaBufferSlice] The dev addr of remote buffer is nullptr."),
     140              :         HCCL_E_NOT_FOUND);
     141            0 :     CHK_PRT_RET(
     142              :         !remoteBuffer->GetAddr(),
     143              :         HCCL_ERROR("[TransportIpcMem][FillRmaBufferSlice] The addr of remote buffer is nullptr."), HCCL_E_NOT_FOUND);
     144            0 :     CHK_RET(CheckHcclBuffer(remoteAddr, remoteBuffer));
     145              : 
     146            0 :     u64 localDataOffSet = static_cast<u8*>(localAddr) - static_cast<u8*>(localBuffer.second->GetAddr());
     147            0 :     u64 remoteDataOffSet = static_cast<u8*>(remoteAddr) - static_cast<u8*>(remoteBuffer->GetAddr());
     148            0 :     localRmaBufferSlice.addr = static_cast<void*>(static_cast<u8*>(localBuffer.second->GetDevAddr()) + localDataOffSet);
     149            0 :     localRmaBufferSlice.len = byteSize;
     150            0 :     localRmaBufferSlice.rmaBuffer = localBuffer.second;
     151            0 :     localRmaBufferSlice.memType = localBuffer.second->GetMemType();
     152            0 :     remoteRmaBufferSlice.addr = static_cast<void*>(static_cast<u8*>(remoteBuffer->GetDevAddr()) + remoteDataOffSet);
     153            0 :     remoteRmaBufferSlice.len = byteSize;
     154              :     std::shared_ptr<RmaBuffer> temp(
     155            0 :         remoteBuffer, []([[maybe_unused]] RmaBuffer* p) {}); // 在外部进行删除操作,内部不能用智能指针进行生命周期管理
     156            0 :     remoteRmaBufferSlice.rmaBuffer = temp;
     157            0 :     remoteRmaBufferSlice.memType = remoteBuffer->GetMemType();
     158            0 :     HCCL_INFO(
     159              :         "[TransportIpcMem][FillRmaBufferSlice] Local address before mapping is [%p], after mapping is [%p]."
     160              :         "Remote address before mapping is [%p], after mapping is [%p]. Datasize is [%llu].",
     161              :         localAddr, localRmaBufferSlice.addr, remoteAddr, remoteRmaBufferSlice.addr, byteSize);
     162            0 :     return HCCL_SUCCESS;
     163            0 : }
     164              : 
     165            0 : HcclResult TransportIpcMem::FillRmaBufferSlice(
     166              :     const RmaOpMem& localMem, const RmaOpMem& remoteMem, RmaBufferSlice& localRmaBufferSlice,
     167              :     RmaBufferSlice& remoteRmaBufferSlice)
     168              : {
     169            0 :     void* remoteAddr = remoteMem.addr;
     170            0 :     void* localAddr = localMem.addr;
     171            0 :     u64 byteSize = std::min(remoteMem.size, localMem.size);
     172              : 
     173            0 :     auto localKey = BufferKey<uintptr_t, u64>(reinterpret_cast<uintptr_t>(localAddr), byteSize);
     174            0 :     auto remoteKey = BufferKey<uintptr_t, u64>(reinterpret_cast<uintptr_t>(remoteAddr), byteSize);
     175              : 
     176            0 :     NetDevContext* netDevCtx = static_cast<NetDevContext*>(netDevCtx_);
     177            0 :     std::shared_ptr<LocalIpcRmaBufferMgr> localRmaBufferMgr = netDevCtx->GetlocalIpcRmaBufferMgr();
     178            0 :     if (!localRmaBufferMgr) {
     179            0 :         HCCL_ERROR("[TransportIpcMem] can't get LocalIpcRmaBufferMgr");
     180            0 :         return HCCL_E_INTERNAL;
     181              :     }
     182              : 
     183            0 :     auto localBuffer = localRmaBufferMgr->Find(localKey);
     184            0 :     CHK_PRT_RET(
     185              :         !localBuffer.first,
     186              :         HCCL_ERROR(
     187              :             "[TransportIpcMem][FillRmaBufferSlice] Can't find localBuffer by key {%p, %llu}", localAddr, byteSize),
     188              :         HCCL_E_INTERNAL);
     189            0 :     CHK_PRT_RET(
     190              :         !localBuffer.second->GetAddr(),
     191              :         HCCL_ERROR("[TransportIpcMem][FillRmaBufferSlice] The addr of local Buffer or remote buffer is nullptr."),
     192              :         HCCL_E_NOT_FOUND);
     193            0 :     CHK_PRT_RET(
     194              :         !localBuffer.second->GetDevAddr(),
     195              :         HCCL_ERROR("[TransportIpcMem][FillRmaBufferSlice] The dev addr of local Buffer is nullptr."), HCCL_E_NOT_FOUND);
     196            0 :     CHK_RET(CheckHcclBuffer(localAddr, localBuffer.second.get()));
     197              : 
     198            0 :     auto remoteBuffer = remoteIpcRmaBufferMgr_.Find(remoteKey);
     199            0 :     CHK_PRT_RET(
     200              :         !remoteBuffer.first,
     201              :         HCCL_ERROR(
     202              :             "[TransportIpcMem][FillRmaBufferSlice] Can't find remoteBuffer by key {%p, %llu}", remoteAddr, byteSize),
     203              :         HCCL_E_INTERNAL);
     204            0 :     CHK_PRT_RET(
     205              :         !remoteBuffer.second->GetDevAddr(),
     206              :         HCCL_ERROR("[TransportIpcMem][FillRmaBufferSlice] The dev addr of remote buffer is nullptr."),
     207              :         HCCL_E_NOT_FOUND);
     208            0 :     CHK_PRT_RET(
     209              :         !remoteBuffer.second->GetAddr(),
     210              :         HCCL_ERROR("[TransportIpcMem][FillRmaBufferSlice] The addr of remote buffer is nullptr."), HCCL_E_NOT_FOUND);
     211            0 :     CHK_RET(CheckHcclBuffer(remoteAddr, remoteBuffer.second.get()));
     212              : 
     213            0 :     u64 localDataOffSet = static_cast<u8*>(localAddr) - static_cast<u8*>(localBuffer.second->GetAddr());
     214            0 :     u64 remoteDataOffSet = static_cast<u8*>(remoteAddr) - static_cast<u8*>(remoteBuffer.second->GetAddr());
     215            0 :     localRmaBufferSlice.addr = static_cast<void*>(static_cast<u8*>(localBuffer.second->GetDevAddr()) + localDataOffSet);
     216            0 :     localRmaBufferSlice.len = byteSize;
     217            0 :     localRmaBufferSlice.rmaBuffer = localBuffer.second;
     218            0 :     localRmaBufferSlice.memType = localBuffer.second->GetMemType();
     219              :     remoteRmaBufferSlice.addr
     220            0 :         = static_cast<void*>(static_cast<u8*>(remoteBuffer.second->GetDevAddr()) + remoteDataOffSet);
     221            0 :     remoteRmaBufferSlice.len = byteSize;
     222            0 :     remoteRmaBufferSlice.rmaBuffer = remoteBuffer.second;
     223            0 :     remoteRmaBufferSlice.memType = remoteBuffer.second->GetMemType();
     224              : 
     225            0 :     HCCL_INFO(
     226              :         "[TransportIpcMem][FillRmaBufferSlice] Local address before mapping is [%p], after mapping is [%p]."
     227              :         "Remote address before mapping is [%p], after mapping is [%p]. Datasize is [%llu].",
     228              :         localAddr, localRmaBufferSlice.addr, remoteAddr, remoteRmaBufferSlice.addr, byteSize);
     229            0 :     return HCCL_SUCCESS;
     230            0 : }
     231              : 
     232            0 : HcclResult TransportIpcMem::SetSocket([[maybe_unused]] const std::shared_ptr<HcclSocket>& socket)
     233              : {
     234            0 :     HCCL_INFO("TransportIpcMem doesn't need to set socket");
     235            0 :     return HCCL_SUCCESS;
     236              : }
     237              : 
     238            0 : HcclResult TransportIpcMem::Connect([[maybe_unused]] s32 timeoutSec)
     239              : {
     240            0 :     HCCL_INFO("TransportIpcMem doesn't need to connect socket");
     241            0 :     return HCCL_SUCCESS;
     242              : }
     243              : 
     244            0 : HcclResult TransportIpcMem::Write(const HcclBuf& remoteMem, const HcclBuf& localMem, const rtStream_t& stream)
     245              : {
     246            0 :     CHK_PRT_RET(
     247              :         (localMem.addr == nullptr) || (remoteMem.addr == nullptr),
     248              :         HCCL_ERROR("[TransportIpcMem]localMem addr or remoteMem addr is invalid"), HCCL_E_PARA);
     249            0 :     CHK_PRT_RET(
     250              :         (localMem.len == 0U) || (remoteMem.len == 0U),
     251              :         HCCL_ERROR(
     252              :             "[TransportIpcMem]localMem size[%llu] or remoteMem size[%llu]is invalid", localMem.len, remoteMem.len),
     253              :         HCCL_E_PARA);
     254            0 :     CHK_PRT_RET(stream == nullptr, HCCL_ERROR("[TransportIpcMem]stream is invalid"), HCCL_E_PARA);
     255              : 
     256            0 :     RmaBufferSlice localRmaBufferSlice{};
     257            0 :     RmaBufferSlice remoteRmaBufferSlice{};
     258            0 :     CHK_RET(FillRmaBufferSlice(localMem, remoteMem, localRmaBufferSlice, remoteRmaBufferSlice));
     259            0 :     return TransportIpc(remoteRmaBufferSlice, localRmaBufferSlice, stream);
     260            0 : }
     261              : 
     262            0 : HcclResult TransportIpcMem::Write(const RmaOpMem& remoteMem, const RmaOpMem& localMem, const rtStream_t& stream)
     263              : {
     264            0 :     CHK_PRT_RET(
     265              :         (localMem.addr == nullptr) || (remoteMem.addr == nullptr),
     266              :         HCCL_ERROR("[TransportIpcMem]localMem addr or remoteMem addr is invalid"), HCCL_E_PARA);
     267            0 :     CHK_PRT_RET(
     268              :         (localMem.size == 0U) || (remoteMem.size == 0U),
     269              :         HCCL_ERROR(
     270              :             "[TransportIpcMem]localMem size[%llu] or remoteMem size[%llu]is invalid", localMem.size, remoteMem.size),
     271              :         HCCL_E_PARA);
     272            0 :     CHK_PRT_RET(stream == nullptr, HCCL_ERROR("[TransportIpcMem]stream is invalid"), HCCL_E_PARA);
     273              : 
     274            0 :     RmaBufferSlice localRmaBufferSlice{};
     275            0 :     RmaBufferSlice remoteRmaBufferSlice{};
     276            0 :     CHK_RET(FillRmaBufferSlice(localMem, remoteMem, localRmaBufferSlice, remoteRmaBufferSlice));
     277            0 :     return TransportIpc(remoteRmaBufferSlice, localRmaBufferSlice, stream);
     278            0 : }
     279              : 
     280            0 : HcclResult TransportIpcMem::Read(const HcclBuf& localMem, const HcclBuf& remoteMem, const rtStream_t& stream)
     281              : {
     282            0 :     CHK_PRT_RET(
     283              :         (localMem.addr == nullptr) || (remoteMem.addr == nullptr),
     284              :         HCCL_ERROR("[TransportIpcMem]localMem addr or remoteMem addr is invalid"), HCCL_E_PARA);
     285            0 :     CHK_PRT_RET(
     286              :         (localMem.len == 0U) || (remoteMem.len == 0U),
     287              :         HCCL_ERROR(
     288              :             "[TransportIpcMem]localMem size[%llu] or remoteMem size[%llu]is invalid", localMem.len, remoteMem.len),
     289              :         HCCL_E_PARA);
     290            0 :     CHK_PRT_RET(stream == nullptr, HCCL_ERROR("[TransportIpcMem]stream is invalid"), HCCL_E_PARA);
     291              : 
     292            0 :     RmaBufferSlice localRmaBufferSlice{};
     293            0 :     RmaBufferSlice remoteRmaBufferSlice{};
     294            0 :     CHK_RET(FillRmaBufferSlice(localMem, remoteMem, localRmaBufferSlice, remoteRmaBufferSlice));
     295            0 :     return TransportIpc(localRmaBufferSlice, remoteRmaBufferSlice, stream);
     296            0 : }
     297              : 
     298            0 : HcclResult TransportIpcMem::Read(const RmaOpMem& localMem, const RmaOpMem& remoteMem, const rtStream_t& stream)
     299              : {
     300            0 :     CHK_PRT_RET(
     301              :         (localMem.addr == nullptr) || (remoteMem.addr == nullptr),
     302              :         HCCL_ERROR("[TransportIpcMem]localMem addr or remoteMem addr is invalid"), HCCL_E_PARA);
     303            0 :     CHK_PRT_RET(
     304              :         (localMem.size == 0U) || (remoteMem.size == 0U),
     305              :         HCCL_ERROR(
     306              :             "[TransportIpcMem]localMem size[%llu] or remoteMem size[%llu]is invalid", localMem.size, remoteMem.size),
     307              :         HCCL_E_PARA);
     308            0 :     CHK_PRT_RET(stream == nullptr, HCCL_ERROR("[TransportIpcMem]stream is invalid"), HCCL_E_PARA);
     309              : 
     310            0 :     RmaBufferSlice localRmaBufferSlice{};
     311            0 :     RmaBufferSlice remoteRmaBufferSlice{};
     312            0 :     CHK_RET(FillRmaBufferSlice(localMem, remoteMem, localRmaBufferSlice, remoteRmaBufferSlice));
     313            0 :     return TransportIpc(localRmaBufferSlice, remoteRmaBufferSlice, stream);
     314            0 : }
     315              : 
     316            0 : HcclResult TransportIpcMem::AddOpFence([[maybe_unused]] const rtStream_t& stream)
     317              : {
     318            0 :     HCCL_INFO("TransportIpcMem doesn't need to add op fence");
     319            0 :     return HCCL_SUCCESS;
     320              : }
     321              : 
     322            0 : HcclResult TransportIpcMem::GetMemInfo(u32& lkey, u32& rkey, HcclBuf& localMem, HcclBuf& remoteMem)
     323              : {
     324            0 :     CHK_PRT_RET(
     325              :         (localMem.addr == nullptr) || (remoteMem.addr == nullptr),
     326              :         HCCL_ERROR(
     327              :             "[TransportIpcMem] localMem addr[%p] or remoteMem addr[%p] is invalid", localMem.addr, remoteMem.addr),
     328              :         HCCL_E_PARA);
     329            0 :     CHK_PRT_RET(
     330              :         (localMem.len == 0U) || (remoteMem.len == 0U),
     331              :         HCCL_ERROR(
     332              :             "[TransportIpcMem] localMem size[%llu] or remoteMem size[%llu]is invalid", localMem.len, remoteMem.len),
     333              :         HCCL_E_PARA);
     334              : 
     335            0 :     RmaBufferSlice localRmaBufferSlice{};
     336            0 :     RmaBufferSlice remoteRmaBufferSlice{};
     337            0 :     CHK_RET(FillRmaBufferSlice(localMem, remoteMem, localRmaBufferSlice, remoteRmaBufferSlice));
     338            0 :     lkey = 0U;
     339            0 :     localMem.addr = localRmaBufferSlice.addr;
     340            0 :     localMem.len = localRmaBufferSlice.len;
     341              : 
     342            0 :     rkey = 0U;
     343            0 :     remoteMem.addr = remoteRmaBufferSlice.addr;
     344            0 :     remoteMem.len = remoteRmaBufferSlice.len;
     345              : 
     346            0 :     return HCCL_SUCCESS;
     347            0 : }
     348              : 
     349            0 : HcclResult TransportIpcMem::GetTransInfo(
     350              :     [[maybe_unused]] HcclQpInfoV2& qpInfo, u32* lkey, u32* rkey, HcclBuf* localMem, HcclBuf* remoteMem, u32 num)
     351              : {
     352            0 :     CHK_PTR_NULL(lkey);
     353            0 :     CHK_PTR_NULL(rkey);
     354            0 :     CHK_PTR_NULL(localMem);
     355            0 :     CHK_PTR_NULL(remoteMem);
     356            0 :     CHK_PRT_RET(num == 0, HCCL_ERROR("[GetTransInfo] mem num should not be zero"), HCCL_E_PARA);
     357              : 
     358              :     // GetTransInfo为TransportMem对外接口,TransportRoceMem将最后一个localMem用来反OpFence
     359              :     // Ipc mem无需Opfence,最后一个rkey/rkey/localMem/remoteMem空着
     360            0 :     for (u32 i = 0; i < num - 1; ++i) {
     361            0 :         HcclResult ret = GetMemInfo(lkey[i], rkey[i], localMem[i], remoteMem[i]);
     362            0 :         CHK_PRT_RET(
     363              :             ret != HCCL_SUCCESS,
     364              :             HCCL_ERROR(
     365              :                 "[GetTransInfo] failed at index[%u], localAddr[%p,%llu], "
     366              :                 "remoteAddr[%p,%llu]",
     367              :                 i, localMem[i].addr, localMem[i].len, remoteMem[i].addr, remoteMem[i].len),
     368              :             ret);
     369              :     }
     370            0 :     return HCCL_SUCCESS;
     371              : }
     372              : 
     373            0 : HcclResult TransportIpcMem::WaitOpFence([[maybe_unused]] const rtStream_t& stream)
     374              : {
     375            0 :     HCCL_DEBUG("TransportIpcMem doesn't need to wait fence");
     376            0 :     return HCCL_SUCCESS;
     377              : }
     378              : 
     379            0 : HcclResult TransportIpcMem::BatchWrite(
     380              :     [[maybe_unused]] const std::vector<MemDetails>& remoteMems,
     381              :     [[maybe_unused]] const std::vector<MemDetails>& localMems, [[maybe_unused]] Stream& stream)
     382              : {
     383            0 :     HCCL_ERROR("TransportIpcMem doesn't support BatchWrite");
     384            0 :     return HCCL_E_NOT_SUPPORT;
     385              : }
     386              : 
     387            0 : HcclResult TransportIpcMem::BatchRead(
     388              :     [[maybe_unused]] const std::vector<MemDetails>& localMems,
     389              :     [[maybe_unused]] const std::vector<MemDetails>& remoteMems, [[maybe_unused]] Stream& stream)
     390              : {
     391            0 :     HCCL_ERROR("TransportIpcMem doesn't support BatchRead");
     392            0 :     return HCCL_E_NOT_SUPPORT;
     393              : }
     394              : 
     395            0 : HcclResult TransportIpcMem::AddOpFence(
     396              :     [[maybe_unused]] const MemDetails& localFenceMem, [[maybe_unused]] const MemDetails& remoteFenceMem,
     397              :     [[maybe_unused]] Stream& stream)
     398              : {
     399            0 :     HCCL_ERROR("TransportIpcMem doesn't support AICPU AddOpFence");
     400            0 :     return HCCL_E_NOT_SUPPORT;
     401              : }
     402              : 
     403            0 : HcclResult TransportIpcMem::TransportIpc(
     404              :     const RmaBufferSlice& dstRmaBufferSlice, const RmaBufferSlice& srcRmaBufferSlice, const rtStream_t& stream)
     405              : {
     406            0 :     CHK_PTR_NULL(dstRmaBufferSlice.addr);
     407            0 :     CHK_PTR_NULL(srcRmaBufferSlice.addr);
     408            0 :     Stream hcclStream(stream);
     409            0 :     DispatcherPub* dispatcher = reinterpret_cast<DispatcherPub*>(dispatcher_);
     410            0 :     if (dstRmaBufferSlice.memType == RmaMemType::HOST || srcRmaBufferSlice.memType == RmaMemType::HOST) {
     411            0 :         CHK_RET(dispatcher->MemcpyAsyncWithoutCheckKind(
     412              :             dstRmaBufferSlice.addr, dstRmaBufferSlice.len, srcRmaBufferSlice.addr, srcRmaBufferSlice.len,
     413              :             HcclRtMemcpyKind::HCCL_RT_MEMCPY_KIND_DEVICE_TO_DEVICE, hcclStream, remoteRankId_,
     414              :             hccl::LinkType::LINK_HCCS));
     415            0 :     } else {
     416            0 :         CHK_RET(dispatcher->MemcpyAsync(
     417              :             dstRmaBufferSlice.addr, dstRmaBufferSlice.len, srcRmaBufferSlice.addr, srcRmaBufferSlice.len,
     418              :             HcclRtMemcpyKind::HCCL_RT_MEMCPY_KIND_DEVICE_TO_DEVICE, hcclStream, remoteRankId_,
     419              :             hccl::LinkType::LINK_HCCS));
     420              :     }
     421            0 :     return HCCL_SUCCESS;
     422            0 : }
     423              : } // namespace hccl
        

Generated by: LCOV version 2.0-1