已合并
math仓资料扫描整改 #1996
sunchun创建于 3月30日
math仓资料扫描整改 #1996
已合并
从已删除 :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 | ```cpp | 49 | ```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 | ## aclnnAcosGetWorkspaceSize | 64 | ## 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 | ||
| 269 | template <typename T> | 271 | template <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 | -## aclnnLinagCholesky | 172 | +## 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算子库API | 591 | // 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 | ```Cpp | 51 | ```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 | ```Cpp | 34 | ```Cpp |
| 35 | aclnnStatus aclnnEqTensorGetWorkspaceSize( | 35 | aclnnStatus 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 | -## aclnnInplaceGtTensorGetWorkspaceSize | 231 | +## 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 | -## aclnnNeScalar | 195 | +## 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 | $$ |
| 22 | out=sqrt(self)=\begin{cases} | 22 | out=sqrt(self)=\begin{cases} |
| 23 | \sqrt {self}, & self\ge 0 , \\ | 23 | \sqrt {self}, & self\ge 0 , \\ |
| 24 | -nan, & self\lt 0 | 24 | +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); |