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 : #ifndef AIV_UB_MEM_TRANSPORT_H
12 : #define AIV_UB_MEM_TRANSPORT_H
13 : #include <mutex>
14 : #include "hccl/hccl_res.h"
15 : #include "../../../../../../legacy/ascend950/unified_platform/resource/socket/socket.h"
16 : #include "../../../../../../legacy/ascend950/unified_platform/resource/buffer/local_ipc_rma_buffer.h"
17 : #include "../../../../../../legacy/ascend950/unified_platform/resource/buffer/remote_rma_buffer.h"
18 : #include "binary_stream.h"
19 : #include "buffer.h"
20 : #include "transport_status.h"
21 :
22 : namespace hcomm {
23 : class AivUbMemTransport{
24 : public:
25 33 : MAKE_ENUM(AivUbMemTransportStatus, INIT, SOCKET_OK, SEND_DATA_SIZE, RECV_DATA_SIZE, SEND_MEM_INFO, RECV_MEM_INFO,
26 : RECV_MEM_FIN, CONNECT_FAILED, SOCKET_TIMEOUT, READY);
27 : AivUbMemTransport(Hccl::Socket *socket, HcommChannelDesc &channelDesc);
28 9 : ~AivUbMemTransport() = default;
29 : HcclResult FillBufferVec(HcommMemHandle *memHandles, uint32_t bufferNum,
30 : std::vector<Hccl::LocalIpcRmaBuffer *> &bufferVec);
31 : HcclResult Init();
32 : Hccl::TransportStatus GetStatus();
33 : HcclResult GetRemoteMems(uint32_t *memNum, CommMem **remoteMem, char ***memInfos);
34 : HcclResult CheckSocketStatus(std::string socketOperator);
35 : HcclResult UpdateMemInfo(HcommMemHandle *memHandles, uint32_t memHandleNum);
36 :
37 : private:
38 : Hccl::Socket *socket_{}; // 交换所用的socket
39 : HcommChannelDesc channelDesc_;
40 : uint32_t exchangeDataSize_{0};
41 : std::vector<CommMem> remoteUserMems_; // 储存内存位置、地址和大小信息
42 : std::vector<std::string> memInfoCopies_; // 储存memInfo字符串副本
43 : std::vector<char*> memInfoPointers_; // 储存指针
44 : bool cacheValid_ = false; // 当前缓存是否有效
45 :
46 : std::vector<Hccl::LocalIpcRmaBuffer *> localRmaBufferVec_{};
47 : std::vector<Hccl::LocalIpcRmaBuffer *> locMemTemp_{};
48 : std::vector<std::unique_ptr<Hccl::RemoteIpcRmaBuffer>> rmtBufferVec_{};
49 : std::vector<Hccl::RemoteRmaBuffer *> rmtRmaBufferVec_{};
50 : AivUbMemTransportStatus aivUbStatus_{AivUbMemTransportStatus::INVALID};
51 : Hccl::TransportStatus baseStatus_{Hccl::TransportStatus::INVALID};
52 : std::mutex remoteMemsMutex_; // 远端内存列表互斥锁
53 :
54 : std::vector<char> sendData_{};
55 : std::vector<char> recvData_{};
56 :
57 : HcclResult IsSocketReady(bool &isReady);
58 : HcclResult SendDataSize();
59 : HcclResult RecvDataSize();
60 : HcclResult SendMemInfo();
61 : HcclResult RecvMemInfo();
62 : HcclResult RecvDataProcess();
63 : HcclResult BufferPack(Hccl::BinaryStream &binaryStream, std::vector<Hccl::LocalIpcRmaBuffer *> &bufferVec);
64 : void RmtBufferUnpackProc(Hccl::BinaryStream &binaryStream);
65 : HcclResult StateMachine();
66 : Hccl::TransportStatus UpdateStatus();
67 : void CheckStatusFuncResult(std::string funcName, HcclResult ret);
68 : };
69 :
70 : } // namespace hcomm
71 :
72 : #endif // AIV_UB_MEM_TRANSPORT_H
|