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
|