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 "hccl_aicpu_transport_interface.h"
12 :
13 : #include <sstream>
14 : #include "common/aicpu_hccl_def.h"
15 : #include "common/aicpu_sqe_context.h"
16 : #include "profiling_manager_device.h"
17 : #include "framework/aicpu_hccl_process.h"
18 : #include "utils/hccl_aicpu_utils.h"
19 :
20 : extern "C" {
21 0 : __attribute__((visibility("default"))) uint32_t RunTransportRoceTx(void *args)
22 : {
23 0 : CHK_PTR_NULL(args);
24 0 : PostSendTaskParam *SRInfo = reinterpret_cast<PostSendTaskParam *>(args);
25 : // Check Local Flag
26 0 : uint32_t lfKey = SRInfo->lfKey;
27 0 : uint32_t rfKey = SRInfo->rfKey;
28 0 : HcclQpInfoV2 qpInfo = SRInfo->qpInfo;
29 0 : hccl::Transport::Buffer localFlagBufforWrite[3];
30 0 : hccl::Transport::Buffer localFlagBufforCheck[3];
31 0 : hccl::Transport::Buffer remoteFlagBuf[3];
32 0 : uint32_t *lFlagAddr = reinterpret_cast<uint32_t *>(SRInfo->localFlagAddr);
33 0 : uint32_t *rFlagAddr = reinterpret_cast<uint32_t *>(SRInfo->remoteFlagAddr);
34 0 : const uint64_t timeout = SRInfo->timeOut;
35 :
36 : // Init Flag Area
37 0 : HcclResult ret =AicpuHcclProcess::InitAsyncFlag(lFlagAddr, rFlagAddr, localFlagBufforCheck,
38 : localFlagBufforWrite, remoteFlagBuf);
39 0 : if(ret != HCCL_SUCCESS) {
40 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]InitAsyncFlag Failed, lFlagAddr is [%p], rFlagAddr is [%p], "
41 : "localFlagBufforCheck is [%p], localFlagBufforWrite is [%p], remoteFlagBuf is [%p]"
42 : "remoteFlagBuf.size is [%u]", lFlagAddr, rFlagAddr, localFlagBufforCheck, localFlagBufforWrite, remoteFlagBuf);
43 0 : return ret;
44 : }
45 : // start write flag 1
46 0 : ret = HcclAicpuUtils::PostSend(lfKey, rfKey, qpInfo, remoteFlagBuf[0], localFlagBufforWrite[0], true); // RDMA WriteFlag
47 0 : if(ret != HCCL_SUCCESS) {
48 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]PostSendFlag Failed, lfKey is [%u], rfKey is [%u], qpInfo.qpPtr is [%p]"
49 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
50 : "remoteFlagBuf.size is [%u]", lfKey, rfKey, qpInfo.qpPtr, localFlagBufforWrite[0].addr,
51 : localFlagBufforWrite[0].size, remoteFlagBuf[0].addr, remoteFlagBuf[0].size);
52 0 : return ret;
53 : }
54 : // 轮询等待flag 1
55 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 1, timeout);
56 0 : if(ret != HCCL_SUCCESS) {
57 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
58 0 : return ret;
59 : }
60 : // 向对端开始写数据
61 0 : uint32_t lKey = SRInfo->lKey;
62 0 : uint32_t rKey = SRInfo->rKey;
63 0 : hccl::Transport::Buffer remoteBuf;
64 0 : remoteBuf.addr = reinterpret_cast<void *>(SRInfo->remoteAddr);
65 0 : remoteBuf.size = static_cast<uint32_t>(SRInfo->dataSize);
66 0 : hccl::Transport::Buffer localBuf;
67 0 : localBuf.addr = reinterpret_cast<void *>(SRInfo->localAddr);
68 0 : localBuf.size = static_cast<uint32_t>(SRInfo->dataSize);
69 0 : ret = HcclAicpuUtils::PostSend(lKey, rKey, qpInfo, remoteBuf, localBuf, true); // RDMA WriteData
70 0 : if(ret != HCCL_SUCCESS) {
71 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]PostSendData Failed, lKey is [%u], rKey is [%u],"
72 : "qpInfo.qpPtr is [%llx],remoteBuf.addr is [%llx], remoteBuf.size is [%u], localBuf.addr is [%llx],"
73 : "localBuf.size is [%u]",lKey, rKey,qpInfo.qpPtr, remoteBuf.addr, remoteBuf.size,localBuf.addr, localBuf.size);
74 0 : return ret;
75 : }
76 :
77 : // 写完数据发个flag 2,告知对端数据已经写过去了
78 0 : ret = HcclAicpuUtils::PostSend(lfKey, rfKey, qpInfo, remoteFlagBuf[1], localFlagBufforWrite[1], true); // RDMA WriteFlag
79 0 : if(ret != HCCL_SUCCESS) {
80 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]PostSendFlag Failed, now Operation is WriteFlag, lfKey is [%u], rfKey is [%u],"
81 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
82 : "remoteFlagBuf.size is [%u]", lfKey, rfKey, localFlagBufforWrite[1].addr, localFlagBufforWrite[1].size,
83 : remoteFlagBuf[1].addr, remoteFlagBuf[1].size);
84 0 : return ret;
85 : }
86 : // 轮询等待flag 2
87 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 2, timeout);
88 0 : if(ret != HCCL_SUCCESS) {
89 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
90 0 : return ret;
91 : }
92 : // 再发个flag 3,尾同步
93 0 : ret = HcclAicpuUtils::PostSend(lfKey, rfKey, qpInfo, remoteFlagBuf[2], localFlagBufforWrite[2], true); // RDMA WriteFlag
94 0 : if(ret != HCCL_SUCCESS) {
95 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]PostSendFlag Failed, now Operation is WriteFlag, lfKey is [%u], rfKey is [%u],"
96 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
97 : "remoteFlagBuf.size is [%u]", lfKey, rfKey, localFlagBufforWrite[2].addr, localFlagBufforWrite[2].size,
98 : remoteFlagBuf[2].addr, remoteFlagBuf[2].size);
99 0 : return ret;
100 : }
101 : // 轮询等待flag 3
102 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 3, timeout);
103 0 : if(ret != HCCL_SUCCESS) {
104 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
105 0 : return ret;
106 : }
107 0 : HCCL_INFO("[AiCpuKernel][RunTransportRoceTx]Kernel run success");
108 0 : return HCCL_SUCCESS;
109 : }
110 :
111 0 : __attribute__((visibility("default"))) uint32_t RunTransportRoceRx(void *args)
112 : {
113 0 : CHK_PTR_NULL(args);
114 0 : PostSendTaskParam *SRInfo = reinterpret_cast<PostSendTaskParam *>(args);
115 0 : HcclQpInfoV2 qpInfo = SRInfo->qpInfo;
116 0 : uint32_t lfKey = SRInfo->lfKey;
117 0 : uint32_t rfKey = SRInfo->rfKey;
118 0 : hccl::Transport::Buffer localFlagBufforWrite[3];
119 0 : hccl::Transport::Buffer localFlagBufforCheck[3];
120 0 : hccl::Transport::Buffer remoteFlagBuf[3];
121 :
122 0 : uint32_t *lFlagAddr = reinterpret_cast<uint32_t *>(SRInfo->localFlagAddr);
123 0 : uint32_t *rFlagAddr = reinterpret_cast<uint32_t *>(SRInfo->remoteFlagAddr);
124 0 : uint64_t timeout = SRInfo->timeOut;
125 : // Init Flag Area
126 0 : HcclResult ret =AicpuHcclProcess::InitAsyncFlag(lFlagAddr, rFlagAddr, localFlagBufforCheck,
127 : localFlagBufforWrite, remoteFlagBuf);
128 0 : if(ret != HCCL_SUCCESS) {
129 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]InitAsyncFlag Failed, lFlagAddr is [%p], rFlagAddr is [%p], "
130 : "localFlagBufforCheck is [%p], localFlagBufforWrite is [%p], remoteFlagBuf is [%p]"
131 : "remoteFlagBuf.size is [%u]", lFlagAddr, rFlagAddr, localFlagBufforCheck, localFlagBufforWrite, remoteFlagBuf);
132 0 : return ret;
133 : }
134 : // start write flag 1
135 0 : ret = HcclAicpuUtils::PostSend(lfKey, rfKey, qpInfo, remoteFlagBuf[0], localFlagBufforWrite[0], true); // RDMA WriteFlag
136 0 : if(ret != HCCL_SUCCESS) {
137 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceRx]PostSendFlag Failed, lfKey is [%u], rfKey is [%u], qpInfo.qpPtr is [%p]"
138 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
139 : "remoteFlagBuf.size is [%u]", lfKey, rfKey, qpInfo.qpPtr, localFlagBufforWrite[0].addr,
140 : localFlagBufforWrite[0].size, remoteFlagBuf[0].addr, remoteFlagBuf[0].size);
141 0 : return ret;
142 : }
143 : // 轮询等待flag 1
144 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 1, timeout);
145 0 : if(ret != HCCL_SUCCESS) {
146 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceRx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
147 0 : return ret;
148 : }
149 :
150 0 : ret = HcclAicpuUtils::PostSend(lfKey, rfKey, qpInfo, remoteFlagBuf[1], localFlagBufforWrite[1], true); // RDMA WriteFlag
151 0 : if(ret != HCCL_SUCCESS) {
152 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceRx]PostSendFlag Failed, now Operation is WriteFlag, lfKey is [%u], rfKey is [%u],"
153 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
154 : "remoteFlagBuf.size is [%u]", lfKey, rfKey, localFlagBufforWrite[1].addr, localFlagBufforWrite[1].size,
155 : remoteFlagBuf[1].addr, remoteFlagBuf[1].size);
156 0 : return ret;
157 : }
158 : // 轮询等待flag 2
159 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 2, timeout);
160 0 : if(ret != HCCL_SUCCESS) {
161 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceRx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
162 0 : return ret;
163 : }
164 : // 再发个flag 3,尾同步
165 0 : ret = HcclAicpuUtils::PostSend(lfKey, rfKey, qpInfo, remoteFlagBuf[2], localFlagBufforWrite[2], true); // RDMA WriteFlag
166 0 : if(ret != HCCL_SUCCESS) {
167 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceRx]PostSendFlag Failed, now Operation is WriteFlag, lfKey is [%u], rfKey is [%u],"
168 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
169 : "remoteFlagBuf.size is [%u]", lfKey, rfKey, localFlagBufforWrite[2].addr, localFlagBufforWrite[2].size,
170 : remoteFlagBuf[2].addr, remoteFlagBuf[2].size);
171 0 : return ret;
172 : }
173 : // 轮询等待flag 3
174 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 3, timeout);
175 0 : if(ret != HCCL_SUCCESS) {
176 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceRx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
177 0 : return ret;
178 : }
179 0 : HCCL_INFO("[AiCpuKernel][RunTransportRoceRx]Kernel run success");
180 0 : return HCCL_SUCCESS;
181 : }
182 : } // extern "C"
|