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(
38 : lFlagAddr, rFlagAddr, localFlagBufforCheck, localFlagBufforWrite, remoteFlagBuf);
39 0 : if (ret != HCCL_SUCCESS) {
40 0 : HCCL_ERROR(
41 : "[AiCpuKernel][RunTransportRoceTx]InitAsyncFlag Failed, lFlagAddr is [%p], rFlagAddr is [%p], "
42 : "localFlagBufforCheck is [%p], localFlagBufforWrite is [%p], remoteFlagBuf is [%p]"
43 : "remoteFlagBuf.size is [%u]",
44 : lFlagAddr, rFlagAddr, localFlagBufforCheck, localFlagBufforWrite, remoteFlagBuf);
45 0 : return ret;
46 : }
47 : // start write flag 1
48 0 : ret = HcclAicpuUtils::PostSend(
49 : lfKey, rfKey, qpInfo, remoteFlagBuf[0], localFlagBufforWrite[0], true); // RDMA WriteFlag
50 0 : if (ret != HCCL_SUCCESS) {
51 0 : HCCL_ERROR(
52 : "[AiCpuKernel][RunTransportRoceTx]PostSendFlag Failed, lfKey is [%u], rfKey is [%u], qpInfo.qpPtr is [%p]"
53 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
54 : "remoteFlagBuf.size is [%u]",
55 : lfKey, rfKey, qpInfo.qpPtr, localFlagBufforWrite[0].addr, localFlagBufforWrite[0].size,
56 : remoteFlagBuf[0].addr, remoteFlagBuf[0].size);
57 0 : return ret;
58 : }
59 : // 轮询等待flag 1
60 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 1, timeout);
61 0 : if (ret != HCCL_SUCCESS) {
62 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
63 0 : return ret;
64 : }
65 : // 向对端开始写数据
66 0 : uint32_t lKey = SRInfo->lKey;
67 0 : uint32_t rKey = SRInfo->rKey;
68 0 : hccl::Transport::Buffer remoteBuf;
69 0 : remoteBuf.addr = reinterpret_cast<void*>(SRInfo->remoteAddr);
70 0 : remoteBuf.size = static_cast<uint32_t>(SRInfo->dataSize);
71 0 : hccl::Transport::Buffer localBuf;
72 0 : localBuf.addr = reinterpret_cast<void*>(SRInfo->localAddr);
73 0 : localBuf.size = static_cast<uint32_t>(SRInfo->dataSize);
74 0 : ret = HcclAicpuUtils::PostSend(lKey, rKey, qpInfo, remoteBuf, localBuf, true); // RDMA WriteData
75 0 : if (ret != HCCL_SUCCESS) {
76 0 : HCCL_ERROR(
77 : "[AiCpuKernel][RunTransportRoceTx]PostSendData Failed, lKey is [%u], rKey is [%u],"
78 : "qpInfo.qpPtr is [%llx],remoteBuf.addr is [%llx], remoteBuf.size is [%u], localBuf.addr is [%llx],"
79 : "localBuf.size is [%u]",
80 : lKey, rKey, qpInfo.qpPtr, remoteBuf.addr, remoteBuf.size, localBuf.addr, localBuf.size);
81 0 : return ret;
82 : }
83 :
84 : // 写完数据发个flag 2,告知对端数据已经写过去了
85 0 : ret = HcclAicpuUtils::PostSend(
86 : lfKey, rfKey, qpInfo, remoteFlagBuf[1], localFlagBufforWrite[1], true); // RDMA WriteFlag
87 0 : if (ret != HCCL_SUCCESS) {
88 0 : HCCL_ERROR(
89 : "[AiCpuKernel][RunTransportRoceTx]PostSendFlag Failed, now Operation is WriteFlag, lfKey is [%u], rfKey is "
90 : "[%u],"
91 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
92 : "remoteFlagBuf.size is [%u]",
93 : lfKey, rfKey, localFlagBufforWrite[1].addr, localFlagBufforWrite[1].size, remoteFlagBuf[1].addr,
94 : remoteFlagBuf[1].size);
95 0 : return ret;
96 : }
97 : // 轮询等待flag 2
98 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 2, timeout);
99 0 : if (ret != HCCL_SUCCESS) {
100 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
101 0 : return ret;
102 : }
103 : // 再发个flag 3,尾同步
104 0 : ret = HcclAicpuUtils::PostSend(
105 : lfKey, rfKey, qpInfo, remoteFlagBuf[2], localFlagBufforWrite[2], true); // RDMA WriteFlag
106 0 : if (ret != HCCL_SUCCESS) {
107 0 : HCCL_ERROR(
108 : "[AiCpuKernel][RunTransportRoceTx]PostSendFlag Failed, now Operation is WriteFlag, lfKey is [%u], rfKey is "
109 : "[%u],"
110 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
111 : "remoteFlagBuf.size is [%u]",
112 : lfKey, rfKey, localFlagBufforWrite[2].addr, localFlagBufforWrite[2].size, remoteFlagBuf[2].addr,
113 : remoteFlagBuf[2].size);
114 0 : return ret;
115 : }
116 : // 轮询等待flag 3
117 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 3, timeout);
118 0 : if (ret != HCCL_SUCCESS) {
119 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceTx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
120 0 : return ret;
121 : }
122 0 : HCCL_INFO("[AiCpuKernel][RunTransportRoceTx]Kernel run success");
123 0 : return HCCL_SUCCESS;
124 : }
125 :
126 0 : __attribute__((visibility("default"))) uint32_t RunTransportRoceRx(void* args)
127 : {
128 0 : CHK_PTR_NULL(args);
129 0 : PostSendTaskParam* SRInfo = reinterpret_cast<PostSendTaskParam*>(args);
130 0 : HcclQpInfoV2 qpInfo = SRInfo->qpInfo;
131 0 : uint32_t lfKey = SRInfo->lfKey;
132 0 : uint32_t rfKey = SRInfo->rfKey;
133 0 : hccl::Transport::Buffer localFlagBufforWrite[3];
134 0 : hccl::Transport::Buffer localFlagBufforCheck[3];
135 0 : hccl::Transport::Buffer remoteFlagBuf[3];
136 :
137 0 : uint32_t* lFlagAddr = reinterpret_cast<uint32_t*>(SRInfo->localFlagAddr);
138 0 : uint32_t* rFlagAddr = reinterpret_cast<uint32_t*>(SRInfo->remoteFlagAddr);
139 0 : uint64_t timeout = SRInfo->timeOut;
140 : // Init Flag Area
141 0 : HcclResult ret = AicpuHcclProcess::InitAsyncFlag(
142 : lFlagAddr, rFlagAddr, localFlagBufforCheck, localFlagBufforWrite, remoteFlagBuf);
143 0 : if (ret != HCCL_SUCCESS) {
144 0 : HCCL_ERROR(
145 : "[AiCpuKernel][RunTransportRoceTx]InitAsyncFlag Failed, lFlagAddr is [%p], rFlagAddr is [%p], "
146 : "localFlagBufforCheck is [%p], localFlagBufforWrite is [%p], remoteFlagBuf is [%p]"
147 : "remoteFlagBuf.size is [%u]",
148 : lFlagAddr, rFlagAddr, localFlagBufforCheck, localFlagBufforWrite, remoteFlagBuf);
149 0 : return ret;
150 : }
151 : // start write flag 1
152 0 : ret = HcclAicpuUtils::PostSend(
153 : lfKey, rfKey, qpInfo, remoteFlagBuf[0], localFlagBufforWrite[0], true); // RDMA WriteFlag
154 0 : if (ret != HCCL_SUCCESS) {
155 0 : HCCL_ERROR(
156 : "[AiCpuKernel][RunTransportRoceRx]PostSendFlag Failed, lfKey is [%u], rfKey is [%u], qpInfo.qpPtr is [%p]"
157 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
158 : "remoteFlagBuf.size is [%u]",
159 : lfKey, rfKey, qpInfo.qpPtr, localFlagBufforWrite[0].addr, localFlagBufforWrite[0].size,
160 : remoteFlagBuf[0].addr, remoteFlagBuf[0].size);
161 0 : return ret;
162 : }
163 : // 轮询等待flag 1
164 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 1, timeout);
165 0 : if (ret != HCCL_SUCCESS) {
166 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceRx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
167 0 : return ret;
168 : }
169 :
170 0 : ret = HcclAicpuUtils::PostSend(
171 : lfKey, rfKey, qpInfo, remoteFlagBuf[1], localFlagBufforWrite[1], true); // RDMA WriteFlag
172 0 : if (ret != HCCL_SUCCESS) {
173 0 : HCCL_ERROR(
174 : "[AiCpuKernel][RunTransportRoceRx]PostSendFlag Failed, now Operation is WriteFlag, lfKey is [%u], rfKey is "
175 : "[%u],"
176 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
177 : "remoteFlagBuf.size is [%u]",
178 : lfKey, rfKey, localFlagBufforWrite[1].addr, localFlagBufforWrite[1].size, remoteFlagBuf[1].addr,
179 : remoteFlagBuf[1].size);
180 0 : return ret;
181 : }
182 : // 轮询等待flag 2
183 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 2, timeout);
184 0 : if (ret != HCCL_SUCCESS) {
185 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceRx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
186 0 : return ret;
187 : }
188 : // 再发个flag 3,尾同步
189 0 : ret = HcclAicpuUtils::PostSend(
190 : lfKey, rfKey, qpInfo, remoteFlagBuf[2], localFlagBufforWrite[2], true); // RDMA WriteFlag
191 0 : if (ret != HCCL_SUCCESS) {
192 0 : HCCL_ERROR(
193 : "[AiCpuKernel][RunTransportRoceRx]PostSendFlag Failed, now Operation is WriteFlag, lfKey is [%u], rfKey is "
194 : "[%u],"
195 : "localFlagBufforWrite.addr is [%llx], localFlagBufforWrite.size is [%u],remoteFlagBuf.addr is [%llx],"
196 : "remoteFlagBuf.size is [%u]",
197 : lfKey, rfKey, localFlagBufforWrite[2].addr, localFlagBufforWrite[2].size, remoteFlagBuf[2].addr,
198 : remoteFlagBuf[2].size);
199 0 : return ret;
200 : }
201 : // 轮询等待flag 3
202 0 : ret = AicpuHcclProcess::WaitAsyncFlag(localFlagBufforCheck, 3, timeout);
203 0 : if (ret != HCCL_SUCCESS) {
204 0 : HCCL_ERROR("[AiCpuKernel][RunTransportRoceRx]WaitFlag Failed lfKey %u rfKey %u.", lfKey, rfKey);
205 0 : return ret;
206 : }
207 0 : HCCL_INFO("[AiCpuKernel][RunTransportRoceRx]Kernel run success");
208 0 : return HCCL_SUCCESS;
209 : }
210 : } // extern "C"
|