已合并
math仓资料扫描整改 #1996
sunchun创建于 3月30日
math仓资料扫描整改 #1996
已合并
sunchun创建于 3月30日
从已删除 :text1合入到cann/ops-mathmaster
共 28 个文件变更+158-173
@@ -15,7 +15,7 @@
15 15 
16## 功能说明16## 功能说明
17 17 
18- 如果输入是向量(一维向量),则返回二维矩阵张量,其中input元素为对角线;18+ 如果输入是向量(一维向量),则返回二维矩阵张量,其中input元素为对角线;
19 如果输入是二维张量,则输出一维向量,取值为diagonal指定的输入矩阵的对角线元素。19 如果输入是二维张量,则输出一维向量,取值为diagonal指定的输入矩阵的对角线元素。
20 20 
21## 函数原型21## 函数原型
@@ -19,7 +19,7 @@
19 19 
20 图像到列,滑动局部窗口数据转为列向量,拼接为大张量。从批处理输入张量中提取滑动窗口。20 图像到列,滑动局部窗口数据转为列向量,拼接为大张量。从批处理输入张量中提取滑动窗口。
21 21 
22- 考虑一个形状为(N, C, H, W)或 (C, H, W) 的批处理input张量,其中N是批处理维度, C是通道维度, 而 H, W 表示图像大小,此操作将input的空间维度内的每个滑动kernel_size大小的块展平为(N, C $\times \prod$(kernel_size), L)的3-D 或 (C $\times \prod$(kernel_szie), L)的2-D 的 output张量的列(即最后一维),而L是这些块的总数。22+ 考虑一个形状为(N, C, H, W)或 (C, H, W) 的批处理input张量,其中N是批处理维度, C是通道维度, 而 H, W 表示图像大小,此操作将input的空间维度内的每个滑动kernel_size大小的块展平为(N, C $\times \prod$(kernel_size), L)的3-D 或 (C $\times \prod$(kernel_size), L)的2-D 的 output张量的列(即最后一维),而L是这些块的总数。
23- 计算公式:23- 计算公式:
24 24 
25 $L = \prod_{d} \lfloor \frac{spatial\_size[d] + 2 \times padding[d] - dilation[d] \times (kernel\_size[d] -1) -1}{stride[d]} + 1 \rfloor$, 其中spatial_size由上述input张量的H,W构成。25 $L = \prod_{d} \lfloor \frac{spatial\_size[d] + 2 \times padding[d] - dilation[d] \times (kernel\_size[d] -1) -1}{stride[d]} + 1 \rfloor$, 其中spatial_size由上述input张量的H,W构成。
@@ -87,7 +87,7 @@
87 </tr>87 </tr>
88 <tr>88 <tr>
89 <td>math</td>89 <td>math</td>
90- <td><a href="../../math/diag_v2/README.md">diag_v2</a></td>90+ <td><a href="../../conversion/diag_v2/README.md">diag_v2</a></td>
91 <td>√</td>91 <td>√</td>
92 <td>√</td>92 <td>√</td>
93 <td>×</td>93 <td>×</td>
@@ -225,16 +225,6 @@
225 <td>AI Core</td>225 <td>AI Core</td>
226 <td>对输入张量self进行RFFT(傅里叶变换)计算,输出是一个包含非负频率的复数张量。</td>226 <td>对输入张量self进行RFFT(傅里叶变换)计算,输出是一个包含非负频率的复数张量。</td>
227 </tr>227 </tr>
228- <tr>
229- <td>math</td>
230- <td><a href="../../math/ring_attention_update/README.md">ring_attention_update</a></td>
231- <td>√</td>
232- <td>√</td>
233- <td>×</td>
234- <td>√</td>
235- <td>AI Core</td>
236- <td>RingAttentionUpdate算子功能是将两次FlashAttention的输出根据其不同的softmax的max和sum更新。</td>
237- </tr>
238 <tr>228 <tr>
239 <td>math</td>229 <td>math</td>
240 <td><a href="../../math/segsum/README.md">segsum</a></td>230 <td><a href="../../math/segsum/README.md">segsum</a></td>
@@ -183,7 +183,7 @@ int main() {
183 ret = CreateAclTensor(outHostData, outShape, &outDeviceAddr, aclDataType::ACL_FLOAT, &out);183 ret = CreateAclTensor(outHostData, outShape, &outDeviceAddr, aclDataType::ACL_FLOAT, &out);
184 CHECK_RET(ret == ACL_SUCCESS, return ret);184 CHECK_RET(ret == ACL_SUCCESS, return ret);
185 185 
186- // 3. 调用CANN算子库API,需要修改为具体的Api名称186+ // 3. 调用CANN算子库API,需要修改为具体的API名称
187 uint64_t workspaceSize = 0;187 uint64_t workspaceSize = 0;
188 aclOpExecutor* executor;188 aclOpExecutor* executor;
189 189 
@@ -137,7 +137,7 @@ aclnnStatus aclnnSum(
137 <td>tensors列表和out的数据类型不一致。</td>137 <td>tensors列表和out的数据类型不一致。</td>
138 </tr>138 </tr>
139 <tr>139 <tr>
140- <td>tensors和out的shape不满足broadcast规则,或者broadcast后的shape与out不一致。</td>140+ <td>tensors和out的shape不满足broadcast规则,或者broadcast后的shape与out不一致。</td>
141 </tr>141 </tr>
142 </tbody>142 </tbody>
143 </table>143 </table>
@@ -43,7 +43,7 @@ aclnnStatus aclnnAcos(
43 void* workspace, 43 void* workspace,
44 uint64_t workspaceSize, 44 uint64_t workspaceSize,
45 aclOpExecutor* executor, 45 aclOpExecutor* executor,
46- const aclrtStream stream)46+ aclrtStream stream)
47```47```
48 48 
49```cpp49```cpp
@@ -58,7 +58,7 @@ aclnnStatus aclnnInplaceAcos(
58 void* workspace, 58 void* workspace,
59 uint64_t workspaceSize, 59 uint64_t workspaceSize,
60 aclOpExecutor* executor, 60 aclOpExecutor* executor,
61- const aclrtStream stream)61+ aclrtStream stream)
62```62```
63 63 
64## aclnnAcosGetWorkspaceSize64## aclnnAcosGetWorkspaceSize
@@ -216,7 +216,7 @@ aclnnStatus aclnnInplaceAddr(
216 <td>beta或者alpha为bool类型时,self、vec1、vec2数据类型非bool类型。</td>216 <td>beta或者alpha为bool类型时,self、vec1、vec2数据类型非bool类型。</td>
217 </tr>217 </tr>
218 <tr>218 <tr>
219- <td>self、vec1、vec2类型都为整型或bool或"整型+bool"时,beta或alpha为浮点型。</td>219+ <td>self、vec1、vec2类型都为整型或bool或“整型+bool”时,beta或alpha为浮点型。</td>
220 </tr>220 </tr>
221 </tbody>221 </tbody>
222 </table>222 </table>
@@ -239,7 +239,7 @@ aclnnStatus aclnnInplaceAsinh(
239 <tbody>239 <tbody>
240 <tr>240 <tr>
241 <td>inputRef (aclTensor*)</td>241 <td>inputRef (aclTensor*)</td>
242- <td>输入/输出</td>242+ <td>输入</td>
243 <td>-</td>243 <td>-</td>
244 <td>-</td>244 <td>-</td>
245 <td>FLOAT、FLOAT16、DOUBLE</td>245 <td>FLOAT、FLOAT16、DOUBLE</td>
@@ -233,159 +233,154 @@ aclnnStatus aclnnBincount(
233#include <iostream>233#include <iostream>
234#include <vector>234#include <vector>
235#include "acl/acl.h"235#include "acl/acl.h"
236-#include "aclnnop/aclnn_max.h"
237#include "aclnnop/aclnn_bincount.h"236#include "aclnnop/aclnn_bincount.h"
238 237 
239#define CHECK_RET(cond, return_expr) \238#define CHECK_RET(cond, return_expr) \
240- do { \239+ do { \
241- if (!(cond)) { \240+ if (!(cond)) { \
242- return_expr; \241+ return_expr; \
243- } \242+ } \
244- } while (0)243+ } while (0)
245 244 
246-#define LOG_PRINT(message, ...) \245+#define LOG_PRINT(message, ...) \
247- do { \246+ do { \
248- printf(message, ##__VA_ARGS__); \247+ printf(message, ##__VA_ARGS__); \
249- } while (0)248+ } while (0)
250 249 
251-int64_t GetShapeSize(const std::vector<int64_t>& shape) {250+int64_t GetShapeSize(const std::vector<int64_t>& shape)
252- int64_t shapeSize = 1;251+{
253- for (auto i : shape) {252+ int64_t shapeSize = 1;
254- shapeSize *= i;253+ for (auto i : shape) {
255- }254+ shapeSize *= i;
256- return shapeSize;255+ }
256+ return shapeSize;
257}257}
258 258 
259-int Init(int32_t deviceId, aclrtStream* stream) {259+int Init(int32_t deviceId, aclrtStream* stream)
260- auto ret = aclInit(nullptr);260+{
261- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);261+ // 固定写法,资源初始化
262- ret = aclrtSetDevice(deviceId);262+ auto ret = aclInit(nullptr);
263- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);263+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
264- ret = aclrtCreateStream(stream);264+ ret = aclrtSetDevice(deviceId);
265- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);265+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
266- return 0;266+ ret = aclrtCreateStream(stream);
267+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
268+ return 0;
267}269}
268 270 
269template <typename T>271template <typename T>
270-int CreateAclTensor(const std::vector<T>& hostData, const std::vector<int64_t>& shape, void** deviceAddr,272+int CreateAclTensor(
271- aclDataType dataType, aclTensor** tensor) {273+ const std::vector<T>& hostData, const std::vector<int64_t>& shape, void** deviceAddr, aclDataType dataType,
272- auto size = GetShapeSize(shape) * sizeof(T);274+ aclTensor** tensor)
273- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);275+{
274- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);276+ auto size = GetShapeSize(shape) * sizeof(T);
275- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);277+ // 调用aclrtMalloc申请device侧内存
276- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);278+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
279+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
280+ // 调用aclrtMemcpy将host侧数据拷贝到device侧内存上
281+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
282+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
277 283 
278- std::vector<int64_t> strides(shape.size(), 1);284+ // 计算连续tensor的strides
279- for (int64_t i = shape.size() - 2; i >= 0; i--) {285+ std::vector<int64_t> strides(shape.size(), 1);
280- strides[i] = shape[i + 1] * strides[i + 1];286+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
281- }287+ strides[i] = shape[i + 1] * strides[i + 1];
288+ }
282 289 
283- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,290+ // 调用aclCreateTensor接口创建aclTensor
284- shape.data(), shape.size(), *deviceAddr);291+ *tensor = aclCreateTensor(
285- return 0;292+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
293+ *deviceAddr);
294+ return 0;
286}295}
287 296 
288-int main() {297+int main()
289- int32_t deviceId = 0;298+{
290- aclrtStream stream;299+ // device/stream初始化,参考acl API手册
291- auto ret = Init(deviceId, &stream);300+ int32_t deviceId = 0;
292- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);301+ aclrtStream stream;
302+ auto ret = Init(deviceId, &stream);
303+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
293 304 
294- std::vector<int64_t> selfShape = {8};305+ std::vector<int64_t> selfShape = {8};
295- std::vector<int64_t> maxOutShape = {1};306+ std::vector<int64_t> maxOutShape = {1};
296 307 
297- void* selfDeviceAddr = nullptr;308+ void* selfDeviceAddr = nullptr;
298- void* maxOutDeviceAddr = nullptr;309+ aclTensor* self = nullptr;
299- aclTensor* self = nullptr;
300- aclTensor* maxOut = nullptr;
301- std::vector<int32_t> selfHostData = {8, 1, 2, 3, 4, 5, 6, 7};
302- std::vector<int32_t> maxOutHostData(1, 0);
303- ret = CreateAclTensor(selfHostData, selfShape, &selfDeviceAddr, aclDataType::ACL_INT32, &self);
304- CHECK_RET(ret == ACL_SUCCESS, return ret);
305- ret = CreateAclTensor(maxOutHostData, maxOutShape, &maxOutDeviceAddr, aclDataType::ACL_INT32, &maxOut);
306- CHECK_RET(ret == ACL_SUCCESS, return ret);
307 310 
308- uint64_t workspaceSizeMax = 0;311+ std::vector<int32_t> selfHostData = {8, 1, 2, 3, 4, 5, 6, 7};
309- aclOpExecutor* executorMax;
310- ret = aclnnMaxGetWorkspaceSize(self, maxOut, &workspaceSizeMax, &executorMax);
311- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnMaxGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
312- void* workspaceAddrMax = nullptr;
313- if (workspaceSizeMax > 0) {
314- ret = aclrtMalloc(&workspaceAddrMax, workspaceSizeMax, ACL_MEM_MALLOC_HUGE_FIRST);
315- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
316- }
317- ret = aclnnMax(workspaceAddrMax, workspaceSizeMax, executorMax, stream);
318- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnMax failed. ERROR: %d\n", ret); return ret);
319 312 
320- ret = aclrtSynchronizeStream(stream);313+ // 创建self aclTensor
321- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);314+ ret = CreateAclTensor(selfHostData, selfShape, &selfDeviceAddr, aclDataType::ACL_INT32, &self);
315+ CHECK_RET(ret == ACL_SUCCESS, return ret);
322 316 
323- std::vector<int32_t> resultData(1, 0);317+ // 调用bincount,示例固定outSize=9
324- ret = aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), maxOutDeviceAddr,318+ int64_t minlength = 0;
325- sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST);319+ int64_t outSize = 9;
326- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);320+ std::vector<int64_t> weightsShape = {8};
327- aclDestroyTensor(maxOut);321+ std::vector<int64_t> outShape = {outSize};
328 322 
329- int64_t minlength = 0;323+ void* weightsDeviceAddr = nullptr;
330- int64_t outSize = (resultData[0] < minlength) ? minlength : resultData[0] + 1;324+ void* outDeviceAddr = nullptr;
331- std::vector<int64_t> weightsShape = {8};325+ aclTensor* weights = nullptr;
332- std::vector<int64_t> outShape = {outSize};326+ aclTensor* out = nullptr;
327+ std::vector<float> weightsHostData = {1, 1, 1.1, 2, 2, 2, 3, 3};
328+ std::vector<float> outHostData(outSize, 0);
329+ // 创建weights aclTensor
330+ ret = CreateAclTensor(weightsHostData, weightsShape, &weightsDeviceAddr, aclDataType::ACL_FLOAT, &weights);
331+ CHECK_RET(ret == ACL_SUCCESS, return ret);
332+ // 创建out aclTensor
333+ ret = CreateAclTensor(outHostData, outShape, &outDeviceAddr, aclDataType::ACL_FLOAT, &out);
334+ CHECK_RET(ret == ACL_SUCCESS, return ret);
333 335 
334- void* weightsDeviceAddr = nullptr;336+ // 调用CANN算子库API
335- void* outDeviceAddr = nullptr;337+ uint64_t workspaceSize = 0;
336- aclTensor* weights = nullptr;338+ aclOpExecutor* executor;
337- aclTensor* out = nullptr;339+ // 调用aclnnBincount第一段接口
338- std::vector<float> weightsHostData = {1, 1, 1.1, 2, 2, 2, 3, 3};340+ ret = aclnnBincountGetWorkspaceSize(self, weights, minlength, out, &workspaceSize, &executor);
339- std::vector<float> outHostData(outSize, 0);341+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnBincountGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
340- ret = CreateAclTensor(weightsHostData, weightsShape, &weightsDeviceAddr, aclDataType::ACL_FLOAT, &weights);342+ // 根据第一段接口计算出的workspaceSize申请device内存
341- CHECK_RET(ret == ACL_SUCCESS, return ret);343+ void* workspaceAddr = nullptr;
342- ret = CreateAclTensor(outHostData, outShape, &outDeviceAddr, aclDataType::ACL_FLOAT, &out);344+ if (workspaceSize > 0) {
343- CHECK_RET(ret == ACL_SUCCESS, return ret);345+ ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
346+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
347+ }
348+ // 调用aclnnBincount第二段接口
349+ ret = aclnnBincount(workspaceAddr, workspaceSize, executor, stream);
350+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnBincount failed. ERROR: %d\n", ret); return ret);
344 351 
345- uint64_t workspaceSize = 0;352+ // 同步等待任务执行结束
346- aclOpExecutor* executor;353+ ret = aclrtSynchronizeStream(stream);
347- ret = aclnnBincountGetWorkspaceSize(self, weights, minlength, out, &workspaceSize, &executor);354+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
348- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnBincountGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
349- void* workspaceAddr = nullptr;
350- if (workspaceSize > 0) {
351- ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
352- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
353- }
354- ret = aclnnBincount(workspaceAddr, workspaceSize, executor, stream);
355- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnBincount failed. ERROR: %d\n", ret); return ret);
356 355 
357- ret = aclrtSynchronizeStream(stream);356+ // 获取输出的值,将device侧内存上的结果拷贝至host侧
358- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);357+ auto size = GetShapeSize(outShape);
358+ std::vector<float> bincountResultData(size, 0);
359+ ret = aclrtMemcpy(
360+ bincountResultData.data(), bincountResultData.size() * sizeof(bincountResultData[0]), outDeviceAddr,
361+ size * sizeof(bincountResultData[0]), ACL_MEMCPY_DEVICE_TO_HOST);
362+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
363+ for (int64_t i = 0; i < size; i++) {
364+ LOG_PRINT("result[%ld] is: %f\n", i, bincountResultData[i]);
365+ }
366+ // 释放aclTensor
367+ aclDestroyTensor(self);
368+ aclDestroyTensor(weights);
369+ aclDestroyTensor(out);
359 370 
360- auto size = GetShapeSize(outShape);371+ // 释放资源
361- std::vector<float> bincountResultData(size, 0);372+ aclrtFree(selfDeviceAddr);
362- ret = aclrtMemcpy(bincountResultData.data(), bincountResultData.size() * sizeof(bincountResultData[0]), outDeviceAddr,373+ aclrtFree(outDeviceAddr);
363- size * sizeof(bincountResultData[0]), ACL_MEMCPY_DEVICE_TO_HOST);
364- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
365- for (int64_t i = 0; i < size; i++) {
366- LOG_PRINT("result[%ld] is: %f\n", i, bincountResultData[i]);
367- }
368 374 
369- aclDestroyTensor(self);375+ aclrtFree(weightsDeviceAddr);
370- aclDestroyTensor(weights);376+ if (workspaceSize > 0) {
371- aclDestroyTensor(out);377+ aclrtFree(workspaceAddr);
378+ }
372 379 
373- aclrtFree(selfDeviceAddr);380+ aclrtDestroyStream(stream);
374- aclrtFree(outDeviceAddr);381+ aclrtResetDevice(deviceId);
375- if (workspaceSizeMax > 0) {382+ aclFinalize();
376- aclrtFree(workspaceAddrMax);
377- }
378 383 
379- aclrtFree(weightsDeviceAddr);384+ return 0;
380- aclrtFree(maxOutDeviceAddr);
381- if (workspaceSize > 0) {
382- aclrtFree(workspaceAddr);
383- }
384- 
385- aclrtDestroyStream(stream);
386- aclrtResetDevice(deviceId);
387- aclFinalize();
388- 
389- return 0;
390}385}
391```386```
@@ -355,4 +355,4 @@ int main() {
355 aclFinalize();355 aclFinalize();
356 return 0;356 return 0;
357}357}
358-```358+```
@@ -169,7 +169,7 @@ aclnnStatus aclnnLinalgCholesky(
169 </tbody>169 </tbody>
170 </table>170 </table>
171 171 
172-## aclnnLinagCholesky172+## aclnnLinalgCholesky
173 173 
174- **参数说明:**174- **参数说明:**
175 175 
@@ -193,7 +193,7 @@ aclnnStatus aclnnLinalgCholesky(
193 <tr>193 <tr>
194 <td>workspaceSize</td>194 <td>workspaceSize</td>
195 <td>输入</td>195 <td>输入</td>
196- <td>在Device侧申请的workspace大小,由第一段接口aclnnLinagCholeskyGetWorkspaceSize获取。</td>196+ <td>在Device侧申请的workspace大小,由第一段接口aclnnLinalgCholeskyGetWorkspaceSize获取。</td>
197 </tr>197 </tr>
198 <tr>198 <tr>
199 <td>executor</td>199 <td>executor</td>
@@ -591,7 +591,7 @@ int main()
591 // 3.调用CANN算子库API591 // 3.调用CANN算子库API
592 // 调用aclnnInplaceCumprod第一段接口592 // 调用aclnnInplaceCumprod第一段接口
593 ret = aclnnInplaceCumprodGetWorkspaceSize(input, axis, &workspaceSize, &executor);593 ret = aclnnInplaceCumprodGetWorkspaceSize(input, axis, &workspaceSize, &executor);
594- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnCumprodGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);594+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnInplaceCumprodGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
595 595 
596 // 根据第一段接口计算出的workspaceSize申请device内存596 // 根据第一段接口计算出的workspaceSize申请device内存
597 if (workspaceSize > 0)597 if (workspaceSize > 0)
@@ -45,7 +45,7 @@ aclnnStatus aclnnEqScalar(
45 void* workspace, 45 void* workspace,
46 uint64_t workspaceSize, 46 uint64_t workspaceSize,
47 aclOpExecutor* executor, 47 aclOpExecutor* executor,
48- const aclrtStream stream)48+ aclrtStream stream)
49```49```
50 50 
51```Cpp51```Cpp
@@ -15,7 +15,7 @@
15 15 
16## 功能说明16## 功能说明
17 17 
18-- 接口功能:计算两个Tensor中的元素是否相等,返回一个Tensor,self=other的为True(1.),否则为False(0.)。18+- 接口功能:计算两个Tensor中的元素是否相等,返回一个Tensor,self=other时为True(1.),否则为False(0.)。
19- 计算表达式:19- 计算表达式:
20 20 
21 $$21 $$
@@ -29,7 +29,7 @@
29 - aclnnEqTensor:需新建一个输出张量对象存储计算结果。29 - aclnnEqTensor:需新建一个输出张量对象存储计算结果。
30 - aclnnInplaceEqTensor:无需新建输出张量对象,直接在输入张量的内存中存储计算结果。30 - aclnnInplaceEqTensor:无需新建输出张量对象,直接在输入张量的内存中存储计算结果。
31 31 
32-- 每个算子分为[两段式接口](../../../docs/zh/context/两段式接口.md),必须先调用“aclnnEqTensorGetWorkspaceSize”或者“aclnnInplaceEqTensorGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnEqTensor”或者“aclnnInplaceEqTensor”接口执行计算aclnnEqTensor。32+- 每个算子分为[两段式接口](../../../docs/zh/context/两段式接口.md),必须先调用“aclnnEqTensorGetWorkspaceSize”或者“aclnnInplaceEqTensorGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnEqTensor”或者“aclnnInplaceEqTensor”接口执行计算。
33 33 
34```Cpp34```Cpp
35aclnnStatus aclnnEqTensorGetWorkspaceSize(35aclnnStatus aclnnEqTensorGetWorkspaceSize(
@@ -370,7 +370,7 @@ int main() {
370 ret = CreateAclTensor(outHostData, outShape, &outDeviceAddr, aclDataType::ACL_INT64, &out);370 ret = CreateAclTensor(outHostData, outShape, &outDeviceAddr, aclDataType::ACL_INT64, &out);
371 CHECK_RET(ret == ACL_SUCCESS, return ret);371 CHECK_RET(ret == ACL_SUCCESS, return ret);
372 372 
373- // 3. 调用CANN算子库API,需要修改为具体的Api名称373+ // 3. 调用CANN算子库API,需要修改为具体的API名称
374 uint64_t workspaceSize = 0;374 uint64_t workspaceSize = 0;
375 aclOpExecutor* executor;375 aclOpExecutor* executor;
376 // 调用aclnnRemainderTensorTensor第一段接口376 // 调用aclnnRemainderTensorTensor第一段接口
@@ -507,7 +507,7 @@ int main() {
507 ret = CreateAclTensor(otherHostData, otherShape, &otherDeviceAddr, aclDataType::ACL_INT64, &other);507 ret = CreateAclTensor(otherHostData, otherShape, &otherDeviceAddr, aclDataType::ACL_INT64, &other);
508 CHECK_RET(ret == ACL_SUCCESS, return ret);508 CHECK_RET(ret == ACL_SUCCESS, return ret);
509 509 
510- // 3. 调用CANN算子库API,需要修改为具体的Api名称510+ // 3. 调用CANN算子库API,需要修改为具体的API名称
511 uint64_t workspaceSize = 0;511 uint64_t workspaceSize = 0;
512 aclOpExecutor* executor;512 aclOpExecutor* executor;
513 // 调用aclnnInplaceRemainderTensorTensor第一段接口513 // 调用aclnnInplaceRemainderTensorTensor第一段接口
@@ -228,7 +228,7 @@ aclnnStatus aclnnInplaceGeTensor(
228 228 
229 aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。229 aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
230 230 
231-## aclnnInplaceGtTensorGetWorkspaceSize231+## aclnnInplaceGeTensorGetWorkspaceSize
232 232 
233- **参数说明:**233- **参数说明:**
234 234 
@@ -13,7 +13,7 @@
13 13 
14## 功能说明14## 功能说明
15 15 
16-对输入的压缩后的Tensor基于pdf进行解码,同时于mantissa重组回复原本张量。16+对输入的压缩后的Tensor基于pdf进行解码,同时于mantissa重组恢复原本张量。
17 17 
18## 函数原型18## 函数原型
19 19 
@@ -15,7 +15,7 @@
15 15 
16## 功能说明16## 功能说明
17 17 
18-- 接口功能:生成一个等间隔数值序列。创建一个大小为steps的1维向量,其值从start起始到end结束(包含)线性均匀分布。18+- 接口功能:生成一个等间隔数值序列。创建一个大小为steps的一维向量,其值从start起始到end结束(包含)线性均匀分布。
19 19 
20- 计算公式:20- 计算公式:
21 21 
@@ -98,7 +98,7 @@ aclnnStatus aclnnLinspace(
98 <tr>98 <tr>
99 <td>steps(int64_t)</td>99 <td>steps(int64_t)</td>
100 <td>输入</td>100 <td>输入</td>
101- <td>获取值的步长。</td>101+ <td>生成元素的个数。</td>
102 <td>需要满足steps大于等于0。</td>102 <td>需要满足steps大于等于0。</td>
103 <td>-</td>103 <td>-</td>
104 <td>-</td>104 <td>-</td>
@@ -617,7 +617,7 @@ int main() {
617 size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST);617 size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST);
618 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);618 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
619 for (int64_t i = 0; i < size; i++) {619 for (int64_t i = 0; i < size; i++) {
620- LOG_PRINT("%ld acos(%f) = %f\n", i, selfHostData[i], resultData[i]);620+ LOG_PRINT("%ld log10(%f) = %f\n", i, selfHostData[i], resultData[i]);
621 }621 }
622 622 
623 // 6. 释放aclTensor和aclScalar,需要根据具体API的接口定义修改623 // 6. 释放aclTensor和aclScalar,需要根据具体API的接口定义修改
@@ -207,7 +207,7 @@ aclnnStatus aclnnInplaceMuls(
207 <tr>207 <tr>
208 <td>workspaceSize</td>208 <td>workspaceSize</td>
209 <td>输入</td>209 <td>输入</td>
210- <td>在Device侧申请的workspace大小,由第一段接口aclnnMinimumGetWorkspaceSize获取。</td>210+ <td>在Device侧申请的workspace大小,由第一段接口aclnnMulsGetWorkspaceSize获取。</td>
211 </tr>211 </tr>
212 <tr>212 <tr>
213 <td>executor</td>213 <td>executor</td>
@@ -356,7 +356,7 @@ aclnnStatus aclnnInplaceMuls(
356 <tr>356 <tr>
357 <td>workspaceSize</td>357 <td>workspaceSize</td>
358 <td>输入</td>358 <td>输入</td>
359- <td>在Device侧申请的workspace大小,由第一段接口aclnnMinimumGetWorkspaceSize获取。</td>359+ <td>在Device侧申请的workspace大小,由第一段接口aclnnInplaceMulsGetWorkspaceSize获取。</td>
360 </tr>360 </tr>
361 <tr>361 <tr>
362 <td>executor</td>362 <td>executor</td>
@@ -192,7 +192,7 @@ aclnnStatus aclnnInplaceNeScalar(
192 </tbody>192 </tbody>
193 </table>193 </table>
194 194 
195-## aclnnNeScalar195+## aclnnInplaceNeScalar
196 196 
197* **参数说明**:197* **参数说明**:
198 198 
@@ -69,7 +69,7 @@ const aclrtStream stream)
69 <tr>69 <tr>
70 <td>self</td>70 <td>self</td>
71 <td>输入</td>71 <td>输入</td>
72- <td>输入tenor。</td>72+ <td>输入tensor。</td>
73 <td>-</td>73 <td>-</td>
74 <td>BOOL、UINT8、INT8、INT16、INT32、INT64、FLOAT、FLOAT16、BFLOAT16、DOUBLE</td>74 <td>BOOL、UINT8、INT8、INT16、INT32、INT64、FLOAT、FLOAT16、BFLOAT16、DOUBLE</td>
75 <td>ND</td>75 <td>ND</td>
@@ -88,7 +88,7 @@ aclnnStatus aclnnAny(
88 <td>-</td>88 <td>-</td>
89 </tr>89 </tr>
90 <tr>90 <tr>
91- <td>keepDim</td>91+ <td>keepdim</td>
92 <td>输入</td>92 <td>输入</td>
93 <td>reduce轴的维度是否保留。</td>93 <td>reduce轴的维度是否保留。</td>
94 <td>-</td>94 <td>-</td>
@@ -254,7 +254,7 @@ aclnnStatus aclnnSilentCheckV2(
254 <tr>254 <tr>
255 <td>ACLNN_ERR_PARAM_NULLPTR</td>255 <td>ACLNN_ERR_PARAM_NULLPTR</td>
256 <td>161001</td>256 <td>161001</td>
257- <td>传入的传入的val, max, avgRef, inputGradRef, stepRef, dstSize, dstStride, dstOffset是空指针。</td>257+ <td>传入的val, max, avgRef, inputGradRef, stepRef, dstSize, dstStride, dstOffset是空指针。</td>
258 </tr>258 </tr>
259 <tr>259 <tr>
260 <td rowspan="3">ACLNN_ERR_PARAM_INVALID</td>260 <td rowspan="3">ACLNN_ERR_PARAM_INVALID</td>
@@ -72,7 +72,7 @@
72 <ul>72 <ul>
73 <li>表示最优传输张量,公式中的<code>p</code>,Device侧的aclTensor。</li>73 <li>表示最优传输张量,公式中的<code>p</code>,Device侧的aclTensor。</li>
74 <li>如果传入空指针,则tol取0.0001。</li>74 <li>如果传入空指针,则tol取0.0001。</li>
75- <li>shape维度为2,不支持<a href="../../../docs/zh/context/非连续的Tensor.md">非连续的Tensor</a>。</li>75+ <li>shape维度为2,不支持<a href="../../docs/zh/context/非连续的Tensor.md">非连续的Tensor</a>。</li>
76 <li>数据类型和shape与入参<code>cost</code>的数据类型和shape一致。</li>76 <li>数据类型和shape与入参<code>cost</code>的数据类型和shape一致。</li>
77 </ul>77 </ul>
78 </td>78 </td>
@@ -15,13 +15,13 @@
15 15 
16## 功能说明16## 功能说明
17 17 
18-- 算子功能:完成非负数平方根计算,负数情况返回nan。18+- 算子功能:完成非负数平方根计算,负数情况返回NaN。
19- 计算公式:19- 计算公式:
20 20 
21$$21$$
22out=sqrt(self)=\begin{cases}22out=sqrt(self)=\begin{cases}
23\sqrt {self}, & self\ge 0 , \\23\sqrt {self}, & self\ge 0 , \\
24-nan, & self\lt 024+NaN, & self\lt 0
25\end{cases}25\end{cases}
26$$26$$
27 27 
@@ -48,7 +48,7 @@
48 <td>self</td>48 <td>self</td>
49 <td>输入</td>49 <td>输入</td>
50 <td>表示第一个输入。</td>50 <td>表示第一个输入。</td>
51- <td>self与other的数据类型满足数据类型推导规则(参见<a href="../../../docs/zh/context/互推导关系.md" target="_blank">互推导关系</a>)。</td>51+ <td>self与other的数据类型满足数据类型推导规则(参见<a href="../../docs/zh/context/互推导关系.md" target="_blank">互推导关系</a>)。</td>
52 <td>FLOAT16、FLOAT、INT32、INT8、UINT8、BOOL、DOUBLE、INT64、INT16、UINT16、UINT32、UINT64、BFLOAT16</td>52 <td>FLOAT16、FLOAT、INT32、INT8、UINT8、BOOL、DOUBLE、INT64、INT16、UINT16、UINT32、UINT64、BFLOAT16</td>
53 <td>ND</td>53 <td>ND</td>
54 <td>-</td>54 <td>-</td>
@@ -58,7 +58,7 @@
58 <td>other</td>58 <td>other</td>
59 <td>输入</td>59 <td>输入</td>
60 <td>表示第二个输入。</td>60 <td>表示第二个输入。</td>
61- <td>other与self的数据类型满足数据类型推导规则(参见<a href="../../../docs/zh/context/互推导关系.md" target="_blank">互推导关系</a>)。</td>61+ <td>other与self的数据类型满足数据类型推导规则(参见<a href="../../docs/zh/context/互推导关系.md" target="_blank">互推导关系</a>)。</td>
62 <td>FLOAT16、FLOAT、INT32、INT8、UINT8、BOOL、DOUBLE、INT64、INT16、UINT16、UINT32、UINT64、BFLOAT16</td>62 <td>FLOAT16、FLOAT、INT32、INT8、UINT8、BOOL、DOUBLE、INT64、INT16、UINT16、UINT32、UINT64、BFLOAT16</td>
63 <td>ND</td>63 <td>ND</td>
64 <td>-</td>64 <td>-</td>
@@ -293,7 +293,7 @@ int main() {
293 aclOpExecutor* executor;293 aclOpExecutor* executor;
294 // 调用aclnnTrace第一段接口294 // 调用aclnnTrace第一段接口
295 ret = aclnnTraceGetWorkspaceSize(self, out, &workspaceSize, &executor);295 ret = aclnnTraceGetWorkspaceSize(self, out, &workspaceSize, &executor);
296- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnntraceGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);296+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnTraceGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
297 // 根据第一段接口计算出的workspaceSize申请device内存297 // 根据第一段接口计算出的workspaceSize申请device内存
298 void* workspaceAddr = nullptr;298 void* workspaceAddr = nullptr;
299 if (workspaceSize > 0) {299 if (workspaceSize > 0) {
@@ -302,7 +302,7 @@ int main() {
302 }302 }
303 // 调用aclnnTrace第二段接口303 // 调用aclnnTrace第二段接口
304 ret = aclnnTrace(workspaceAddr, workspaceSize, executor, stream);304 ret = aclnnTrace(workspaceAddr, workspaceSize, executor, stream);
305- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnntrace failed. ERROR: %d\n", ret); return ret);305+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnTrace failed. ERROR: %d\n", ret); return ret);
306 // 4. (固定写法)同步等待任务执行结束306 // 4. (固定写法)同步等待任务执行结束
307 ret = aclrtSynchronizeStream(stream);307 ret = aclrtSynchronizeStream(stream);
308 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);308 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);