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 HCCLV2_ALG_DATA_TRANS_WRAPPER
12 : #define HCCLV2_ALG_DATA_TRANS_WRAPPER
13 :
14 : #include <vector>
15 : #include "data_type.h"
16 : #include "reduce_op.h"
17 :
18 : #include "coll_alg_params.h"
19 : #include "virtual_topo.h"
20 : #include "connected_link_mgr.h"
21 : #include "dev_capability.h"
22 : #include "primitive.h"
23 : #include "prim_queue.h"
24 : #include "instruction.h"
25 : #include "ins_queue.h"
26 :
27 : namespace Hccl {
28 : using InsQuePtr = std::shared_ptr<InsQueue>;
29 :
30 : using SlicesList = struct SlicesListDef {
31 : std::vector<DataSlice> srcSlices_;
32 : std::vector<DataSlice> dstSlices_;
33 :
34 0 : SlicesListDef(const std::vector<DataSlice>& srcSlices, const std::vector<DataSlice>& dstSlices)
35 0 : : srcSlices_(srcSlices),
36 0 : dstSlices_(dstSlices)
37 0 : {}
38 : };
39 :
40 : using ReduceSlicesList = struct ReduceSlicesListDef {
41 : std::vector<DataSlice> srcSlices_;
42 : std::vector<DataSlice> dstSlices_;
43 : DataType dataType_;
44 : ReduceOp reduceOp_;
45 :
46 : ReduceSlicesListDef(
47 : const std::vector<DataSlice>& srcSlices, const std::vector<DataSlice>& dstSlices, const DataType& dataType,
48 : const ReduceOp& reduceOp)
49 : : srcSlices_(srcSlices),
50 : dstSlices_(dstSlices),
51 : dataType_(dataType),
52 : reduceOp_(reduceOp)
53 : {}
54 0 : ReduceSlicesListDef(const SlicesList& slices, const DataType& dataType, const ReduceOp& reduceOp)
55 0 : : srcSlices_(slices.srcSlices_),
56 0 : dstSlices_(slices.dstSlices_),
57 0 : dataType_(dataType),
58 0 : reduceOp_(reduceOp)
59 0 : {}
60 : };
61 :
62 : using TxRxSlicesList = struct TxRxSlicesListDef {
63 : SlicesList txSlicesList_;
64 : SlicesList rxSlicesList_;
65 :
66 0 : TxRxSlicesListDef(const SlicesList& txSlicesList, const SlicesList& rxSlicesList)
67 0 : : txSlicesList_(txSlicesList),
68 0 : rxSlicesList_(rxSlicesList)
69 0 : {}
70 : };
71 :
72 : using TxRxReduceSlicesList = struct TxRxReduceSliceInfoDef {
73 : SlicesList txSlicesList_;
74 : SlicesList rxSlicesList_;
75 : DataType dataType_;
76 : ReduceOp reduceOp_;
77 :
78 : TxRxReduceSliceInfoDef(
79 : const SlicesList& txSlicesList, const SlicesList& rxSlicesList, const DataType dataType,
80 : const ReduceOp reduceOp)
81 : : txSlicesList_(txSlicesList),
82 : rxSlicesList_(rxSlicesList),
83 : dataType_(dataType),
84 : reduceOp_(reduceOp)
85 : {}
86 :
87 0 : TxRxReduceSliceInfoDef(const TxRxSlicesList& slices, const DataType dataType, const ReduceOp reduceOp)
88 0 : : txSlicesList_(slices.txSlicesList_),
89 0 : rxSlicesList_(slices.rxSlicesList_),
90 0 : dataType_(dataType),
91 0 : reduceOp_(reduceOp)
92 0 : {}
93 : };
94 :
95 : using TxRxLinks = struct TxRxLinkDef {
96 : LinkData txLink_;
97 : LinkData rxLink_;
98 :
99 0 : TxRxLinkDef(const LinkData& txLink, const LinkData& rxLink) : txLink_(txLink), rxLink_(rxLink) {}
100 : };
101 :
102 : using DataInfo = struct DataInfoDef {
103 : LinkData link_;
104 : SlicesList slices_;
105 :
106 0 : DataInfoDef(const LinkData& link, const SlicesList& slices) : link_(link), slices_(slices) {}
107 : };
108 :
109 : using SendRecvInfo = struct SendRecvInfoDef {
110 : TxRxLinks sendRecvLinks_;
111 : TxRxSlicesList sendRecvSlices_;
112 :
113 0 : SendRecvInfoDef(const TxRxLinks& sendRecvLinks, const TxRxSlicesList& sendRecvSlices)
114 0 : : sendRecvLinks_(sendRecvLinks),
115 0 : sendRecvSlices_(sendRecvSlices)
116 0 : {}
117 : };
118 :
119 : using DataReduceInfo = struct DataReduceInfoDef {
120 : LinkData link_;
121 : SlicesList slices_;
122 : DataType dataType_;
123 : ReduceOp reduceOp_;
124 :
125 : DataReduceInfoDef(const LinkData& link, const SlicesList& slices, const DataType dataType, const ReduceOp reduceOp)
126 : : link_(link),
127 : slices_(slices),
128 : dataType_(dataType),
129 : reduceOp_(reduceOp)
130 : {}
131 : };
132 :
133 : using SendRecvReduceInfo = struct SendRecvReduceInfoDef {
134 : TxRxLinks sendRecvLinks_;
135 : TxRxSlicesList sendRecvSlices_;
136 : DataType dataType_;
137 : ReduceOp reduceOp_;
138 :
139 0 : SendRecvReduceInfoDef(
140 : const TxRxLinks& sendRecvLinks, const TxRxSlicesList& sendRecvSlices, const DataType dataType,
141 : const ReduceOp reduceOp)
142 0 : : sendRecvLinks_(sendRecvLinks),
143 0 : sendRecvSlices_(sendRecvSlices),
144 0 : dataType_(dataType),
145 0 : reduceOp_(reduceOp)
146 0 : {}
147 : };
148 :
149 : using MultiDataInfo = struct MultiDataInfoDef {
150 : std::vector<LinkData>& links_;
151 : std::vector<SlicesList>& slices_;
152 :
153 : MultiDataInfoDef(std::vector<LinkData>& links, std::vector<SlicesList>& slices) : links_(links), slices_(slices) {}
154 : };
155 :
156 : using MultiSendRecvInfo = struct MultiSendRecvInfoDef {
157 : std::vector<TxRxLinks>& txRxLinks_;
158 : std::vector<TxRxSlicesList>& txRxSlices_;
159 :
160 : MultiSendRecvInfoDef(std::vector<TxRxLinks>& txRxLinks, std::vector<TxRxSlicesList>& txRxSlices)
161 : : txRxLinks_(txRxLinks),
162 : txRxSlices_(txRxSlices)
163 : {}
164 : };
165 :
166 : using MultiDataReduceInfo = struct MultiDataReduceInfoDef {
167 : std::vector<LinkData>& links_;
168 : std::vector<ReduceSlicesList>& slices_;
169 :
170 : MultiDataReduceInfoDef(std::vector<LinkData>& links, std::vector<ReduceSlicesList>& slices)
171 : : links_(links),
172 : slices_(slices)
173 : {}
174 : };
175 :
176 : using MultiSendRecvReduceInfo = struct MultiSendRecvReduceInfoDef {
177 : std::vector<TxRxLinks>& txRxLinks_;
178 : std::vector<TxRxReduceSlicesList>& txRxSlices_;
179 :
180 : MultiSendRecvReduceInfoDef(std::vector<TxRxLinks>& txRxLinks, std::vector<TxRxReduceSlicesList>& txRxSlices)
181 : : txRxLinks_(txRxLinks),
182 : txRxSlices_(txRxSlices)
183 : {}
184 : };
185 :
186 : using SlicePair = struct SlicePairDef {
187 : DataSlice srcSlice_;
188 : DataSlice dstSlice_;
189 : DataType dataType_;
190 : ReduceOp reduceOp_;
191 :
192 0 : SlicePairDef(const DataSlice& srcSlice, const DataSlice& dstSlice) : srcSlice_(srcSlice), dstSlice_(dstSlice) {}
193 : };
194 :
195 : using TransSlicesInfo = struct TransSlicesInfoDef {
196 : bool reduceFlag;
197 :
198 : std::vector<DataSlice> srcSlices;
199 : std::vector<DataSlice> dstSlices;
200 : DataType dataType_;
201 : ReduceOp reduceOp_;
202 :
203 : bool enableCounterNotify_;
204 :
205 0 : explicit TransSlicesInfoDef(const SlicesList& slices, const bool enableCounterNotify = false)
206 0 : : reduceFlag(false),
207 0 : srcSlices(slices.srcSlices_),
208 0 : dstSlices(slices.dstSlices_),
209 0 : enableCounterNotify_(enableCounterNotify)
210 0 : {}
211 :
212 0 : TransSlicesInfoDef(
213 : const SlicesList& slices, const DataType dataType, const ReduceOp reduceOp,
214 : const bool enableCounterNotify = false)
215 0 : : reduceFlag(true),
216 0 : srcSlices(slices.srcSlices_),
217 0 : dstSlices(slices.dstSlices_),
218 0 : dataType_(dataType),
219 0 : reduceOp_(reduceOp),
220 0 : enableCounterNotify_(enableCounterNotify)
221 0 : {}
222 :
223 0 : explicit TransSlicesInfoDef(const ReduceSlicesList& slices, const bool enableCounterNotify = false)
224 0 : : reduceFlag(true),
225 0 : srcSlices(slices.srcSlices_),
226 0 : dstSlices(slices.dstSlices_),
227 0 : dataType_(slices.dataType_),
228 0 : reduceOp_(slices.reduceOp_),
229 0 : enableCounterNotify_(enableCounterNotify)
230 0 : {}
231 : };
232 :
233 : using MultiDataLinksDmaModeInfo = struct MultiDataLinksDmaModeInfoDef {
234 : DmaMode modeNeedSync_;
235 : DmaMode modeSet_;
236 :
237 0 : MultiDataLinksDmaModeInfoDef(const DmaMode modeNeedSync, const DmaMode modeSet)
238 0 : : modeNeedSync_(modeNeedSync),
239 0 : modeSet_(modeSet)
240 0 : {}
241 : };
242 :
243 : // mid-level
244 : // sync
245 : HcclResult TxReady(const LinkData& link, InsQuePtr queue, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
246 : HcclResult RxReady(const LinkData& link, InsQuePtr queue, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
247 : HcclResult TxFin(const LinkData& link, InsQuePtr queue, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
248 : HcclResult RxFin(const LinkData& link, InsQuePtr queue, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
249 : HcclResult TxFinAck(const LinkData& link, InsQuePtr queue, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
250 : HcclResult RxFinAck(const LinkData& link, InsQuePtr queue, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
251 :
252 : // data
253 : HcclResult TxData(const LinkData& link, InsQuePtr queue, const SlicesList& slices, DmaMode dmaMode = DmaMode::DEFAULT);
254 : HcclResult RxData(const LinkData& link, InsQuePtr queue, const SlicesList& slices, DmaMode dmaMode = DmaMode::DEFAULT);
255 : HcclResult
256 : TxReduce(const LinkData& link, InsQuePtr queue, const ReduceSlicesList& slices, DmaMode dmaMode = DmaMode::DEFAULT);
257 : HcclResult
258 : RxReduce(const LinkData& link, InsQuePtr queue, const ReduceSlicesList& slices, DmaMode dmaMode = DmaMode::DEFAULT);
259 :
260 : // data with sync
261 : HcclResult TxDataWithFin(
262 : const LinkData& link, InsQuePtr queue, const SlicesList& slices, u32 topicId = 0,
263 : DmaMode dmaMode = DmaMode::DEFAULT);
264 : HcclResult RxDataWithFin(
265 : const LinkData& link, InsQuePtr queue, const SlicesList& slices, u32 topicId = 0,
266 : DmaMode dmaMode = DmaMode::DEFAULT);
267 : HcclResult TxReduceWithFin(
268 : const LinkData& link, InsQuePtr queue, const ReduceSlicesList& slices, u32 topicId = 0,
269 : DmaMode dmaMode = DmaMode::DEFAULT);
270 : HcclResult RxReduceWithFin(
271 : const LinkData& link, InsQuePtr queue, const ReduceSlicesList& slices, u32 topicId = 0,
272 : DmaMode dmaMode = DmaMode::DEFAULT);
273 :
274 : // data with sync in counterNotify mode
275 : HcclResult MultiTxDataWithFinCounter(
276 : const std::vector<LinkData>& links, const std::vector<InsQuePtr>& queues, const std::vector<SlicesList>& slices,
277 : u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
278 : HcclResult MultiRxDataWithFinCounter(
279 : const std::vector<LinkData>& links, const std::vector<InsQuePtr>& queues, const std::vector<SlicesList>& slices,
280 : u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
281 : HcclResult MultiTxReduceWithFinCounter(
282 : const std::vector<LinkData>& links, const std::vector<InsQuePtr>& queues,
283 : const std::vector<ReduceSlicesList>& slices, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
284 : HcclResult MultiRxReduceWithFinCounter(
285 : const std::vector<LinkData>& links, const std::vector<InsQuePtr>& queues,
286 : const std::vector<ReduceSlicesList>& slices, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
287 :
288 : // sync
289 : HcclResult TxRxReady(const TxRxLinks& txRxlinks, InsQuePtr queue, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
290 : HcclResult TxRxFin(const TxRxLinks& txRxlinks, InsQuePtr queue, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
291 : HcclResult TxRxFinAck(const TxRxLinks& txRxlinks, InsQuePtr queue, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
292 :
293 : // data
294 : HcclResult TxRxData(
295 : const TxRxLinks& txRxlinks, InsQuePtr queue, const TxRxSlicesList& txRxSlices, DmaMode dmaMode = DmaMode::DEFAULT);
296 : HcclResult TxRxReduce(
297 : const TxRxLinks& txRxlinks, InsQuePtr queue, const TxRxReduceSlicesList& txRxSlices,
298 : DmaMode dmaMode = DmaMode::DEFAULT);
299 :
300 : // data with sync
301 : HcclResult TxRxDataWithFin(
302 : const TxRxLinks& txRxlinks, InsQuePtr queue, const TxRxSlicesList& txRxSlices, u32 topicId = 0,
303 : DmaMode dmaMode = DmaMode::DEFAULT);
304 : HcclResult TxRxReduceWithFin(
305 : const TxRxLinks& txRxlinks, InsQuePtr queue, const TxRxReduceSlicesList& txRxSlices, u32 topicId = 0,
306 : DmaMode dmaMode = DmaMode::DEFAULT);
307 :
308 : HcclResult MultiTxRxDataWithFinCounter(
309 : const std::vector<TxRxLinks>& links, const std::vector<InsQuePtr>& queues,
310 : const std::vector<TxRxSlicesList>& slices, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
311 : HcclResult MultiTxRxReduceWithFinCounter(
312 : const std::vector<TxRxLinks>& links, const std::vector<InsQuePtr>& queues,
313 : const std::vector<TxRxReduceSlicesList>& slices, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
314 :
315 : // else
316 : HcclResult LocalCopy(InsQuePtr queue, const DataSlice& srcSlice, const DataSlice& dstSlice);
317 : HcclResult LocalCopySlices(
318 : InsQuePtr queue, const std::vector<DataSlice>& srcSlices,
319 : const std::vector<DataSlice>& dstSlices); // 支持连续数据片融合,未来支持strideCount
320 : HcclResult LocalReduce(
321 : InsQuePtr queue, const DataSlice& srcSlice, const DataSlice& dstSlice, const DataType dataType,
322 : const ReduceOp reduceOp);
323 : HcclResult LocalReduceSlices(
324 : InsQuePtr queue, const std::vector<DataSlice>& srcSlices, const std::vector<DataSlice>& dstSlices,
325 : const DataType dataType, const ReduceOp reduceOp);
326 : HcclResult AicpuReduce(
327 : InsQuePtr queue, const DataSlice& srcSlice, const DataSlice& dstSlice, const DataType dataType,
328 : const ReduceOp reduceOp);
329 : HcclResult AicpuReduceSlices(
330 : InsQuePtr queue, const std::vector<DataSlice>& srcSlices, const std::vector<DataSlice>& dstSlices,
331 : const DataType dataType, const ReduceOp reduceOp);
332 :
333 : HcclResult StreamSync(std::vector<InsQuePtr>& queues);
334 :
335 : HcclResult PreSyncQues(
336 : const std::vector<InsQuePtr>& syncQueues, const u32 postQueIdx, u32 topicId = 0, bool enableCounterNotify = false);
337 : HcclResult PostSyncQues(
338 : const std::vector<InsQuePtr>& syncQueues, const u32 waitQueIdx, u32 topicId = 0, bool enableCounterNotify = false);
339 :
340 : // high-level
341 : HcclResult Send(
342 : const DataInfo& sendInfo, InsQuePtr queue, u32 topicId = 0, bool needNetFinAck = true,
343 : DmaMode dmaMode = DmaMode::DEFAULT);
344 : HcclResult Recv(
345 : const DataInfo& recvInfo, InsQuePtr queue, u32 topicId = 0, bool needNetFinAck = true,
346 : DmaMode dmaMode = DmaMode::DEFAULT);
347 : HcclResult SendRecv(
348 : const SendRecvInfo& sendRecvInfo, InsQuePtr queue, u32 topicId = 0, bool needNetFinAck = true,
349 : DmaMode dmaMode = DmaMode::DEFAULT);
350 :
351 : HcclResult SendReduce(
352 : const DataReduceInfo& sendReduceInfo, InsQuePtr queue, u32 topicId = 0, bool needNetFinAck = true,
353 : DmaMode dmaMode = DmaMode::DEFAULT);
354 : HcclResult RecvReduce(
355 : const DataReduceInfo& recvReduceInfo, InsQuePtr queue, u32 topicId = 0, bool needNetFinAck = true,
356 : DmaMode dmaMode = DmaMode::DEFAULT);
357 : HcclResult SendRecvReduce(
358 : const SendRecvReduceInfo& sendRecvReduceInfo, InsQuePtr queue, u32 topicId = 0, bool needNetFinAck = true,
359 : DmaMode dmaMode = DmaMode::DEFAULT);
360 :
361 : // Inter-rank CounterNotify is supported when device supports poll cqe
362 : HcclResult MultiSendCounter(
363 : const MultiDataInfo& sendInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
364 : HcclResult MultiRecvCounter(
365 : const MultiDataInfo& recvInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0, DmaMode dmaMode = DmaMode::DEFAULT);
366 : HcclResult MultiSendRecvCounter(
367 : const MultiSendRecvInfo& sendRecvInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0,
368 : DmaMode dmaMode = DmaMode::DEFAULT);
369 :
370 : HcclResult MultiSendReduceCounter(
371 : const MultiDataReduceInfo& sendInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0,
372 : DmaMode dmaMode = DmaMode::DEFAULT);
373 : HcclResult MultiRecvReduceCounter(
374 : const MultiDataReduceInfo& recvInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0,
375 : DmaMode dmaMode = DmaMode::DEFAULT);
376 : HcclResult MultiSendRecvReduceCounter(
377 : const MultiSendRecvReduceInfo& sendRecvInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0,
378 : DmaMode dmaMode = DmaMode::DEFAULT);
379 :
380 : // send/recv through multi links (support detour case)
381 : HcclResult SendThruMultiLinks(
382 : const std::vector<DataInfo>& sendInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0, bool needNetFinAck = true,
383 : DmaMode dmaMode = DmaMode::DEFAULT);
384 : HcclResult RecvThruMultiLinks(
385 : const std::vector<DataInfo>& recvInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0, bool needNetFinAck = true,
386 : DmaMode dmaMode = DmaMode::DEFAULT);
387 : HcclResult SendRecvThruMultiLinks(
388 : const std::vector<SendRecvInfo>& sendRecvInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0,
389 : bool needNetFinAck = true, DmaMode dmaMode = DmaMode::DEFAULT);
390 :
391 : HcclResult SendReduceThruMultiLinks(
392 : const std::vector<DataReduceInfo>& sendReduceInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0,
393 : bool needNetFinAck = true, DmaMode dmaMode = DmaMode::DEFAULT);
394 : HcclResult RecvReduceThruMultiLinks(
395 : const std::vector<DataReduceInfo>& recvReduceInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0,
396 : bool needNetFinAck = true, DmaMode dmaMode = DmaMode::DEFAULT);
397 : HcclResult SendRecvReduceThruMultiLinks(
398 : const std::vector<SendRecvReduceInfo>& sendRecvReduceInfo, std::vector<InsQuePtr>& queues, u32 topicId = 0,
399 : bool needNetFinAck = true, DmaMode dmaMode = DmaMode::DEFAULT);
400 :
401 : // auxiliary functions
402 : HcclResult GetDMAMode(const DmaMode setMode, const PortDeploymentType linkPortType, DmaMode& mode);
403 : bool IsContinuousSlice(const DataSlice& nxtSlice, const DataSlice& currSlice);
404 :
405 : void TransSlice(const LinkData& link, InsQuePtr queue, const SlicePair& txRxSlice, DmaMode dmaMode, bool reduceFlag);
406 : HcclResult TransSlicesLists(const LinkData& link, InsQuePtr queue, const TransSlicesInfo& slices, DmaMode dmaMode);
407 :
408 : HcclResult WriteSlicesListsWithFin(const LinkData& link, InsQuePtr queue, const TransSlicesInfo& slices, u32 topicId);
409 :
410 : // for high-level wrapper function
411 : HcclResult ProceedMultiLinks(
412 : const std::vector<DataInfo>& dataInfo, const std::vector<InsQuePtr>& queues,
413 : const MultiDataLinksDmaModeInfo& dmaModeInfo, std::vector<InsQuePtr>& syncQues, bool& hasDiffDmaMode);
414 : HcclResult ProceedMultiLinks(
415 : const std::vector<DataReduceInfo>& dataInfo, const std::vector<InsQuePtr>& queues,
416 : const MultiDataLinksDmaModeInfo& dmaModeInfo, std::vector<InsQuePtr>& syncQues, bool& hasDiffDmaMode);
417 : } // namespace Hccl
418 :
419 : #endif // !HCCLV2_ALG_DATA_TRANS_WRAPPER
|