已合并
【PR】: 新增Runtime API 设备全局变量symbol相关rt接口 #2467
huzeyong_rts创建于 5月28日
【PR】: 新增Runtime API 设备全局变量symbol相关rt接口 #2467
已合并
huzeyong_rts创建于 5月28日
30 个文件变更+1077-16
Adocs/03_api_ref/11-11_Device变量内存操作.md+278-0
@@ -0,0 +1,278 @@
1# 11-11 Device变量内存操作
2 
3本章节描述Device变量内存操作相关接口,用户可以访问和操作Device变量。
4 
5- [`aclError aclrtGetSymbolAddress(const void *symbol, void **devPtr)`](#aclrtGetSymbolAddress):获取Device变量的地址。
6- [`aclError aclrtGetSymbolSize(const void *symbol, size_t *size)`](#aclrtGetSymbolSize):获取Device变量占用的内存大小。
7- [`aclError aclrtMemcpyFromSymbol(void *dst, size_t dstMax, const void *symbol, size_t count, size_t offset, aclrtMemcpyKind kind)`](#aclrtMemcpyFromSymbol):实现Device变量的数据到Host的同步内存复制。
8- [`aclError aclrtMemcpyFromSymbolAsync(void *dst, size_t dstMax, const void *symbol, size_t count, size_t offset, aclrtMemcpyKind kind, aclrtStream stream)`](#aclrtMemcpyFromSymbolAsync):实现Device变量的数据到Host的异步内存复制。
9- [`aclError aclrtMemcpyToSymbol(const void *symbol, const void *src, size_t count, size_t offset, aclrtMemcpyKind kind)`](#aclrtMemcpyToSymbol):实现Host数据到Device变量的同步内存复制。
10- [`aclError aclrtMemcpyToSymbolAsync(const void *symbol, const void *src, size_t count, size_t offset, aclrtMemcpyKind kind, aclrtStream stream)`](#aclrtMemcpyToSymbolAsync):实现Host数据到Device变量的异步内存复制。
11 
12<a id="aclrtGetSymbolAddress"></a>
13 
14## aclrtGetSymbolAddress
15 
16```c
17aclError aclrtGetSymbolAddress(const void *symbol, void **devPtr)
18```
19 
20### 产品支持情况
21 
22| 产品 | 是否支持 |
23| --- | :---: |
24| Ascend 950PR/Ascend 950DT | √ |
25| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
26| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
27 
28### 功能说明
29 
30获取Device变量的地址。
31 
32### 参数说明
33 
34| 参数名 | 输入/输出 | 说明 |
35| --- | :---: | --- |
36| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
37| devPtr | 输出 | Device变量的内存地址指针。 |
38 
39### 返回值说明
40 
41返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
42 
43### 约束说明
44 
45- 本接口仅适用于Ascend C语言开发自定义算子并基于毕昇编译器进行Host和Device代码混合编译的场景。
46- Device变量地址仅在当前Device有效,切换Device后需重新获取地址。
47- 仅支持AI Core算子中的Device变量,具体约束如下:
48 - 变量定义位置:支持main函数所在文件中定义的Device变量(如 `__gm__ float convWeights`)。
49 - extern变量支持:跨文件引用场景,即文件A定义的Device变量可在文件B中通过extern关键字声明引用(如 `extern __gm__ float convWeights`)。此场景需使用毕昇编译器 `-dc` 编译模式,将多文件编译为单一算子二进制文件。
50 - 数据类型:支持基础数据类型、函数指针、结构体及数组,不支持函数指针、class类型。
51 
52 
53<br>
54<br>
55<br>
56 
57<a id="aclrtGetSymbolSize"></a>
58 
59## aclrtGetSymbolSize
60 
61```c
62aclError aclrtGetSymbolSize(const void *symbol, size_t *size)
63```
64 
65### 产品支持情况
66 
67| 产品 | 是否支持 |
68| --- | :---: |
69| Ascend 950PR/Ascend 950DT | √ |
70| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
71| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
72 
73### 功能说明
74 
75获取Device变量占用的内存大小。
76 
77### 参数说明
78 
79| 参数名 | 输入/输出 | 说明 |
80| --- | :---: | --- |
81| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
82| size | 输出 | Device变量的大小,单位Byte。 |
83 
84### 返回值说明
85 
86返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
87 
88### 约束说明
89 
90- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
91 
92 
93<br>
94<br>
95<br>
96 
97<a id="aclrtMemcpyFromSymbol"></a>
98 
99## aclrtMemcpyFromSymbol
100 
101```c
102aclError aclrtMemcpyFromSymbol(void *dst, size_t dstMax, const void *symbol,
103 size_t count, size_t offset, aclrtMemcpyKind kind)
104```
105 
106### 产品支持情况
107 
108| 产品 | 是否支持 |
109| --- | :---: |
110| Ascend 950PR/Ascend 950DT | √ |
111| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
112| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
113 
114### 功能说明
115 
116实现Device变量的数据到Host的同步内存复制。用于读取Device变量的数据。
117 
118### 参数说明
119 
120| 参数名 | 输入/输出 | 说明 |
121| --- | :---: | --- |
122| dst | 输入 | 目的内存地址指针。 |
123| dstMax | 输入 | 目标内存最大长度,单位Byte。需满足 dstMax ≥ count。 |
124| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
125| count | 输入 | 内存复制的长度,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
126| offset | 输入 | Device变量地址偏移,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
127| kind | 输入 | 拷贝类型,类型定义请参见[aclrtMemcpyKind](25_数据类型及其操作接口.md#aclrtMemcpyKind)。本接口仅支持ACL_MEMCPY_DEVICE_TO_HOST和ACL_MEMCPY_DEFAULT。 |
128 
129### 返回值说明
130 
131返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
132 
133### 约束说明
134 
135- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
136 
137 
138<br>
139<br>
140<br>
141 
142<a id="aclrtMemcpyFromSymbolAsync"></a>
143 
144## aclrtMemcpyFromSymbolAsync
145 
146```c
147aclError aclrtMemcpyFromSymbolAsync(void *dst, size_t dstMax, const void *symbol,
148 size_t count, size_t offset, aclrtMemcpyKind kind,
149 aclrtStream stream)
150```
151 
152### 产品支持情况
153 
154| 产品 | 是否支持 |
155| --- | :---: |
156| Ascend 950PR/Ascend 950DT | √ |
157| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
158| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
159 
160### 功能说明
161 
162实现Device变量的数据到Host的异步内存复制。用于读取Device变量的数据。
163 
164本接口中的Host内存支持锁页内存(例如通过aclrtMallocHost接口申请的内存)、非锁页内存(通过malloc接口申请的内存)。当Host内存是锁页内存时,本接口是异步接口,调用接口成功仅表示任务下发成功,不表示任务执行成功,调用本接口后,需调用同步等待接口(例如,[aclrtSynchronizeStream](06_Stream管理.md#aclrtSynchronizeStream))确保内存复制的任务已执行完成;当Host内存是非锁页内存时,本接口在内存复制任务完成后才返回。
165 
166### 参数说明
167 
168| 参数名 | 输入/输出 | 说明 |
169| --- | :---: | --- |
170| dst | 输入 | 目的内存地址指针。 |
171| dstMax | 输入 | 目标内存最大长度,单位Byte。需满足 dstMax ≥ count。 |
172| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
173| count | 输入 | 内存复制的长度,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
174| offset | 输入 | Device变量地址偏移,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
175| kind | 输入 | 拷贝类型,类型定义请参见[aclrtMemcpyKind](25_数据类型及其操作接口.md#aclrtMemcpyKind)。本接口仅支持ACL_MEMCPY_DEVICE_TO_HOST和ACL_MEMCPY_DEFAULT。 |
176| stream | 输入 | 指定执行内存复制任务的Stream。类型定义请参见[aclrtStream](25_数据类型及其操作接口.md#aclrtStream)。 |
177 
178### 返回值说明
179 
180返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
181 
182### 约束说明
183 
184- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
185- 本接口为异步接口,调用后需同步等待拷贝完成。
186 
187 
188<br>
189<br>
190<br>
191 
192<a id="aclrtMemcpyToSymbol"></a>
193 
194## aclrtMemcpyToSymbol
195 
196```c
197aclError aclrtMemcpyToSymbol(const void *symbol, const void *src,
198 size_t count, size_t offset, aclrtMemcpyKind kind)
199```
200 
201### 产品支持情况
202 
203| 产品 | 是否支持 |
204| --- | :---: |
205| Ascend 950PR/Ascend 950DT | √ |
206| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
207| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
208 
209### 功能说明
210 
211实现Host数据到Device变量的同步内存复制。用于向Device变量写入数据。
212 
213### 参数说明
214 
215| 参数名 | 输入/输出 | 说明 |
216| --- | :---: | --- |
217| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
218| src | 输入 | 源内存地址指针。 |
219| count | 输入 | 内存复制的长度,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
220| offset | 输入 | Device变量地址偏移,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
221| kind | 输入 | 拷贝类型,类型定义请参见[aclrtMemcpyKind](25_数据类型及其操作接口.md#aclrtMemcpyKind)。本接口仅支持ACL_MEMCPY_HOST_TO_DEVICE和ACL_MEMCPY_DEFAULT。 |
222 
223### 返回值说明
224 
225返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
226 
227### 约束说明
228 
229- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
230 
231 
232<br>
233<br>
234<br>
235 
236<a id="aclrtMemcpyToSymbolAsync"></a>
237 
238## aclrtMemcpyToSymbolAsync
239 
240```c
241aclError aclrtMemcpyToSymbolAsync(const void *symbol, const void *src,
242 size_t count, size_t offset, aclrtMemcpyKind kind,
243 aclrtStream stream)
244```
245 
246### 产品支持情况
247 
248| 产品 | 是否支持 |
249| --- | :---: |
250| Ascend 950PR/Ascend 950DT | √ |
251| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
252| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
253 
254### 功能说明
255 
256实现Host数据到Device变量的异步内存复制。用于向Device变量写入数据。
257 
258本接口中的Host内存支持锁页内存(例如通过aclrtMallocHost接口申请的内存)、非锁页内存(通过malloc接口申请的内存)。当Host内存是锁页内存时,本接口是异步接口,调用接口成功仅表示任务下发成功,不表示任务执行成功,调用本接口后,需调用同步等待接口(例如,[aclrtSynchronizeStream](06_Stream管理.md#aclrtSynchronizeStream))确保内存复制的任务已执行完成;当Host内存是非锁页内存时,本接口在内存复制任务完成后才返回。
259 
260### 参数说明
261 
262| 参数名 | 输入/输出 | 说明 |
263| --- | :---: | --- |
264| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
265| src | 输入 | 源内存地址指针。 |
266| count | 输入 | 内存复制的长度,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
267| offset | 输入 | Device变量地址偏移,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
268| kind | 输入 | 拷贝类型,类型定义请参见[aclrtMemcpyKind](25_数据类型及其操作接口.md#aclrtMemcpyKind)。本接口仅支持ACL_MEMCPY_HOST_TO_DEVICE和ACL_MEMCPY_DEFAULT。 |
269| stream | 输入 | 指定执行内存复制任务的Stream。类型定义请参见[aclrtStream](25_数据类型及其操作接口.md#aclrtStream)。 |
270 
271### 返回值说明
272 
273返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
274 
275### 约束说明
276 
277- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
278- 本接口为异步接口,调用后需同步等待拷贝完成。
Mdocs/03_api_ref/11_内存管理.md+11-10
@@ -17,15 +17,16 @@
17 17 
18本分类包含以下子类:18本分类包含以下子类:
19 19 
20- [11-01 设备内存分配与释放](11-01_设备内存分配与释放.md)(10 个接口)20- [11-01 设备内存分配与释放](11-01_设备内存分配与释放.md)
21- [11-02 主机内存管理](11-02_主机内存管理.md)(9 个接口)21- [11-02 主机内存管理](11-02_主机内存管理.md)
22- [11-03 内存拷贝与设置](11-03_内存拷贝与设置.md)(15 个接口)22- [11-03 内存拷贝与设置](11-03_内存拷贝与设置.md)
23- [11-04 虚拟内存管理](11-04_虚拟内存管理.md)(19 个接口)23- [11-04 虚拟内存管理](11-04_虚拟内存管理.md)
24- [11-05 统一寻址](11-05_统一寻址.md)(8 个接口)24- [11-05 统一寻址](11-05_统一寻址.md)
25- [11-06 CMO 缓存操作](11-06_CMO缓存操作.md)(8 个接口)25- [11-06 CMO 缓存操作](11-06_CMO缓存操作.md)
26- [11-07 IPC 进程间内存共享](11-07_IPC进程间内存共享.md)(6 个接口)26- [11-07 IPC 进程间内存共享](11-07_IPC进程间内存共享.md)
27- [11-08 自定义内存分配器](11-08_自定义内存分配器.md)(3 个接口)27- [11-08 自定义内存分配器](11-08_自定义内存分配器.md)
28- [11-09 流内存操作](11-09_流内存操作.md)(2 个接口)28- [11-09 流内存操作](11-09_流内存操作.md)
29- [11-10 Stream有序内存分配](11-10_Stream有序内存分配.md)(7 个接口)29- [11-10 Stream有序内存分配](11-10_Stream有序内存分配.md)
30- [11-11 Device变量内存操作](11-11_Device变量内存操作.md)
30 31 
31 32 
Mdocs/03_api_ref/25_数据类型及其操作接口.md+1-0
@@ -346,6 +346,7 @@ typedef int aclError;
346| #define ACL_ERROR_RT_MODEL_UPDATE_FAILED 107040 | 模型未完全捕获、模型正在执行中,或参数更新失败导致模型更新失败。 | 确保模型已成功捕获、执行完成或参数更新成功。 |346| #define ACL_ERROR_RT_MODEL_UPDATE_FAILED 107040 | 模型未完全捕获、模型正在执行中,或参数更新失败导致模型更新失败。 | 确保模型已成功捕获、执行完成或参数更新成功。 |
347| #define ACL_ERROR_RT_CAPTURE_MODE_BLOCK_ASYNC 107041 | 当前的捕获模式不支持异步转同步操作。 | 不同捕获模式支持的操作范围不同,请参见aclmdlRICaptureThreadExchangeMode接口中的说明,并切换到正确的捕获模式。 |347| #define ACL_ERROR_RT_CAPTURE_MODE_BLOCK_ASYNC 107041 | 当前的捕获模式不支持异步转同步操作。 | 不同捕获模式支持的操作范围不同,请参见aclmdlRICaptureThreadExchangeMode接口中的说明,并切换到正确的捕获模式。 |
348| #define ACL_ERROR_RT_SYMBOL_NOT_FOUND 107042 | 符号未找到。 | 请检查全局变量名称是否与算子二进制中的全局变量名称一致。 |348| #define ACL_ERROR_RT_SYMBOL_NOT_FOUND 107042 | 符号未找到。 | 请检查全局变量名称是否与算子二进制中的全局变量名称一致。 |
349| #define ACL_ERROR_RT_INVALID_SYMBOL 107043 | 无效的符号。 | 请检查变量名是否在Device代码中声明 |
349| #define ACL_ERROR_RT_FEATURE_NOT_SUPPORT 207000 | 特性不支持。 | 您可以获取日志后单击[Link](https://www.hiascend.com/support)联系技术支持。 |350| #define ACL_ERROR_RT_FEATURE_NOT_SUPPORT 207000 | 特性不支持。 | 您可以获取日志后单击[Link](https://www.hiascend.com/support)联系技术支持。 |
350| #define ACL_ERROR_RT_MEMORY_ALLOCATION 207001 | 内存申请失败。 | 请检查硬件环境上的存储剩余情况。 |351| #define ACL_ERROR_RT_MEMORY_ALLOCATION 207001 | 内存申请失败。 | 请检查硬件环境上的存储剩余情况。 |
351| #define ACL_ERROR_RT_MEMORY_FREE 207002 | 内存释放失败。 | 您可以获取日志后单击[Link](https://www.hiascend.com/support)联系技术支持。 |352| #define ACL_ERROR_RT_MEMORY_FREE 207002 | 内存释放失败。 | 您可以获取日志后单击[Link](https://www.hiascend.com/support)联系技术支持。 |
Rdocs/03_api_ref/26_C++ API Routines.mddocs/03_api_ref/26_C++扩展接口.md+291-2
@@ -1,4 +1,4 @@
1# 26. C++ API Routines1# 26. C++扩展接口
2 2 
3本章节描述 C++ 扩展接口,包括函数重载和模板封装,用于简化 C++ 场景下的 API 调用并提供类型安全的内存操作。3本章节描述 C++ 扩展接口,包括函数重载和模板封装,用于简化 C++ 场景下的 API 调用并提供类型安全的内存操作。
4 4 
@@ -34,6 +34,12 @@
34- [`template <typename T> aclError aclrtMemAllocManaged(T **devPtr, size_t size, uint32_t flags = ACL_RT_MEM_ATTACH_GLOBAL)`](#aclrtMemAllocManaged):类型安全的统一内存分配。34- [`template <typename T> aclError aclrtMemAllocManaged(T **devPtr, size_t size, uint32_t flags = ACL_RT_MEM_ATTACH_GLOBAL)`](#aclrtMemAllocManaged):类型安全的统一内存分配。
35- [`template <typename T> aclError aclrtMemManagedPrefetchAsync(const T *ptr, size_t size, aclrtMemManagedLocation location, uint32_t flags, aclrtStream stream)`](#aclrtMemManagedPrefetchAsync):预取统一内存。35- [`template <typename T> aclError aclrtMemManagedPrefetchAsync(const T *ptr, size_t size, aclrtMemManagedLocation location, uint32_t flags, aclrtStream stream)`](#aclrtMemManagedPrefetchAsync):预取统一内存。
36- [`template <typename T> aclError aclrtMemManagedPrefetchBatchAsync(...)`](#aclrtMemManagedPrefetchBatchAsync):批量预取统一内存。36- [`template <typename T> aclError aclrtMemManagedPrefetchBatchAsync(...)`](#aclrtMemManagedPrefetchBatchAsync):批量预取统一内存。
37- [`template <typename T> aclError aclrtGetSymbolAddress(...)`](#aclrtGetSymbolAddress):获取Device变量的地址。
38- [`template <typename T> aclError aclrtGetSymbolSize(...)`](#aclrtGetSymbolSize):获取Device变量占用的内存大小。
39- [`template <typename T> aclError aclrtMemcpyFromSymbol(...)`](#aclrtMemcpyFromSymbol):实现Device变量的数据到Host的同步内存复制。
40- [`template <typename T> aclError aclrtMemcpyFromSymbolAsync(...)`](#aclrtMemcpyFromSymbolAsync):实现Device变量的数据到Host的异步内存复制。
41- [`template <typename T> aclError aclrtMemcpyToSymbol(...)`](#aclrtMemcpyToSymbol):实现Host数据到Device变量的同步内存复制。
42- [`template <typename T> aclError aclrtMemcpyToSymbolAsync(...)`](#aclrtMemcpyToSymbolAsync):实现Host数据到Device变量的异步内存复制。
37 43 
38---44---
39 45 
@@ -1016,4 +1022,287 @@ aclError aclrtMemcpy2dAsync(T *dst, size_t dpitch, const U *src, size_t spitch,
1016### 约束说明1022### 约束说明
1017 1023 
1018- 本接口仅适用于 C++ 程序。1024- 本接口仅适用于 C++ 程序。
1019- 本接口为异步接口,调用后需同步等待拷贝完成。1025- 本接口为异步接口,调用后需同步等待拷贝完成。
1026 
1027---
1028 
1029<br>
1030<br>
1031<br>
1032 
1033<a id="aclrtGetSymbolAddress"></a>
1034 
1035## aclrtGetSymbolAddress
1036 
1037```cpp
1038template <typename T>
1039aclError aclrtGetSymbolAddress(const T &symbol, void **devPtr)
1040```
1041 
1042### 产品支持情况
1043 
1044| 产品 | 是否支持 |
1045| --- | :---: |
1046| Ascend 950PR/Ascend 950DT | √ |
1047| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
1048| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
1049 
1050### 功能说明
1051 
1052获取Device变量的地址。
1053 
1054### 参数说明
1055 
1056| 参数名 | 输入/输出 | 说明 |
1057| --- | :---: | --- |
1058| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
1059| devPtr | 输出 | Device变量的内存地址指针。 |
1060 
1061### 返回值说明
1062 
1063返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
1064 
1065### 约束说明
1066 
1067- 本接口仅适用于 C++ 程序。
1068- 本接口仅适用于Ascend C语言开发自定义算子并基于毕昇编译器进行Host和Device代码混合编译的场景。
1069- Device变量地址仅在当前Device有效,切换Device后需重新获取地址。
1070- 仅支持AI Core算子中的Device变量,具体约束如下:
1071 - 变量定义位置:支持main函数所在文件中定义的Device变量(如 `__gm__ float convWeights`)。
1072 - extern变量支持:跨文件引用场景,即文件A定义的Device变量可在文件B中通过extern关键字声明引用(如 `extern __gm__ float convWeights`)。此场景需使用毕昇编译器 `-dc` 编译模式,将多文件编译为单一算子二进制文件。
1073 - 数据类型:支持基础数据类型、函数指针、结构体及数组,不支持函数指针、class类型。
1074 
1075---
1076 
1077<br>
1078<br>
1079<br>
1080 
1081<a id="aclrtGetSymbolSize"></a>
1082 
1083## aclrtGetSymbolSize
1084 
1085```cpp
1086template <typename T>
1087aclError aclrtGetSymbolSize(const T &symbol, size_t *size)
1088```
1089 
1090### 产品支持情况
1091 
1092| 产品 | 是否支持 |
1093| --- | :---: |
1094| Ascend 950PR/Ascend 950DT | √ |
1095| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
1096| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
1097 
1098### 功能说明
1099 
1100获取Device变量占用的内存大小。
1101 
1102### 参数说明
1103 
1104| 参数名 | 输入/输出 | 说明 |
1105| --- | :---: | --- |
1106| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
1107| size | 输出 | Device变量的大小,单位Byte。 |
1108 
1109### 返回值说明
1110 
1111返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
1112 
1113### 约束说明
1114 
1115- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
1116 
1117---
1118 
1119<br>
1120<br>
1121<br>
1122 
1123<a id="aclrtMemcpyFromSymbol"></a>
1124 
1125## aclrtMemcpyFromSymbol
1126 
1127```cpp
1128template <typename T>
1129aclError aclrtMemcpyFromSymbol(void *dst, size_t dstMax, const T &symbol, size_t count,
1130 size_t offset, aclrtMemcpyKind kind)
1131```
1132 
1133### 产品支持情况
1134 
1135| 产品 | 是否支持 |
1136| --- | :---: |
1137| Ascend 950PR/Ascend 950DT | √ |
1138| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
1139| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
1140 
1141### 功能说明
1142 
1143实现Device变量的数据到Host的同步内存复制。用于读取Device变量的数据。
1144 
1145### 参数说明
1146 
1147| 参数名 | 输入/输出 | 说明 |
1148| --- | :---: | --- |
1149| dst | 输入 | 目的内存地址指针。 |
1150| dstMax | 输入 | 目标内存最大长度,单位Byte。需满足 dstMax ≥ count。 |
1151| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
1152| count | 输入 | 内存复制的长度,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
1153| offset | 输入 | Device变量地址偏移,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
1154| kind | 输入 | 拷贝类型,类型定义请参见[aclrtMemcpyKind](25_数据类型及其操作接口.md#aclrtMemcpyKind)。本接口仅支持ACL_MEMCPY_DEVICE_TO_HOST和ACL_MEMCPY_DEFAULT。 |
1155 
1156### 返回值说明
1157 
1158返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
1159 
1160### 约束说明
1161 
1162- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
1163 
1164---
1165 
1166<br>
1167<br>
1168<br>
1169 
1170<a id="aclrtMemcpyFromSymbolAsync"></a>
1171 
1172## aclrtMemcpyFromSymbolAsync
1173 
1174```cpp
1175template <typename T>
1176aclError aclrtMemcpyFromSymbolAsync(void *dst, size_t dstMax, const T &symbol, size_t count,
1177 size_t offset, aclrtMemcpyKind kind, aclrtStream stream)
1178```
1179 
1180### 产品支持情况
1181 
1182| 产品 | 是否支持 |
1183| --- | :---: |
1184| Ascend 950PR/Ascend 950DT | √ |
1185| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
1186| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
1187 
1188### 功能说明
1189 
1190实现Device变量的数据到Host的异步内存复制。用于读取Device变量的数据。
1191 
1192本接口中的Host内存支持锁页内存(例如通过aclrtMallocHost接口申请的内存)、非锁页内存(通过malloc接口申请的内存)。当Host内存是锁页内存时,本接口是异步接口,调用接口成功仅表示任务下发成功,不表示任务执行成功,调用本接口后,需调用同步等待接口(例如,[aclrtSynchronizeStream](06_Stream管理.md#aclrtSynchronizeStream))确保内存复制的任务已执行完成;当Host内存是非锁页内存时,本接口在内存复制任务完成后才返回。
1193 
1194### 参数说明
1195 
1196| 参数名 | 输入/输出 | 说明 |
1197| --- | :---: | --- |
1198| dst | 输入 | 目的内存地址指针。 |
1199| dstMax | 输入 | 目标内存最大长度,单位Byte。需满足 dstMax ≥ count。 |
1200| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
1201| count | 输入 | 内存复制的长度,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
1202| offset | 输入 | Device变量地址偏移,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
1203| kind | 输入 | 拷贝类型,类型定义请参见[aclrtMemcpyKind](25_数据类型及其操作接口.md#aclrtMemcpyKind)。本接口仅支持ACL_MEMCPY_DEVICE_TO_HOST和ACL_MEMCPY_DEFAULT。 |
1204| stream | 输入 | 指定执行内存复制任务的Stream。类型定义请参见[aclrtStream](25_数据类型及其操作接口.md#aclrtStream)。 |
1205 
1206### 返回值说明
1207 
1208返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
1209 
1210### 约束说明
1211 
1212- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
1213- 本接口为异步接口,调用后需同步等待拷贝完成。
1214 
1215---
1216 
1217<br>
1218<br>
1219<br>
1220 
1221<a id="aclrtMemcpyToSymbol"></a>
1222 
1223## aclrtMemcpyToSymbol
1224 
1225```cpp
1226template <typename T>
1227aclError aclrtMemcpyToSymbol(const T &symbol, const void *src, size_t count, size_t offset, aclrtMemcpyKind kind)
1228```
1229 
1230### 产品支持情况
1231 
1232| 产品 | 是否支持 |
1233| --- | :---: |
1234| Ascend 950PR/Ascend 950DT | √ |
1235| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
1236| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
1237 
1238### 功能说明
1239 
1240实现Host数据到Device变量的同步内存复制。用于向Device变量写入数据。
1241 
1242### 参数说明
1243 
1244| 参数名 | 输入/输出 | 说明 |
1245| --- | :---: | --- |
1246| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
1247| src | 输入 | 源内存地址指针。 |
1248| count | 输入 | 内存复制的长度,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
1249| offset | 输入 | Device变量地址偏移,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
1250| kind | 输入 | 拷贝类型,类型定义请参见[aclrtMemcpyKind](25_数据类型及其操作接口.md#aclrtMemcpyKind)。本接口仅支持ACL_MEMCPY_HOST_TO_DEVICE和ACL_MEMCPY_DEFAULT。 |
1251 
1252### 返回值说明
1253 
1254返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
1255 
1256### 约束说明
1257 
1258- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
1259 
1260---
1261 
1262<br>
1263<br>
1264<br>
1265 
1266<a id="aclrtMemcpyToSymbolAsync"></a>
1267 
1268## aclrtMemcpyToSymbolAsync
1269 
1270```cpp
1271template <typename T>
1272aclError aclrtMemcpyToSymbolAsync(const T &symbol, const void *src, size_t count, size_t offset,
1273 aclrtMemcpyKind kind, aclrtStream stream)
1274```
1275 
1276### 产品支持情况
1277 
1278| 产品 | 是否支持 |
1279| --- | :---: |
1280| Ascend 950PR/Ascend 950DT | √ |
1281| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
1282| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
1283 
1284### 功能说明
1285 
1286实现Host数据到Device变量的异步内存复制。用于向Device变量写入数据。
1287 
1288本接口中的Host内存支持锁页内存(例如通过aclrtMallocHost接口申请的内存)、非锁页内存(通过malloc接口申请的内存)。当Host内存是锁页内存时,本接口是异步接口,调用接口成功仅表示任务下发成功,不表示任务执行成功,调用本接口后,需调用同步等待接口(例如,[aclrtSynchronizeStream](06_Stream管理.md#aclrtSynchronizeStream))确保内存复制的任务已执行完成;当Host内存是非锁页内存时,本接口在内存复制任务完成后才返回。
1289 
1290### 参数说明
1291 
1292| 参数名 | 输入/输出 | 说明 |
1293| --- | :---: | --- |
1294| symbol | 输入 | Device变量名。此处传入`__gm__`声明的变量名。 |
1295| src | 输入 | 源内存地址指针。 |
1296| count | 输入 | 内存复制的长度,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
1297| offset | 输入 | Device变量地址偏移,单位Byte。需满足 offset + count ≤ Device变量大小,Device变量大小可通过 [aclrtGetSymbolSize](#aclrtGetSymbolSize)接口查询获取。 |
1298| kind | 输入 | 拷贝类型,类型定义请参见[aclrtMemcpyKind](25_数据类型及其操作接口.md#aclrtMemcpyKind)。本接口仅支持ACL_MEMCPY_HOST_TO_DEVICE和ACL_MEMCPY_DEFAULT。 |
1299| stream | 输入 | 指定执行内存复制任务的Stream。类型定义请参见[aclrtStream](25_数据类型及其操作接口.md#aclrtStream)。 |
1300 
1301### 返回值说明
1302 
1303返回0表示成功,返回其他值表示失败,请参见[aclError](25_数据类型及其操作接口.md#aclError)。
1304 
1305### 约束说明
1306 
1307- 同[aclrtGetSymbolAddress](#aclrtGetSymbolAddress)接口约束说明。
1308- 本接口为异步接口,调用后需同步等待拷贝完成。
Mdocs/03_api_ref/api_ref.md+2-1
@@ -21,6 +21,7 @@
21 - ### [11-08 自定义内存分配器](11-08_自定义内存分配器.md)21 - ### [11-08 自定义内存分配器](11-08_自定义内存分配器.md)
22 - ### [11-09 流内存操作](11-09_流内存操作.md)22 - ### [11-09 流内存操作](11-09_流内存操作.md)
23 - ### [11-10 Stream有序内存分配](11-10_Stream有序内存分配.md)23 - ### [11-10 Stream有序内存分配](11-10_Stream有序内存分配.md)
24 - ### [11-11 Device变量内存操作](11-11_Device变量内存操作.md)
24- ## [12. 执行控制](12_执行控制.md)25- ## [12. 执行控制](12_执行控制.md)
25- ## [13. 异常处理](13_异常处理.md)26- ## [13. 异常处理](13_异常处理.md)
26- ## [14. Kernel加载与执行](14_Kernel加载与执行.md)27- ## [14. Kernel加载与执行](14_Kernel加载与执行.md)
@@ -42,4 +43,4 @@
42- ## [23. 日志接口](23_日志接口.md)43- ## [23. 日志接口](23_日志接口.md)
43- ## [24. 其他接口](24_其他接口.md)44- ## [24. 其他接口](24_其他接口.md)
44- ## [25. 数据类型及其操作接口](25_数据类型及其操作接口.md)45- ## [25. 数据类型及其操作接口](25_数据类型及其操作接口.md)
45- ## [26. C++ API Routines](26_C++ API Routines.md)46- ## [26. C++扩展接口](26_C++扩展接口.md)
Minclude/external/acl/error_codes/rt_error_codes.h+1-0
@@ -61,6 +61,7 @@ extern "C" {
61#define ACL_ERROR_RT_MODEL_UPDATE_FAILED 107040 // the model update failed61#define ACL_ERROR_RT_MODEL_UPDATE_FAILED 107040 // the model update failed
62#define ACL_ERROR_RT_CAPTURE_MODE_BLOCK_ASYNC 107041 // async oper convert to sync oper, stream is captured, not support current oper62#define ACL_ERROR_RT_CAPTURE_MODE_BLOCK_ASYNC 107041 // async oper convert to sync oper, stream is captured, not support current oper
63#define ACL_ERROR_RT_SYMBOL_NOT_FOUND 107042 // symbol not found63#define ACL_ERROR_RT_SYMBOL_NOT_FOUND 107042 // symbol not found
64#define ACL_ERROR_RT_INVALID_SYMBOL 107043 // invalid device symbol
64 65 
65#define ACL_ERROR_RT_FEATURE_NOT_SUPPORT 207000 // feature not support66#define ACL_ERROR_RT_FEATURE_NOT_SUPPORT 207000 // feature not support
66#define ACL_ERROR_RT_MEMORY_ALLOCATION 207001 // memory allocation error, only used by out of memory67#define ACL_ERROR_RT_MEMORY_ALLOCATION 207001 // memory allocation error, only used by out of memory
Mpkg_inc/runtime/rt_external_kernel.h+13-0
@@ -449,6 +449,19 @@ RTS_API rtError_t rtFusionLaunch(void * const fusionInfo, rtStream_t const stm,
449 */449 */
450RTS_API rtError_t rtNopTask(rtStream_t stm);450RTS_API rtError_t rtNopTask(rtStream_t stm);
451 451 
452/**
453 * @ingroup rt_kernel
454 * @brief register device variable symbol mapping relationship.
455 * @param [in] binHandle binary handle (Program pointer).
456 * @param [in] hostVar device symbol reference.
457 * @param [in] deviceVarName device symbol name.
458 * @param [in] size size of object associated with symbol.
459 * @param [in] flags symbol attribute flags (bit0: ext; bit1: global).
460 * @param [in] reserve reserved parameter.
461 */
462RTS_API void rtRegisterVariable(void *binHandle, const void *hostVar, const char *deviceVarName,
463 size_t size, uint32_t flags, void *reserve);
464 
452#if defined(__cplusplus)465#if defined(__cplusplus)
453}466}
454#endif467#endif
Msrc/inc/runtime/inner_kernel.h+12-0
@@ -89,6 +89,18 @@ RTS_API rtError_t rtFunctionGetParamInfo(const void *func, size_t paramIndex,
89 */89 */
90RTS_API rtError_t rtFunctionGetAvailDynUbufPerBlock(void *func, uint32_t flags, size_t *dynamicUbufSize);90RTS_API rtError_t rtFunctionGetAvailDynUbufPerBlock(void *func, uint32_t flags, size_t *dynamicUbufSize);
91 91 
92/**
93 * @ingroup rt_kernel
94 * @brief find the device address and size associated with symbol.
95 * @param [in] hostVar device symbol reference.
96 * @param [out] devPtr device pointer associated with symbol.
97 * @param [out] size size of object associated with symbol.
98 * @retval ACL_RT_SUCCESS for ok.
99 * @retval RT_ERROR_INVALID_SYMBOL invalid device symbol.
100 * @retval ACL_ERROR_RT_PARAM_INVALID for error input.
101 */
102RTS_API rtError_t rtSymbolLookup(const void *hostVar, void **devPtr, size_t *size);
103 
92/**104/**
93 * @ingroup rts_kernel105 * @ingroup rts_kernel
94 * @brief Get global symbol address and size from binary.106 * @brief Get global symbol address and size from binary.
Msrc/runtime/api/api.hpp+4-0
@@ -163,6 +163,10 @@ public:
163 virtual rtError_t DependencyRegister(Program * const mProgram, Program * const sProgram) = 0;163 virtual rtError_t DependencyRegister(Program * const mProgram, Program * const sProgram) = 0;
164 virtual rtError_t FunctionRegister(Program * const prog, const void * const stubFunc,164 virtual rtError_t FunctionRegister(Program * const prog, const void * const stubFunc,
165 const char_t * const stubName, const void * const kernelInfoExt, const uint32_t funcMode) = 0;165 const char_t * const stubName, const void * const kernelInfoExt, const uint32_t funcMode) = 0;
166 virtual rtError_t RegisterVariable(void * const binHandle, const void * const hostVar,
167 const char_t * const deviceVarName, const size_t size, const uint32_t flags) = 0;
168 virtual rtError_t SymbolLookup(const void * const hostVar, void ** const devPtr,
169 size_t * const size) = 0;
166 virtual rtError_t GetFunctionByName(const char_t * const stubName, void ** const stubFunc) = 0;170 virtual rtError_t GetFunctionByName(const char_t * const stubName, void ** const stubFunc) = 0;
167 virtual rtError_t GetAddrByFun(const void * const stubFunc, void ** const addr) = 0;171 virtual rtError_t GetAddrByFun(const void * const stubFunc, void ** const addr) = 0;
168 virtual rtError_t GetAddrAndPrefCntWithHandle(void * const hdl, const void * const kernelInfoExt,172 virtual rtError_t GetAddrAndPrefCntWithHandle(void * const hdl, const void * const kernelInfoExt,
Msrc/runtime/api/api_c_standard_soc.cc+26-0
@@ -1393,6 +1393,32 @@ rtError_t rtBinaryGetGlobal(const rtBinHandle binHandle, const char *name, void
1393 return ACL_RT_SUCCESS;1393 return ACL_RT_SUCCESS;
1394}1394}
1395 1395 
1396VISIBILITY_DEFAULT
1397void rtRegisterVariable(void *binHandle, const void *hostVar, const char *deviceVarName,
H
Hhouyanbao5月29日

rt接口没有返回值吗

likedislike
huzeyong_rts
5月29日 评论:
likedislike
1398 size_t size, uint32_t flags, void *reserve)
1399{
1400 UNUSED(reserve);
1401 Api * const apiInstance = Api::Instance();
1402 if (unlikely(apiInstance == nullptr)) {
1403 RT_LOG(RT_LOG_ERROR, "Null apiInstance pointer");
1404 return;
1405 }
1406 
1407 (void)apiInstance->RegisterVariable(binHandle, hostVar, deviceVarName, size, flags);
1408 return;
1409}
1410 
1411VISIBILITY_DEFAULT
1412rtError_t rtSymbolLookup(const void *hostVar, void **devPtr, size_t *size)
1413{
1414 Api * const apiInstance = Api::Instance();
1415 NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
1416 
1417 const rtError_t error = apiInstance->SymbolLookup(hostVar, devPtr, size);
1418 ERROR_RETURN_WITH_EXT_ERRCODE(error);
1419 return ACL_RT_SUCCESS;
1420}
1421 
1396VISIBILITY_DEFAULT1422VISIBILITY_DEFAULT
1397rtError_t rtFunctionGetParamCount(const void *func, size_t *paramCount)1423rtError_t rtFunctionGetParamCount(const void *func, size_t *paramCount)
1398{1424{
Msrc/runtime/api/api_c_tiny_stub.cc+21-0
@@ -1254,6 +1254,27 @@ rtError_t rtMemManagedPrefetchBatchAsync(const void** ptrs, size_t* sizes, size_
1254 return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;1254 return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;
1255}1255}
1256 1256 
1257VISIBILITY_DEFAULT
1258void rtRegisterVariable(void *binHandle, const void *hostVar, const char *deviceVarName,
1259 size_t size, uint32_t flags, void *reserve)
1260{
1261 (void)binHandle;
1262 (void)hostVar;
1263 (void)deviceVarName;
1264 (void)size;
1265 (void)flags;
1266 (void)reserve;
1267}
1268 
1269VISIBILITY_DEFAULT
1270rtError_t rtSymbolLookup(const void *hostVar, void **devPtr, size_t *size)
1271{
1272 (void)hostVar;
1273 (void)devPtr;
1274 (void)size;
1275 return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;
1276}
1277 
1257 1278 
1258VISIBILITY_DEFAULT1279VISIBILITY_DEFAULT
1259rtError_t rtBinaryGetGlobal(const rtBinHandle binHandle, const char *name, void **dptr, size_t *size)1280rtError_t rtBinaryGetGlobal(const rtBinHandle binHandle, const char *name, void **dptr, size_t *size)
Msrc/runtime/cmake/cmodel.cmake+3-1
@@ -386,6 +386,7 @@ set(libruntime_cmodel_src_files
386 ${RUNTIME_CORE_DIR}/src/kernel/module.cc386 ${RUNTIME_CORE_DIR}/src/kernel/module.cc
387 ${RUNTIME_CORE_DIR}/src/kernel/program.cc387 ${RUNTIME_CORE_DIR}/src/kernel/program.cc
388 ${RUNTIME_CORE_DIR}/src/kernel/program_common.cc388 ${RUNTIME_CORE_DIR}/src/kernel/program_common.cc
389 ${RUNTIME_CORE_DIR}/src/kernel/symbol_table.cc
389 ${RUNTIME_CORE_DIR}/src/kernel/kernel_utils.cc390 ${RUNTIME_CORE_DIR}/src/kernel/kernel_utils.cc
390 ${RUNTIME_FEATURE_DIR}/soma/soma.cc391 ${RUNTIME_FEATURE_DIR}/soma/soma.cc
391 ${RUNTIME_FEATURE_DIR}/soma/stream_mem_pool.cc392 ${RUNTIME_FEATURE_DIR}/soma/stream_mem_pool.cc
@@ -509,6 +510,7 @@ set(libruntime_cmodel_v200_src_files
509 ${RUNTIME_CORE_DIR}/src/kernel/module.cc510 ${RUNTIME_CORE_DIR}/src/kernel/module.cc
510 ${RUNTIME_CORE_DIR}/src/kernel/program.cc511 ${RUNTIME_CORE_DIR}/src/kernel/program.cc
511 ${RUNTIME_CORE_DIR}/src/kernel/program_common.cc512 ${RUNTIME_CORE_DIR}/src/kernel/program_common.cc
513 ${RUNTIME_CORE_DIR}/src/kernel/symbol_table.cc
512 ${RUNTIME_CORE_DIR}/src/kernel/kernel_utils.cc514 ${RUNTIME_CORE_DIR}/src/kernel/kernel_utils.cc
513 ${RUNTIME_FEATURE_DIR}/soma/soma.cc515 ${RUNTIME_FEATURE_DIR}/soma/soma.cc
514 ${RUNTIME_FEATURE_DIR}/soma/stream_mem_pool.cc516 ${RUNTIME_FEATURE_DIR}/soma/stream_mem_pool.cc
@@ -876,4 +878,4 @@ foreach(product_type ${PRODUCT_TYPE_LIST})
876 )878 )
877 879 
878endforeach()880endforeach()
879endif()881endif()
Msrc/runtime/cmake/runtime.cmake+1-0
@@ -286,6 +286,7 @@ set(libruntime_v100_src_files
286 ${RUNTIME_CORE_DIR}/src/kernel/module.cc286 ${RUNTIME_CORE_DIR}/src/kernel/module.cc
287 ${RUNTIME_CORE_DIR}/src/kernel/program.cc287 ${RUNTIME_CORE_DIR}/src/kernel/program.cc
288 ${RUNTIME_CORE_DIR}/src/kernel/program_common.cc288 ${RUNTIME_CORE_DIR}/src/kernel/program_common.cc
289 ${RUNTIME_CORE_DIR}/src/kernel/symbol_table.cc
289 ${RUNTIME_CORE_DIR}/src/kernel/kernel_utils.cc290 ${RUNTIME_CORE_DIR}/src/kernel/kernel_utils.cc
290 ${RUNTIME_FEATURE_DIR}/soma/soma.cc291 ${RUNTIME_FEATURE_DIR}/soma/soma.cc
291 ${RUNTIME_FEATURE_DIR}/soma/stream_mem_pool.cc292 ${RUNTIME_FEATURE_DIR}/soma/stream_mem_pool.cc
Msrc/runtime/cmake/tiny.cmake+1-0
@@ -173,6 +173,7 @@ set(libruntime_src_files_include_for_tiny
173 ${RUNTIME_DIR}/src/runtime/driver/npu_driver_tiny_stub.cc173 ${RUNTIME_DIR}/src/runtime/driver/npu_driver_tiny_stub.cc
174 ${RUNTIME_CORE_DIR}/src/engine/engine_factory_tiny_stub.cc174 ${RUNTIME_CORE_DIR}/src/engine/engine_factory_tiny_stub.cc
175 ${RUNTIME_CORE_DIR}/src/kernel/binary_loader_tiny_stub.cc175 ${RUNTIME_CORE_DIR}/src/kernel/binary_loader_tiny_stub.cc
176 ${RUNTIME_CORE_DIR}/src/kernel/symbol_table_tiny_stub.cc
176 ${RUNTIME_CORE_DIR}/src/task/tiny/rdma_task_tiny_stub.cc177 ${RUNTIME_CORE_DIR}/src/task/tiny/rdma_task_tiny_stub.cc
177 ${RUNTIME_FEATURE_DIR}/ffts/ffts_task_tiny_stub.cc178 ${RUNTIME_FEATURE_DIR}/ffts/ffts_task_tiny_stub.cc
178 ${RUNTIME_CORE_DIR}/src/task/tiny/task_tiny_stub.cc179 ${RUNTIME_CORE_DIR}/src/task/tiny/task_tiny_stub.cc
Msrc/runtime/cmake/v200.cmake+1-0
@@ -307,6 +307,7 @@ set(libruntime_v200_v201_common_src_files
307 ${RUNTIME_CORE_DIR}/src/kernel/module.cc307 ${RUNTIME_CORE_DIR}/src/kernel/module.cc
308 ${RUNTIME_CORE_DIR}/src/kernel/program.cc308 ${RUNTIME_CORE_DIR}/src/kernel/program.cc
309 ${RUNTIME_CORE_DIR}/src/kernel/program_common.cc309 ${RUNTIME_CORE_DIR}/src/kernel/program_common.cc
310 ${RUNTIME_CORE_DIR}/src/kernel/symbol_table.cc
310 ${RUNTIME_CORE_DIR}/src/kernel/kernel_utils.cc311 ${RUNTIME_CORE_DIR}/src/kernel/kernel_utils.cc
311 ${RUNTIME_FEATURE_DIR}/soma/soma.cc312 ${RUNTIME_FEATURE_DIR}/soma/soma.cc
312 ${RUNTIME_FEATURE_DIR}/soma/stream_mem_pool.cc313 ${RUNTIME_FEATURE_DIR}/soma/stream_mem_pool.cc
Msrc/runtime/core/inc/common/internal_error_define.hpp+1-0
@@ -219,6 +219,7 @@ constexpr int32_t RT_ERROR_KERNEL_DUPLICATE = 0x07080007;
219constexpr int32_t RT_ERROR_KERNEL_UNREGISTERING = 0x07080008;219constexpr int32_t RT_ERROR_KERNEL_UNREGISTERING = 0x07080008;
220constexpr int32_t RT_ERROR_KERNEL_INVALID = 0x07080009;220constexpr int32_t RT_ERROR_KERNEL_INVALID = 0x07080009;
221constexpr int32_t RT_ERROR_SYMBOL_NOT_FOUND = 0x0708000A;221constexpr int32_t RT_ERROR_SYMBOL_NOT_FOUND = 0x0708000A;
222constexpr int32_t RT_ERROR_INVALID_SYMBOL = 0x0708000B;
222 223 
223constexpr int32_t RT_ERROR_PROGRAM_BASE = 0x07090000;224constexpr int32_t RT_ERROR_PROGRAM_BASE = 0x07090000;
224constexpr int32_t RT_ERROR_PROGRAM_NULL = 0x07090001;225constexpr int32_t RT_ERROR_PROGRAM_NULL = 0x07090001;
Asrc/runtime/core/inc/kernel/symbol_table.hpp+48-0
@@ -0,0 +1,48 @@
1/**
2 * Copyright (c) 2026 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 __CCE_RUNTIME_SYMBOL_TABLE_HPP__
Z
Zzlmay0075月28日

头文件宏一般不要前后的__了吧?CCE_RUNTIME_SYMBOL_TABLE_HPP

likedislike
huzeyong_rts
5月28日 评论:
likedislike
12#define __CCE_RUNTIME_SYMBOL_TABLE_HPP__
13 
14#include <map>
15#include "base.hpp"
16#include "osal.hpp"
17 
18namespace cce {
19namespace runtime {
20 
21struct SymbolEntry {
22 void *binHandle;
23 const void *hostVar;
24 const char *deviceVarName;
25 uint32_t deviceSymbolOffset;
26 uint32_t deviceSymbolSize;
27 uint32_t flags;
28};
29 
30class SymbolTable : public NoCopy {
31public:
32 SymbolTable() = default;
33 
34 rtError_t Register(void *binHandle, const void *hostVar, const char *deviceVarName,
35 size_t size, uint32_t flags);
36 rtError_t Lookup(const void *hostVar, SymbolEntry &entry);
37 rtError_t GetDeviceAddress(const void *hostVar, uint32_t deviceId, void **devPtr);
38 rtError_t GetSize(const void *hostVar, size_t *size);
39 
40private:
41 std::map<const void *, SymbolEntry> symbolMap_;
42 SpinLock symbolMapLock_;
43};
44 
45} // namespace runtime
46} // namespace cce
47 
48#endif // __CCE_RUNTIME_SYMBOL_TABLE_HPP__
Msrc/runtime/core/inc/runtime.hpp+7-0
@@ -14,6 +14,7 @@
14#include "osal.hpp"14#include "osal.hpp"
15#include "reference.hpp"15#include "reference.hpp"
16#include "kernel.hpp"16#include "kernel.hpp"
17#include "symbol_table.hpp"
17#include "program.hpp"18#include "program.hpp"
18#include "tsch_defines.h"19#include "tsch_defines.h"
19#include "driver.hpp"20#include "driver.hpp"
@@ -226,6 +227,10 @@ public:
226 return xpuCtxt_;227 return xpuCtxt_;
227 }228 }
228 229 
230 SymbolTable &GetSymbolTable() {
231 return symbolTable_;
232 }
233 
229 rtError_t MallocProgramAndReg(const rtDevBinary_t *const bin, Program **const newProg) const;234 rtError_t MallocProgramAndReg(const rtDevBinary_t *const bin, Program **const newProg) const;
230 rtKernelAttrType Magic2KernelAttrType(const uint32_t magic) const;235 rtKernelAttrType Magic2KernelAttrType(const uint32_t magic) const;
231 rtKernelAttrType GetDefaultKernelAttrType(void) const;236 rtKernelAttrType GetDefaultKernelAttrType(void) const;
@@ -243,6 +248,7 @@ public:
243 const void * const kernelInfoExt, const uint32_t funcMode, const char_t *kernelName);248 const void * const kernelInfoExt, const uint32_t funcMode, const char_t *kernelName);
244 const Kernel *KernelLookup(const void * const stub);249 const Kernel *KernelLookup(const void * const stub);
245 const void *StubFuncLookup(const char_t * const name);250 const void *StubFuncLookup(const char_t * const name);
251 
246 rtError_t LookupAddrByFun(const void * const stubFunc, Context * const ctx, void ** const addr);252 rtError_t LookupAddrByFun(const void * const stubFunc, Context * const ctx, void ** const addr);
247 rtError_t LookupAddrAndPrefCntWithHandle(const void * const handlePtr, const void * const kernelInfoExt,253 rtError_t LookupAddrAndPrefCntWithHandle(const void * const handlePtr, const void * const kernelInfoExt,
248 Context * const ctx, void ** const addr, uint32_t * const prefetchCnt);254 Context * const ctx, void ** const addr, uint32_t * const prefetchCnt);
@@ -691,6 +697,7 @@ public:
691 697 
692 DriverFactory driverFactory_;698 DriverFactory driverFactory_;
693 KernelTable kernelTable_;699 KernelTable kernelTable_;
700 SymbolTable symbolTable_;
694 FacadeDriver facadeDriver_;701 FacadeDriver facadeDriver_;
695 rtErrorCallback excptCallBack_;702 rtErrorCallback excptCallBack_;
696 uint32_t deviceCnt = 0U;703 uint32_t deviceCnt = 0U;
Msrc/runtime/core/src/api_impl/api_decorator.cc+12-0
@@ -80,6 +80,18 @@ rtError_t ApiDecorator::FunctionRegister(Program * const prog, const void * cons
80 return impl_->FunctionRegister(prog, stubFunc, stubName, kernelInfoExt, funcMode);80 return impl_->FunctionRegister(prog, stubFunc, stubName, kernelInfoExt, funcMode);
81}81}
82 82 
83rtError_t ApiDecorator::RegisterVariable(void * const binHandle, const void * const hostVar,
84 const char_t * const deviceVarName, const size_t size, const uint32_t flags)
85{
86 return impl_->RegisterVariable(binHandle, hostVar, deviceVarName, size, flags);
87}
88 
89rtError_t ApiDecorator::SymbolLookup(const void * const hostVar, void ** const devPtr,
90 size_t * const size)
91{
92 return impl_->SymbolLookup(hostVar, devPtr, size);
93}
94 
83rtError_t ApiDecorator::GetFunctionByName(const char_t * const stubName, void ** const stubFunc)95rtError_t ApiDecorator::GetFunctionByName(const char_t * const stubName, void ** const stubFunc)
84{96{
85 return impl_->GetFunctionByName(stubName, stubFunc);97 return impl_->GetFunctionByName(stubName, stubFunc);
Msrc/runtime/core/src/api_impl/api_decorator.hpp+4-0
@@ -62,6 +62,10 @@ public:
62 rtError_t DependencyRegister(Program * const mProgram, Program * const sProgram) override;62 rtError_t DependencyRegister(Program * const mProgram, Program * const sProgram) override;
63 rtError_t FunctionRegister(Program * const prog, const void * const stubFunc, const char_t * const stubName,63 rtError_t FunctionRegister(Program * const prog, const void * const stubFunc, const char_t * const stubName,
64 const void * const kernelInfoExt, const uint32_t funcMode) override;64 const void * const kernelInfoExt, const uint32_t funcMode) override;
65 rtError_t RegisterVariable(void * const binHandle, const void * const hostVar,
66 const char_t * const deviceVarName, const size_t size, const uint32_t flags) override;
67 rtError_t SymbolLookup(const void * const hostVar, void ** const devPtr,
68 size_t * const size) override;
65 rtError_t GetFunctionByName(const char_t * const stubName, void ** const stubFunc) override;69 rtError_t GetFunctionByName(const char_t * const stubName, void ** const stubFunc) override;
66 rtError_t GetAddrByFun(const void * const stubFunc, void ** const addr) override;70 rtError_t GetAddrByFun(const void * const stubFunc, void ** const addr) override;
67 rtError_t GetAddrAndPrefCntWithHandle(void * const hdl, const void * const kernelInfoExt,71 rtError_t GetAddrAndPrefCntWithHandle(void * const hdl, const void * const kernelInfoExt,
Msrc/runtime/core/src/api_impl/api_error.cc+28-2
@@ -119,6 +119,32 @@ rtError_t ApiErrorDecorator::FunctionRegister(Program * const prog, const void *
119 return error;119 return error;
120}120}
121 121 
122rtError_t ApiErrorDecorator::RegisterVariable(void * const binHandle, const void * const hostVar,
123 const char_t * const deviceVarName, const size_t size, const uint32_t flags)
124{
125 NULL_PTR_RETURN_MSG_OUTER(binHandle, RT_ERROR_INVALID_VALUE);
126 NULL_PTR_RETURN_MSG_OUTER(hostVar, RT_ERROR_INVALID_VALUE);
127 NULL_PTR_RETURN_MSG_OUTER(deviceVarName, RT_ERROR_INVALID_VALUE);
128
129 const auto len = strnlen(deviceVarName, static_cast<size_t>(NAME_MAX_LENGTH));
130 COND_RETURN_AND_MSG_OUTER_WITH_PARAM(len >= NAME_MAX_LENGTH, RT_ERROR_INVALID_VALUE, len,
131 "less than " + std::to_string(NAME_MAX_LENGTH));
132 
133 const rtError_t error = impl_->RegisterVariable(binHandle, hostVar, deviceVarName, size, flags);
134 ERROR_RETURN(error, "Register variable failed, hostVar=%p, deviceVarName=%s.", hostVar, deviceVarName);
135 return error;
136}
137 
138rtError_t ApiErrorDecorator::SymbolLookup(const void * const hostVar, void ** const devPtr,
139 size_t * const size)
140{
141 NULL_PTR_RETURN_MSG_OUTER(devPtr, RT_ERROR_INVALID_VALUE);
142 NULL_PTR_RETURN_MSG_OUTER(size, RT_ERROR_INVALID_VALUE);
143 const rtError_t error = impl_->SymbolLookup(hostVar, devPtr, size);
144 ERROR_RETURN(error, "Symbol lookup failed, hostVar=%p.", hostVar);
145 return error;
146}
147 
122rtError_t ApiErrorDecorator::GetFunctionByName(const char_t * const stubName, void ** const stubFunc)148rtError_t ApiErrorDecorator::GetFunctionByName(const char_t * const stubName, void ** const stubFunc)
123{149{
124 NULL_PTR_RETURN_MSG_OUTER(stubFunc, RT_ERROR_INVALID_VALUE);150 NULL_PTR_RETURN_MSG_OUTER(stubFunc, RT_ERROR_INVALID_VALUE);
@@ -5277,7 +5303,7 @@ rtError_t ApiErrorDecorator::ImportFromShareableHandleV2(const void *shareableHa
5277 (handleType != RT_MEM_SHARE_HANDLE_TYPE_DEFAULT && handleType != RT_MEM_SHARE_HANDLE_TYPE_FABRIC), 5303 (handleType != RT_MEM_SHARE_HANDLE_TYPE_DEFAULT && handleType != RT_MEM_SHARE_HANDLE_TYPE_FABRIC),
5278 RT_ERROR_INVALID_VALUE, handleType, std::to_string(RT_MEM_SHARE_HANDLE_TYPE_DEFAULT) 5304 RT_ERROR_INVALID_VALUE, handleType, std::to_string(RT_MEM_SHARE_HANDLE_TYPE_DEFAULT)
5279 + " or " + std::to_string(RT_MEM_SHARE_HANDLE_TYPE_FABRIC));5305 + " or " + std::to_string(RT_MEM_SHARE_HANDLE_TYPE_FABRIC));
5280 COND_RETURN_AND_MSG_OUTER_WITH_PARAM((flags != 0U), RT_ERROR_INVALID_VALUE, flags, "0");5306 COND_RETURN_AND_MSG_OUTER_WITH_PARAM((flags != 0U), RT_ERROR_INVALID_VALUE, flags, "0");
5281 int32_t realDeviceId = 0;5307 int32_t realDeviceId = 0;
5282 rtError_t error = Runtime::Instance()->ChgUserDevIdToDeviceId(5308 rtError_t error = Runtime::Instance()->ChgUserDevIdToDeviceId(
5283 static_cast<uint32_t>(devId), RtPtrToPtr<uint32_t *>(&realDeviceId));5309 static_cast<uint32_t>(devId), RtPtrToPtr<uint32_t *>(&realDeviceId));
@@ -6245,7 +6271,7 @@ rtError_t ApiErrorDecorator::FunctionGetAvailDynUbufPerBlock(Kernel *funcHandle,
6245{6271{
6246 NULL_PTR_RETURN_MSG_OUTER(funcHandle, RT_ERROR_INVALID_VALUE);6272 NULL_PTR_RETURN_MSG_OUTER(funcHandle, RT_ERROR_INVALID_VALUE);
6247 NULL_PTR_RETURN_MSG_OUTER(dynamicUbufSize, RT_ERROR_INVALID_VALUE);6273 NULL_PTR_RETURN_MSG_OUTER(dynamicUbufSize, RT_ERROR_INVALID_VALUE);
6248 COND_RETURN_AND_MSG_OUTER_WITH_PARAM((flags != 0U), RT_ERROR_INVALID_VALUE, flags, "0");6274 COND_RETURN_AND_MSG_OUTER_WITH_PARAM((flags != 0U), RT_ERROR_INVALID_VALUE, flags, "0");
6249 6275 
6250 Program * const prog = funcHandle->Program_();6276 Program * const prog = funcHandle->Program_();
6251 NULL_PTR_RETURN_MSG(prog, RT_ERROR_PROGRAM_NULL);6277 NULL_PTR_RETURN_MSG(prog, RT_ERROR_PROGRAM_NULL);
Msrc/runtime/core/src/api_impl/api_error.hpp+4-0
@@ -60,6 +60,10 @@ public:
60 rtError_t DependencyRegister(Program * const mProgram, Program * const sProgram) override;60 rtError_t DependencyRegister(Program * const mProgram, Program * const sProgram) override;
61 rtError_t FunctionRegister(Program * const prog, const void * const stubFunc, const char_t * const stubName,61 rtError_t FunctionRegister(Program * const prog, const void * const stubFunc, const char_t * const stubName,
62 const void * const kernelInfoExt, const uint32_t funcMode) override;62 const void * const kernelInfoExt, const uint32_t funcMode) override;
63 rtError_t RegisterVariable(void * const binHandle, const void * const hostVar,
64 const char_t * const deviceVarName, const size_t size, const uint32_t flags) override;
65 rtError_t SymbolLookup(const void * const hostVar, void ** const devPtr,
66 size_t * const size) override;
63 rtError_t GetFunctionByName(const char_t * const stubName, void ** const stubFunc) override;67 rtError_t GetFunctionByName(const char_t * const stubName, void ** const stubFunc) override;
64 rtError_t GetAddrByFun(const void * const stubFunc, void ** const addr) override;68 rtError_t GetAddrByFun(const void * const stubFunc, void ** const addr) override;
65 rtError_t GetAddrAndPrefCntWithHandle(void * const hdl, const void * const kernelInfoExt,69 rtError_t GetAddrAndPrefCntWithHandle(void * const hdl, const void * const kernelInfoExt,
Msrc/runtime/core/src/api_impl/api_impl.cc+24-0
@@ -85,6 +85,7 @@
85#include "fast_recover.hpp"85#include "fast_recover.hpp"
86#include "simd_memsetd32.h"86#include "simd_memsetd32.h"
87#include "common_memset_d32.h"87#include "common_memset_d32.h"
88#include "kernel/symbol_table.hpp"
88#include "snapshot_callback_manager.hpp"89#include "snapshot_callback_manager.hpp"
89#include "snapshot_process_helper.hpp"90#include "snapshot_process_helper.hpp"
90 91 
@@ -412,6 +413,29 @@ rtError_t ApiImpl::FunctionRegister(Program * const prog, const void * const stu
412 return Runtime::Instance()->KernelRegister(prog, stubFunc, stubName, kernelInfoExt, funcMode);413 return Runtime::Instance()->KernelRegister(prog, stubFunc, stubName, kernelInfoExt, funcMode);
413}414}
414 415 
416rtError_t ApiImpl::RegisterVariable(void * const binHandle, const void * const hostVar,
417 const char_t * const deviceVarName, const size_t size, const uint32_t flags)
418{
419 RT_LOG(RT_LOG_INFO, "register variable, hostVar=%p, deviceVarName=%s, size=%zu, flags=%u.",
H
Hhouyanbao5月29日

这里直接打印name,会不会因为name非法,导致打穿

likedislike
huzeyong_rts
5月30日 评论:
likedislike
420 hostVar, deviceVarName, size, flags);
421 return Runtime::Instance()->GetSymbolTable().Register(binHandle, hostVar, deviceVarName, size, flags);
422}
423 
424rtError_t ApiImpl::SymbolLookup(const void * const hostVar, void ** const devPtr,
425 size_t * const size)
426{
427 Context * const curCtx = CurrentContext();
428 CHECK_CONTEXT_VALID_WITH_RETURN(curCtx, RT_ERROR_CONTEXT_NULL);
429 NULL_PTR_RETURN_MSG(curCtx->Device_(), RT_ERROR_DEVICE_NULL);
430 const uint32_t deviceId = static_cast<uint32_t>(curCtx->Device_()->Id_());
431 
432 RT_LOG(RT_LOG_DEBUG, "lookup symbol, hostVar=%p, device_id=%u.", hostVar, deviceId);
433 rtError_t error = Runtime::Instance()->GetSymbolTable().GetDeviceAddress(hostVar, deviceId, devPtr);
434 COND_RETURN_WITH_NOLOG(error != RT_ERROR_NONE, error);
435 error = Runtime::Instance()->GetSymbolTable().GetSize(hostVar, size);
436 return error;
437}
438 
415rtError_t ApiImpl::GetFunctionByName(const char_t * const stubName, void ** const stubFunc)439rtError_t ApiImpl::GetFunctionByName(const char_t * const stubName, void ** const stubFunc)
416{440{
417 RT_LOG(RT_LOG_DEBUG, "name=%s.", (stubName != nullptr) ? stubName : "(none)");441 RT_LOG(RT_LOG_DEBUG, "name=%s.", (stubName != nullptr) ? stubName : "(none)");
Msrc/runtime/core/src/api_impl/api_impl.hpp+4-0
@@ -70,6 +70,10 @@ public:
70 rtError_t DependencyRegister(Program * const mProgram, Program * const sProgram) override;70 rtError_t DependencyRegister(Program * const mProgram, Program * const sProgram) override;
71 rtError_t FunctionRegister(Program * const prog, const void * const stubFunc, const char_t * const stubName,71 rtError_t FunctionRegister(Program * const prog, const void * const stubFunc, const char_t * const stubName,
72 const void * const kernelInfoExt, const uint32_t funcMode) override;72 const void * const kernelInfoExt, const uint32_t funcMode) override;
73 rtError_t RegisterVariable(void * const binHandle, const void * const hostVar,
74 const char_t * const deviceVarName, const size_t size, const uint32_t flags) override;
75 rtError_t SymbolLookup(const void * const hostVar, void ** const devPtr,
76 size_t * const size) override;
73 rtError_t GetFunctionByName(const char_t * const stubName, void ** const stubFunc) override;77 rtError_t GetFunctionByName(const char_t * const stubName, void ** const stubFunc) override;
74 rtError_t GetAddrByFun(const void * const stubFunc, void ** const addr) override;78 rtError_t GetAddrByFun(const void * const stubFunc, void ** const addr) override;
75 rtError_t GetAddrAndPrefCntWithHandle(void * const hdl, const void * const kernelInfoExt,79 rtError_t GetAddrAndPrefCntWithHandle(void * const hdl, const void * const kernelInfoExt,
Msrc/runtime/core/src/common/errcode_manage.cc+1-0
@@ -222,6 +222,7 @@ void ErrorcodeManage::InitRtErrCodeMap()
222 rtErrMap_[RT_ERROR_KERNEL_UNREGISTERING] = {ACL_ERROR_RT_KERNEL_UNREGISTERING, "kernel unregistering"};222 rtErrMap_[RT_ERROR_KERNEL_UNREGISTERING] = {ACL_ERROR_RT_KERNEL_UNREGISTERING, "kernel unregistering"};
223 rtErrMap_[RT_ERROR_KERNEL_INVALID] = {ACL_ERROR_RT_INVALID_HANDLE, "invalid funcHandle"};223 rtErrMap_[RT_ERROR_KERNEL_INVALID] = {ACL_ERROR_RT_INVALID_HANDLE, "invalid funcHandle"};
224 rtErrMap_[RT_ERROR_SYMBOL_NOT_FOUND] = {ACL_ERROR_RT_SYMBOL_NOT_FOUND, "global symbol not found"};224 rtErrMap_[RT_ERROR_SYMBOL_NOT_FOUND] = {ACL_ERROR_RT_SYMBOL_NOT_FOUND, "global symbol not found"};
225 rtErrMap_[RT_ERROR_INVALID_SYMBOL] = {ACL_ERROR_RT_INVALID_SYMBOL, "invalid device symbol"};
225 226 
226 // program error227 // program error
227 rtErrMap_[RT_ERROR_PROGRAM_BASE] = {ACL_ERROR_RT_INTERNAL_ERROR, "program base error"};228 rtErrMap_[RT_ERROR_PROGRAM_BASE] = {ACL_ERROR_RT_INTERNAL_ERROR, "program base error"};
Asrc/runtime/core/src/kernel/symbol_table.cc+104-0
@@ -0,0 +1,104 @@
1/**
2 * Copyright (c) 2026 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 "kernel/symbol_table.hpp"
12#include "runtime.hpp"
13#include "context/context.hpp"
14#include "kernel/program.hpp"
15#include "common/error_message_manage.hpp"
16 
17namespace cce {
18namespace runtime {
19 
20rtError_t SymbolTable::Register(void *binHandle, const void *hostVar, const char *deviceVarName,
21 size_t size, uint32_t flags)
22{
23 Program *prog = static_cast<Program *>(binHandle);
24 ElfProgram * const elfProg = dynamic_cast<ElfProgram *>(prog);
25 COND_RETURN_ERROR_MSG_INNER(elfProg == nullptr, RT_ERROR_INVALID_VALUE, "can't dynamic_cast program.");
Z
Zzlmay0075月28日

对外打屏的ErrorMessage要经过评审

likedislike
huzeyong_rts
5月28日 评论:
likedislike
26 
27 uint64_t symbolOffset = 0ULL;
28 uint64_t symbolSizeFromBin = 0ULL;
29 rtError_t ret = elfProg->GetGlobalSymbol(deviceVarName, &symbolOffset, &symbolSizeFromBin);
30 ERROR_RETURN(ret, "Get global symbol=%s failed, retCode=%#x.", deviceVarName, ret);
31 
32 SymbolEntry entry = {};
33 entry.binHandle = binHandle;
34 entry.hostVar = hostVar;
35 entry.deviceVarName = deviceVarName;
36 entry.deviceSymbolOffset = static_cast<uint32_t>(symbolOffset);
37 entry.deviceSymbolSize = static_cast<uint32_t>(size);
38 entry.flags = flags;
39 
40 symbolMapLock_.Lock();
41 auto it = symbolMap_.find(hostVar);
42 if (it != symbolMap_.end()) {
43 symbolMapLock_.Unlock();
44 RT_LOG(RT_LOG_WARNING, "Symbol hostVar=%p, binHandle=%p already registered, skip duplicate registration.", hostVar, binHandle);
45 return RT_ERROR_NONE;
46 }
47 symbolMap_.emplace(hostVar, entry);
48 symbolMapLock_.Unlock();
49 
50 RT_LOG(RT_LOG_DEBUG, "Register symbol success, hostVar=%p, deviceVarName=%s, offset=%llu, size=%llu",
51 hostVar, deviceVarName, entry.deviceSymbolOffset, entry.deviceSymbolSize);
52 return RT_ERROR_NONE;
53}
54 
55rtError_t SymbolTable::Lookup(const void *hostVar, SymbolEntry &entry)
56{
57 symbolMapLock_.Lock();
58 auto it = symbolMap_.find(hostVar);
59 if (it == symbolMap_.end()) {
60 symbolMapLock_.Unlock();
61 RT_LOG_OUTER_MSG_IMPL(ErrorCode::EE1017, __func__, "symbol",
62 "The corresponding device variable cannot be found through the symbol");
63 return RT_ERROR_INVALID_SYMBOL;
64 }
65 
66 entry = it->second;
67 symbolMapLock_.Unlock();
68 return RT_ERROR_NONE;
69}
70 
71rtError_t SymbolTable::GetDeviceAddress(const void *hostVar, uint32_t deviceId, void **devPtr)
72{
73 SymbolEntry entry = {};
74 rtError_t ret = Lookup(hostVar, entry);
75 COND_RETURN_WITH_NOLOG(ret != RT_ERROR_NONE, ret);
76 
77 ElfProgram * const elfProg = dynamic_cast<ElfProgram *>(static_cast<Program *>(entry.binHandle));
78 COND_RETURN_ERROR_MSG_INNER(elfProg == nullptr, RT_ERROR_INVALID_VALUE, "can't dynamic_cast program.");
79 
80 ret = elfProg->Load2Device();
81 ERROR_RETURN(ret, "load program to device_id=%d failed, retCode=%#x", deviceId, ret);
82 
83 const void *baseAddr = elfProg->GetBinAlignBaseAddr(deviceId);
84 COND_RETURN_ERROR_MSG_INNER(baseAddr == nullptr, RT_ERROR_PROGRAM_DATA,
85 "binary not loaded to device, deviceId=%u", deviceId);
86 
87 *devPtr = RtValueToPtr<void *>(RtPtrToValue(baseAddr) + entry.deviceSymbolOffset);
88 RT_LOG(RT_LOG_DEBUG, "Get symbol device address, hostVar=%p, deviceId=%u, devPtr=%p",
89 hostVar, deviceId, *devPtr);
90 return RT_ERROR_NONE;
91}
92 
93rtError_t SymbolTable::GetSize(const void *hostVar, size_t *size)
94{
95 SymbolEntry entry = {};
96 rtError_t ret = Lookup(hostVar, entry);
97 COND_RETURN_WITH_NOLOG(ret != RT_ERROR_NONE, ret);
98 
99 *size = static_cast<size_t>(entry.deviceSymbolSize);
100 return RT_ERROR_NONE;
101}
102 
103} // namespace runtime
104} // namespace cce
Asrc/runtime/core/src/kernel/symbol_table_tiny_stub.cc+49-0
@@ -0,0 +1,49 @@
1/**
2 * Copyright (c) 2026 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 "symbol_table.hpp"
12 
13namespace cce {
14namespace runtime {
15rtError_t SymbolTable::Register(void *binHandle, const void *hostVar, const char *deviceVarName,
16 size_t size, uint32_t flags)
17{
18 UNUSED(binHandle);
19 UNUSED(hostVar);
20 UNUSED(deviceVarName);
21 UNUSED(size);
22 UNUSED(flags);
23 return RT_ERROR_FEATURE_NOT_SUPPORT;
24}
25 
26rtError_t SymbolTable::Lookup(const void *hostVar, SymbolEntry &entry)
27{
28 UNUSED(hostVar);
29 UNUSED(entry);
30 return RT_ERROR_FEATURE_NOT_SUPPORT;
31}
32 
33rtError_t SymbolTable::GetDeviceAddress(const void *hostVar, uint32_t deviceId, void **devPtr)
34{
35 UNUSED(hostVar);
36 UNUSED(deviceId);
37 UNUSED(devPtr);
38 return RT_ERROR_FEATURE_NOT_SUPPORT;
39}
40 
41rtError_t SymbolTable::GetSize(const void *hostVar, size_t *size)
42{
43 UNUSED(hostVar);
44 UNUSED(size);
45 return RT_ERROR_FEATURE_NOT_SUPPORT;
46}
47 
48} // namespace runtime
49} // namespace cce
Mtests/ut/runtime/runtime/CMakeLists.txt+7-0
@@ -408,6 +408,7 @@ set(runtimeut_src_tiny_exclude_list
408 ${TOP_DIR}/src/runtime/core/src/task/task_info/event/notify_task_v200.cc408 ${TOP_DIR}/src/runtime/core/src/task/task_info/event/notify_task_v200.cc
409 ${TOP_DIR}/src/runtime/core/src/memory/common_memset_d32.cpp409 ${TOP_DIR}/src/runtime/core/src/memory/common_memset_d32.cpp
410 ${TOP_DIR}/src/runtime/core/src/memory/simd_memsetd32.cpp410 ${TOP_DIR}/src/runtime/core/src/memory/simd_memsetd32.cpp
411 ${TOP_DIR}/src/runtime/core/src/kernel/symbol_table.cc
411)412)
412 413 
413set(runtimeut_src_tiny_include_list414set(runtimeut_src_tiny_include_list
@@ -425,6 +426,7 @@ set(runtimeut_src_tiny_include_list
425 ${TOP_DIR}/src/runtime/core/src/engine/engine_factory_tiny_stub.cc426 ${TOP_DIR}/src/runtime/core/src/engine/engine_factory_tiny_stub.cc
426 ${TOP_DIR}/src/runtime/core/src/kernel/binary_loader_tiny_stub.cc427 ${TOP_DIR}/src/runtime/core/src/kernel/binary_loader_tiny_stub.cc
427 ${TOP_DIR}/src/runtime/core/src/kernel/program_common.cc428 ${TOP_DIR}/src/runtime/core/src/kernel/program_common.cc
429 ${TOP_DIR}/src/runtime/core/src/kernel/symbol_table_tiny_stub.cc
428 ${TOP_DIR}/src/runtime/core/src/kernel/kernel_utils.cc430 ${TOP_DIR}/src/runtime/core/src/kernel/kernel_utils.cc
429 ${TOP_DIR}/src/runtime/core/src/profiler/api_profile_log_decoratoc_tiny_stub.cc431 ${TOP_DIR}/src/runtime/core/src/profiler/api_profile_log_decoratoc_tiny_stub.cc
430 ${TOP_DIR}/src/runtime/core/src/profiler/api_profile_decorator_tiny_stub.cc432 ${TOP_DIR}/src/runtime/core/src/profiler/api_profile_decorator_tiny_stub.cc
@@ -504,6 +506,7 @@ set(runtimeut_src_list
504 ${TOP_DIR}/src/runtime/core/src/kernel/program_common.cc506 ${TOP_DIR}/src/runtime/core/src/kernel/program_common.cc
505 ${TOP_DIR}/src/runtime/core/src/kernel/v100/program_plat.cc507 ${TOP_DIR}/src/runtime/core/src/kernel/v100/program_plat.cc
506 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc508 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc
509 ${TOP_DIR}/src/runtime/core/src/kernel/symbol_table.cc
507 ${TOP_DIR}/src/runtime/core/src/kernel/kernel_utils.cc510 ${TOP_DIR}/src/runtime/core/src/kernel/kernel_utils.cc
508 ${TOP_DIR}/src/runtime/feature/soma/soma.cc511 ${TOP_DIR}/src/runtime/feature/soma/soma.cc
509 ${TOP_DIR}/src/runtime/feature/soma/stream_mem_pool.cc512 ${TOP_DIR}/src/runtime/feature/soma/stream_mem_pool.cc
@@ -669,6 +672,7 @@ set(runtimeut_david_src_list
669 ${TOP_DIR}/src/runtime/core/src/kernel/kernel.cc672 ${TOP_DIR}/src/runtime/core/src/kernel/kernel.cc
670 ${TOP_DIR}/src/runtime/core/src/kernel/module.cc673 ${TOP_DIR}/src/runtime/core/src/kernel/module.cc
671 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc674 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc
675 ${TOP_DIR}/src/runtime/core/src/kernel/symbol_table.cc
672 ${TOP_DIR}/src/runtime/feature/soma/soma.cc676 ${TOP_DIR}/src/runtime/feature/soma/soma.cc
673 ${TOP_DIR}/src/runtime/feature/soma/stream_mem_pool.cc677 ${TOP_DIR}/src/runtime/feature/soma/stream_mem_pool.cc
674 ${TOP_DIR}/src/runtime/core/src/launch/label.cc678 ${TOP_DIR}/src/runtime/core/src/launch/label.cc
@@ -727,6 +731,7 @@ set(runtimeut_david_src_list
727 ${TOP_DIR}/src/runtime/core/src/runtime_v200/runtime_adapt.cc731 ${TOP_DIR}/src/runtime/core/src/runtime_v200/runtime_adapt.cc
728 ${TOP_DIR}/src/runtime/feature/xpu/program_plat.cc732 ${TOP_DIR}/src/runtime/feature/xpu/program_plat.cc
729 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc733 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc
734 ${TOP_DIR}/src/runtime/core/src/kernel/symbol_table.cc
730 ${TOP_DIR}/src/runtime/core/src/kernel/program_common.cc735 ${TOP_DIR}/src/runtime/core/src/kernel/program_common.cc
731 ${TOP_DIR}/src/runtime/core/src/kernel/kernel_utils.cc736 ${TOP_DIR}/src/runtime/core/src/kernel/kernel_utils.cc
732 ${TOP_DIR}/src/runtime/core/src/kernel/json_parse.cc737 ${TOP_DIR}/src/runtime/core/src/kernel/json_parse.cc
@@ -843,6 +848,7 @@ add_executable(runtime_utest
843 test/rt_utest_module.cc848 test/rt_utest_module.cc
844 test/rt_utest_elf.cc849 test/rt_utest_elf.cc
845 test/rt_utest_program.cc850 test/rt_utest_program.cc
851 test/rt_utest_symbol.cc
846 test/rt_utest_runtime.cc852 test/rt_utest_runtime.cc
847 test/rt_utest_kernel.cc853 test/rt_utest_kernel.cc
848 test/rt_utest_config.cc854 test/rt_utest_config.cc
@@ -1505,6 +1511,7 @@ set(runtimeut_v201_src_list
1505 ${TOP_DIR}/src/runtime/core/src/kernel/module.cc1511 ${TOP_DIR}/src/runtime/core/src/kernel/module.cc
1506 ${TOP_DIR}/src/runtime/core/src/kernel/kernel.cc1512 ${TOP_DIR}/src/runtime/core/src/kernel/kernel.cc
1507 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc1513 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc
1514 ${TOP_DIR}/src/runtime/core/src/kernel/symbol_table.cc
1508 ${TOP_DIR}/src/runtime/core/src/runtime_v200/runtime_adapt.cc1515 ${TOP_DIR}/src/runtime/core/src/runtime_v200/runtime_adapt.cc
1509 ${TOP_DIR}/src/runtime/feature/xpu/program_plat.cc1516 ${TOP_DIR}/src/runtime/feature/xpu/program_plat.cc
1510 ${TOP_DIR}/src/runtime/feature/soma/soma.cc1517 ${TOP_DIR}/src/runtime/feature/soma/soma.cc
Mtests/ut/runtime/runtime/test/platform/910B/CMakeLists.txt+1-0
@@ -279,6 +279,7 @@ set(runtimeut_910b_src_list
279 ${TOP_DIR}/src/runtime/core/src/kernel/kernel.cc279 ${TOP_DIR}/src/runtime/core/src/kernel/kernel.cc
280 ${TOP_DIR}/src/runtime/core/src/kernel/module.cc280 ${TOP_DIR}/src/runtime/core/src/kernel/module.cc
281 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc281 ${TOP_DIR}/src/runtime/core/src/kernel/program.cc
282 ${TOP_DIR}/src/runtime/core/src/kernel/symbol_table.cc
282 ${TOP_DIR}/src/runtime/feature/soma/soma.cc283 ${TOP_DIR}/src/runtime/feature/soma/soma.cc
283 ${TOP_DIR}/src/runtime/feature/soma/stream_mem_pool.cc284 ${TOP_DIR}/src/runtime/feature/soma/stream_mem_pool.cc
284 ${TOP_DIR}/src/runtime/core/src/launch/cmo_barrier_common.cc285 ${TOP_DIR}/src/runtime/core/src/launch/cmo_barrier_common.cc
Atests/ut/runtime/runtime/test/rt_utest_symbol.cc+117-0
@@ -0,0 +1,117 @@
1/**
2 * Copyright (c) 2026 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#include "runtime/rt.h"
11#include "runtime/inner_kernel.h"
12#include "runtime.hpp"
13#include "api.hpp"
14#include "kernel/program.hpp"
15#include "kernel/elf.hpp"
16#include "securec.h"
17#include "gtest/gtest.h"
18#include "mockcpp/mockcpp.hpp"
19 
20using namespace testing;
21using namespace cce::runtime;
22 
23class SymbolTest : public testing::Test {
24protected:
25 static void SetUpTestCase()
26 {
27 std::cout << "symbol test start" << std::endl;
28 }
29 
30 static void TearDownTestCase()
31 {
32 std::cout << "symbol test end" << std::endl;
33 }
34 
35 virtual void SetUp()
36 {
37 rtSetDevice(0);
38 prog_ = CreateMockElfProgram();
39 Runtime::Instance()->GetSymbolTable().Register(prog_, &hostVar_, "test_symbol", sizeof(hostVar_), 0U);
40 }
41 
42 virtual void TearDown()
43 {
44 delete prog_;
45 prog_ = nullptr;
46 rtDeviceReset(0);
47 GlobalMockObject::verify();
48 }
49 
50 ElfProgram *CreateMockElfProgram()
51 {
52 ElfProgram *prog = new ElfProgram();
53 prog->elfData_ = new rtElfData();
54 prog->elfData_->globalSymbolMap["test_symbol"] = {0x100, sizeof(int)};
55 prog->SetBinBaseAddr((void *)0x8000, 0);
56 prog->SetBinAlignBaseAddr((void *)0x8000, 0);
57 return prog;
58 }
59 
60 ElfProgram *prog_ = nullptr;
61 int hostVar_ = 0;
62};
63 
64TEST_F(SymbolTest, rtSymbolLookup_SymbolNotFound)
65{
66 int hostVarNotFound = 0;
67 void *devPtr = nullptr;
68 size_t size = 0;
69 
70 rtError_t error = rtSymbolLookup(&hostVarNotFound, &devPtr, &size);
71 EXPECT_EQ(error, ACL_ERROR_RT_INVALID_SYMBOL);
72}
73 
74TEST_F(SymbolTest, rtSymbolLookup_Success)
75{
76 void *devPtr = nullptr;
77 size_t size = 0;
78 
79 rtError_t error = rtSymbolLookup(&hostVar_, &devPtr, &size);
80 EXPECT_EQ(error, ACL_RT_SUCCESS);
81 EXPECT_EQ(devPtr, (void *)0x8100);
82 EXPECT_EQ(size, sizeof(hostVar_));
83}
84 
85TEST_F(SymbolTest, SymbolTable_Register_Duplicate)
86{
87 rtError_t error = Runtime::Instance()->GetSymbolTable().Register(prog_, &hostVar_, "test_symbol", sizeof(hostVar_), 0U);
88 EXPECT_EQ(error, RT_ERROR_NONE);
89}
90 
91TEST_F(SymbolTest, ApiRegisterVariable_DeviceVarNameTooLong)
92{
93 Api *api = Api::Instance();
94 int newHostVar = 0;
95 char longName[4097]; // NAME_MAX_LENGTH = 4096
96 (void)memset_s(longName, sizeof(longName), 'a', 4096);
97 longName[4096] = '\0';
98 
99 rtError_t error = api->RegisterVariable(prog_, &newHostVar, longName, sizeof(newHostVar), 0U);
100 EXPECT_EQ(error, RT_ERROR_INVALID_VALUE);
101}
102 
103TEST_F(SymbolTest, ApiRegisterVariable_ImplSuccess)
104{
105 Api *api = Api::Instance();
106 int newHostVar = 0;
107 prog_->elfData_->globalSymbolMap["new_symbol"] = {0x200, sizeof(int)};
108 
109 rtError_t error = api->RegisterVariable(prog_, &newHostVar, "new_symbol", sizeof(newHostVar), 0U);
110 EXPECT_EQ(error, RT_ERROR_NONE);
111 
112 void *devPtr = nullptr;
113 size_t size = 0;
114 error = rtSymbolLookup(&newHostVar, &devPtr, &size);
115 EXPECT_EQ(error, ACL_RT_SUCCESS);
116}
117