已合并
update error msg process #982
胡碧霞创建于 1月24日
update error msg process #982
已合并
共 5 个文件变更+74-22
| @@ -1,6 +1,7 @@ | |||
| 1 | # aclnn返回码 | 1 | # aclnn返回码 |
| 2 | 2 | ||
| 3 | 调用aclnn API时,常见的接口返回码如[表1](#zh-cn_topic_0000001563019104_table8155243135018)所示。 | 3 | 调用aclnn API时,常见的接口返回码如[表1](#zh-cn_topic_0000001563019104_table8155243135018)所示。 |
| 4 | +对于异常状态码值,可以通过aclGetRecentErrMsg接口(参见[《acl API(C)》](https://hiascend.com/document/redirect/CannCommunityCppApi))获取异常信息,您可以根据报错提示排查问题或者联系技术支持。 | ||
| 4 | 5 | ||
| 5 | **表 1** 返回状态码 | 6 | **表 1** 返回状态码 |
| 6 | 7 | ||
| @@ -32,7 +33,6 @@ | |||
| 32 | <td class="cellrowborder" valign="top" width="15.971597159715973%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0000001563019104_p915619437501"><a name="zh-cn_topic_0000001563019104_p915619437501"></a><a name="zh-cn_topic_0000001563019104_p915619437501"></a>161002</p> | 33 | <td class="cellrowborder" valign="top" width="15.971597159715973%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0000001563019104_p915619437501"><a name="zh-cn_topic_0000001563019104_p915619437501"></a><a name="zh-cn_topic_0000001563019104_p915619437501"></a>161002</p> |
| 33 | </td> | 34 | </td> |
| 34 | <td class="cellrowborder" valign="top" width="53.48534853485349%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0000001563019104_p17570123425314"><a name="zh-cn_topic_0000001563019104_p17570123425314"></a><a name="zh-cn_topic_0000001563019104_p17570123425314"></a>参数校验错误,如输入的两个数据类型不满足输入类型推导关系。</p> | 35 | <td class="cellrowborder" valign="top" width="53.48534853485349%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0000001563019104_p17570123425314"><a name="zh-cn_topic_0000001563019104_p17570123425314"></a><a name="zh-cn_topic_0000001563019104_p17570123425314"></a>参数校验错误,如输入的两个数据类型不满足输入类型推导关系。</p> |
| 35 | -<p id="zh-cn_topic_0000001563019104_p215619437502"><a name="zh-cn_topic_0000001563019104_p215619437502"></a><a name="zh-cn_topic_0000001563019104_p215619437502"></a>详细的错误消息,可以通过aclGetRecentErrMsg接口获取。</p> | ||
| 36 | </td> | 36 | </td> |
| 37 | </tr> | 37 | </tr> |
| 38 | <tr id="zh-cn_topic_0000001563019104_row1215674375018"><td class="cellrowborder" valign="top" width="30.543054305430545%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0000001563019104_p11156174305019"><a name="zh-cn_topic_0000001563019104_p11156174305019"></a><a name="zh-cn_topic_0000001563019104_p11156174305019"></a>ACLNN_ERR_RUNTIME_ERROR</p> | 38 | <tr id="zh-cn_topic_0000001563019104_row1215674375018"><td class="cellrowborder" valign="top" width="30.543054305430545%" headers="mcps1.2.4.1.1 "><p id="zh-cn_topic_0000001563019104_p11156174305019"><a name="zh-cn_topic_0000001563019104_p11156174305019"></a><a name="zh-cn_topic_0000001563019104_p11156174305019"></a>ACLNN_ERR_RUNTIME_ERROR</p> |
| @@ -46,7 +46,7 @@ | |||
| 46 | </td> | 46 | </td> |
| 47 | <td class="cellrowborder" valign="top" width="15.971597159715973%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0000001563019104_p14156144313508"><a name="zh-cn_topic_0000001563019104_p14156144313508"></a><a name="zh-cn_topic_0000001563019104_p14156144313508"></a>561xxx</p> | 47 | <td class="cellrowborder" valign="top" width="15.971597159715973%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0000001563019104_p14156144313508"><a name="zh-cn_topic_0000001563019104_p14156144313508"></a><a name="zh-cn_topic_0000001563019104_p14156144313508"></a>561xxx</p> |
| 48 | </td> | 48 | </td> |
| 49 | -<td class="cellrowborder" valign="top" width="53.48534853485349%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0000001563019104_p10850181263218"><a name="zh-cn_topic_0000001563019104_p10850181263218"></a><a name="zh-cn_topic_0000001563019104_p10850181263218"></a>API内部发生内部异常,详细的错误信息,可以通过aclGetRecentErrMsg接口获取。您可以根据报错提示排查问题或者联系技术支持。</p> | 49 | +<td class="cellrowborder" valign="top" width="53.48534853485349%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0000001563019104_p10850181263218"><a name="zh-cn_topic_0000001563019104_p10850181263218"></a><a name="zh-cn_topic_0000001563019104_p10850181263218"></a>API内部发生内部异常。</p> |
| 50 | 50 | ||
| 51 | </td> | 51 | </td> |
| 52 | </tr> | 52 | </tr> |
| @@ -118,3 +118,15 @@ | |||
| 118 | result[6] is: 9.600000 | 118 | result[6] is: 9.600000 |
| 119 | result[7] is: 10.600000 | 119 | result[7] is: 10.600000 |
| 120 | ``` | 120 | ``` |
| 121 | + 若执行结果报错,未出现预期结果,可以使用aclGetRecentErrMsg接口获取报错具体信息。 | ||
| 122 | + 调用aclnnAddmmGetWorkspaceSize报错获取异常信息示例如下: | ||
| 123 | + ``` | ||
C | |||
| 124 | + // self is nullptr | ||
| 125 | + ret = aclnnAddmmGetWorkspaceSize(self, mat1, mat2, beta, alpha, out, cubeMathType, &workspaceSize, &executor); | ||
| 126 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnAddmmGetWorkspaceSize failed. ERROR: %d\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); | ||
| 127 | + ``` | ||
| 128 | + 上述构造空指针问题获取报错信息示例如下: | ||
| 129 | + ``` | ||
| 130 | + aclnnAddmmGetWorkspaceSize failed. ERROR: 161001 | ||
| 131 | + [ERROR msg][PID:xxxx] xxx(timesamp) AclNN_Parameter_Error(EZ1001): Expected a proper Tensor but got null for argument addmmTennsor.self. | ||
| 132 | + ``` | ||
| @@ -6,6 +6,40 @@ | |||
| 6 | 6 | ||
| 7 | 算子运行过程中,如果出现算子执行失败、精度异常等问题,可以打印各阶段信息,如Kernel中间结果,进行问题分析和定位。 | 7 | 算子运行过程中,如果出现算子执行失败、精度异常等问题,可以打印各阶段信息,如Kernel中间结果,进行问题分析和定位。 |
| 8 | 8 | ||
| 9 | +### 1、Host侧日志获取方式 | ||
| 10 | + | ||
| 11 | +* **plog获取** | ||
| 12 | + | ||
| 13 | + 程序执行结束后,默认可在"$HOME/ascendc/log"下查看,host日志文件存储路径如下: | ||
| 14 | + | ||
| 15 | + ``` | ||
| 16 | + $HOME/ascend/log/debug/plog/plog-pid_*.log | ||
| 17 | + ``` | ||
| 18 | + | ||
| 19 | + 开启环境变量ASCEND_SLOG_PRINT_TO_STDOUT可以将log日志直接打屏显示(1:开启打屏,0:关闭打屏),配置示例如下: | ||
| 20 | + | ||
| 21 | + ``` | ||
| 22 | + export ASCEND_SLOG_PRINT_TO_STDOUT=1 | ||
W 建议补充下怎么关闭,以及不同的日志级别 ![]() ![]() | |||
| 23 | + ``` | ||
| 24 | + | ||
| 25 | + 日志相关介绍参见[《日志参考》](https://hiascend.com/document/redirect/CannCommunitylogref),环境变量介绍参见[《环境变量参考》](https://hiascend.com/document/redirect/CannCommunityEnvRef)。 | ||
| 26 | + | ||
| 27 | +* **aclnn异常错误信息获取** | ||
| 28 | + | ||
| 29 | + 通过aclGetRecentErrMsg接口(参见[《acl API(C)》](https://hiascend.com/document/redirect/CannCommunityCppApi))获取aclnn接口调用过程中的异常信息,使用方法如下: | ||
| 30 | + | ||
| 31 | + ``` | ||
| 32 | + printf(aclGetRecentErrMsg()); | ||
| 33 | + ``` | ||
| 34 | + | ||
| 35 | + 打印错误信息样例如下: | ||
| 36 | + | ||
| 37 | + ``` | ||
| 38 | + [PID:646612] 2026-01-24-11:53:44.671.727 AclNN_Parameter_Error(EZ1001): Expected a proper Tensor but got null for argument addmmTennsor.self. | ||
| 39 | + ``` | ||
| 40 | + | ||
| 41 | +### 2、Kernel调试 | ||
| 42 | + | ||
| 9 | 常见调试方法如下: | 43 | 常见调试方法如下: |
| 10 | 44 | ||
| 11 | * **printf** | 45 | * **printf** |
| @@ -36,6 +70,12 @@ | |||
| 36 | 70 | ||
| 37 | 算子运行过程中,如果出现算子执行失败、精度异常等问题,可以打印各阶段信息,如Kernel中间结果,进行问题分析和定位。 | 71 | 算子运行过程中,如果出现算子执行失败、精度异常等问题,可以打印各阶段信息,如Kernel中间结果,进行问题分析和定位。 |
| 38 | 72 | ||
| 73 | +### 1、Host侧日志获取方式 | ||
| 74 | + | ||
| 75 | + 见AI Core算子[Host侧日志获取方式](#1host侧日志获取方式) | ||
| 76 | + | ||
| 77 | +### 2、Kernel调试 | ||
| 78 | + | ||
| 39 | 常见调试方法如下: | 79 | 常见调试方法如下: |
| 40 | 80 | ||
| 41 | * **KERNEL\_LOG宏** | 81 | * **KERNEL\_LOG宏** |
| @@ -602,27 +602,27 @@ int main() { | |||
| 602 | 602 | ||
| 603 | // 调用aclnnAddmm第一段接口 | 603 | // 调用aclnnAddmm第一段接口 |
| 604 | ret = aclnnAddmmGetWorkspaceSize(self, mat1, mat2, beta, alpha, out, cubeMathType, &workspaceSize, &executor); | 604 | ret = aclnnAddmmGetWorkspaceSize(self, mat1, mat2, beta, alpha, out, cubeMathType, &workspaceSize, &executor); |
| 605 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnAddmmGetWorkspaceSize failed. ERROR: %d\n", ret); return ret); | 605 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnAddmmGetWorkspaceSize failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 606 | // 根据第一段接口计算出的workspaceSize申请device内存 | 606 | // 根据第一段接口计算出的workspaceSize申请device内存 |
| 607 | void* workspaceAddr = nullptr; | 607 | void* workspaceAddr = nullptr; |
| 608 | if (workspaceSize > 0) { | 608 | if (workspaceSize > 0) { |
| 609 | ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); | 609 | ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); |
| 610 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret); | 610 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 611 | } | 611 | } |
| 612 | // 调用aclnnAddmm第二段接口 | 612 | // 调用aclnnAddmm第二段接口 |
| 613 | ret = aclnnAddmm(workspaceAddr, workspaceSize, executor, stream); | 613 | ret = aclnnAddmm(workspaceAddr, workspaceSize, executor, stream); |
| 614 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnAddmm failed. ERROR: %d\n", ret); return ret); | 614 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnAddmm failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 615 | 615 | ||
| 616 | // 4. (固定写法)同步等待任务执行结束 | 616 | // 4. (固定写法)同步等待任务执行结束 |
| 617 | ret = aclrtSynchronizeStream(stream); | 617 | ret = aclrtSynchronizeStream(stream); |
| 618 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret); | 618 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 619 | 619 | ||
| 620 | // 5. 获取输出的值,将device侧内存上的结果拷贝至host侧,需要根据具体API的接口定义修改 | 620 | // 5. 获取输出的值,将device侧内存上的结果拷贝至host侧,需要根据具体API的接口定义修改 |
| 621 | auto size = GetShapeSize(outShape); | 621 | auto size = GetShapeSize(outShape); |
| 622 | std::vector<float> resultData(size, 0); | 622 | std::vector<float> resultData(size, 0); |
| 623 | ret = aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), outDeviceAddr, | 623 | ret = aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), outDeviceAddr, |
| 624 | size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); | 624 | size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); |
| 625 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret); | 625 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 626 | for (int64_t i = 0; i < size; i++) { | 626 | for (int64_t i = 0; i < size; i++) { |
| 627 | LOG_PRINT("result[%ld] is: %f\n", i, resultData[i]); | 627 | LOG_PRINT("result[%ld] is: %f\n", i, resultData[i]); |
| 628 | } | 628 | } |
| @@ -632,24 +632,24 @@ int main() { | |||
| 632 | LOG_PRINT("\ntest aclnnInplaceAddmm\n"); | 632 | LOG_PRINT("\ntest aclnnInplaceAddmm\n"); |
| 633 | // 调用aclnnInplaceAddmm第一段接口 | 633 | // 调用aclnnInplaceAddmm第一段接口 |
| 634 | ret = aclnnInplaceAddmmGetWorkspaceSize(self, mat1, mat2, beta, alpha, cubeMathType, &workspaceSize, &executor); | 634 | ret = aclnnInplaceAddmmGetWorkspaceSize(self, mat1, mat2, beta, alpha, cubeMathType, &workspaceSize, &executor); |
| 635 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnInplaceAddmmGetWorkspaceSize failed. ERROR: %d\n", ret); return ret); | 635 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnInplaceAddmmGetWorkspaceSize failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 636 | // 根据第一段接口计算出的workspaceSize申请device内存 | 636 | // 根据第一段接口计算出的workspaceSize申请device内存 |
| 637 | if (workspaceSize > 0) { | 637 | if (workspaceSize > 0) { |
| 638 | ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); | 638 | ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); |
| 639 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret); | 639 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 640 | } | 640 | } |
| 641 | // 调用aclnnInplaceAddmm第二段接口 | 641 | // 调用aclnnInplaceAddmm第二段接口 |
| 642 | ret = aclnnInplaceAddmm(workspaceAddr, workspaceSize, executor, stream); | 642 | ret = aclnnInplaceAddmm(workspaceAddr, workspaceSize, executor, stream); |
| 643 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnInplaceAddmm failed. ERROR: %d\n", ret); return ret); | 643 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnInplaceAddmm failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 644 | 644 | ||
| 645 | // step4(固定写法)同步等待任务执行结束 | 645 | // step4(固定写法)同步等待任务执行结束 |
| 646 | ret = aclrtSynchronizeStream(stream); | 646 | ret = aclrtSynchronizeStream(stream); |
| 647 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret); | 647 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 648 | 648 | ||
| 649 | // step5 获取输出的值,将device侧内存上的结果拷贝至host侧 | 649 | // step5 获取输出的值,将device侧内存上的结果拷贝至host侧 |
| 650 | ret = aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), selfDeviceAddr, | 650 | ret = aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), selfDeviceAddr, |
| 651 | size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); | 651 | size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); |
| 652 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret); | 652 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 653 | for (int64_t i = 0; i < size; i++) { | 653 | for (int64_t i = 0; i < size; i++) { |
| 654 | LOG_PRINT("result[%ld] is: %f\n", i, resultData[i]); | 654 | LOG_PRINT("result[%ld] is: %f\n", i, resultData[i]); |
| 655 | } | 655 | } |
| @@ -132,28 +132,28 @@ int main() { | |||
| 132 | 132 | ||
| 133 | // 调用aclnnAddmm第一段接口 | 133 | // 调用aclnnAddmm第一段接口 |
| 134 | ret = aclnnAddmmGetWorkspaceSize(self, mat1, mat2, beta, alpha, out, cubeMathType, &workspaceSize, &executor); | 134 | ret = aclnnAddmmGetWorkspaceSize(self, mat1, mat2, beta, alpha, out, cubeMathType, &workspaceSize, &executor); |
| 135 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnAddmmGetWorkspaceSize failed. ERROR: %d\n", ret); return ret); | 135 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnAddmmGetWorkspaceSize failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 136 | // 根据第一段接口计算出的workspaceSize申请device内存 | 136 | // 根据第一段接口计算出的workspaceSize申请device内存 |
| 137 | void* workspaceAddr = nullptr; | 137 | void* workspaceAddr = nullptr; |
| 138 | if (workspaceSize > 0) { | 138 | if (workspaceSize > 0) { |
| 139 | ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); | 139 | ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); |
| 140 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret); | 140 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 141 | executorAddrPtr.reset(workspaceAddr); | 141 | executorAddrPtr.reset(workspaceAddr); |
| 142 | } | 142 | } |
| 143 | // 调用aclnnAddmm第二段接口 | 143 | // 调用aclnnAddmm第二段接口 |
| 144 | ret = aclnnAddmm(workspaceAddr, workspaceSize, executor, stream); | 144 | ret = aclnnAddmm(workspaceAddr, workspaceSize, executor, stream); |
| 145 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnAddmm failed. ERROR: %d\n", ret); return ret); | 145 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnAddmm failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 146 | 146 | ||
| 147 | // 4. (固定写法)同步等待任务执行结束 | 147 | // 4. (固定写法)同步等待任务执行结束 |
| 148 | ret = aclrtSynchronizeStream(stream); | 148 | ret = aclrtSynchronizeStream(stream); |
| 149 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret); | 149 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 150 | 150 | ||
| 151 | // 5. 获取输出的值,将device侧内存上的结果拷贝至host侧,需要根据具体API的接口定义修改 | 151 | // 5. 获取输出的值,将device侧内存上的结果拷贝至host侧,需要根据具体API的接口定义修改 |
| 152 | auto size = GetShapeSize(outShape); | 152 | auto size = GetShapeSize(outShape); |
| 153 | std::vector<float> resultData(size, 0); | 153 | std::vector<float> resultData(size, 0); |
| 154 | ret = aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), outDeviceAddr, | 154 | ret = aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), outDeviceAddr, |
| 155 | size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); | 155 | size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); |
| 156 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret); | 156 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 157 | for (int64_t i = 0; i < size; i++) { | 157 | for (int64_t i = 0; i < size; i++) { |
| 158 | LOG_PRINT("result[%ld] is: %f\n", i, resultData[i]); | 158 | LOG_PRINT("result[%ld] is: %f\n", i, resultData[i]); |
| 159 | } | 159 | } |
| @@ -164,27 +164,27 @@ int main() { | |||
| 164 | // 调用aclnnInplaceAddmm第一段接口 | 164 | // 调用aclnnInplaceAddmm第一段接口 |
| 165 | uint64_t workspaceSizeForInplace = 0; | 165 | uint64_t workspaceSizeForInplace = 0; |
| 166 | ret = aclnnInplaceAddmmGetWorkspaceSize(self, mat1, mat2, beta, alpha, cubeMathType, &workspaceSizeForInplace, &executor); | 166 | ret = aclnnInplaceAddmmGetWorkspaceSize(self, mat1, mat2, beta, alpha, cubeMathType, &workspaceSizeForInplace, &executor); |
| 167 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnInplaceAddmmGetWorkspaceSize failed. ERROR: %d\n", ret); return ret); | 167 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnInplaceAddmmGetWorkspaceSize failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 168 | // 根据第一段接口计算出的workspaceSize申请device内存 | 168 | // 根据第一段接口计算出的workspaceSize申请device内存 |
| 169 | void* workspaceAddrForInplace = nullptr; | 169 | void* workspaceAddrForInplace = nullptr; |
| 170 | std::unique_ptr<void, aclError (*)(void*)> workspaceAddrForInplacePtr(nullptr, aclrtFree); | 170 | std::unique_ptr<void, aclError (*)(void*)> workspaceAddrForInplacePtr(nullptr, aclrtFree); |
| 171 | if (workspaceSizeForInplace > 0) { | 171 | if (workspaceSizeForInplace > 0) { |
| 172 | ret = aclrtMalloc(&workspaceAddrForInplace, workspaceSizeForInplace, ACL_MEM_MALLOC_HUGE_FIRST); | 172 | ret = aclrtMalloc(&workspaceAddrForInplace, workspaceSizeForInplace, ACL_MEM_MALLOC_HUGE_FIRST); |
| 173 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret); | 173 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 174 | workspaceAddrForInplacePtr.reset(workspaceAddrForInplace); | 174 | workspaceAddrForInplacePtr.reset(workspaceAddrForInplace); |
| 175 | } | 175 | } |
| 176 | // 调用aclnnInplaceAddmm第二段接口 | 176 | // 调用aclnnInplaceAddmm第二段接口 |
| 177 | ret = aclnnInplaceAddmm(workspaceAddrForInplace, workspaceSizeForInplace, executor, stream); | 177 | ret = aclnnInplaceAddmm(workspaceAddrForInplace, workspaceSizeForInplace, executor, stream); |
| 178 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnInplaceAddmm failed. ERROR: %d\n", ret); return ret); | 178 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnInplaceAddmm failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 179 | 179 | ||
| 180 | // step4(固定写法)同步等待任务执行结束 | 180 | // step4(固定写法)同步等待任务执行结束 |
| 181 | ret = aclrtSynchronizeStream(stream); | 181 | ret = aclrtSynchronizeStream(stream); |
| 182 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret); | 182 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 183 | 183 | ||
| 184 | // step5 获取输出的值,将device侧内存上的结果拷贝至host侧 | 184 | // step5 获取输出的值,将device侧内存上的结果拷贝至host侧 |
| 185 | ret = aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), selfDeviceAddr, | 185 | ret = aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), selfDeviceAddr, |
| 186 | size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); | 186 | size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); |
| 187 | - CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret); | 187 | + CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret); |
| 188 | for (int64_t i = 0; i < size; i++) { | 188 | for (int64_t i = 0; i < size; i++) { |
| 189 | LOG_PRINT("result[%ld] is: %f\n", i, resultData[i]); | 189 | LOG_PRINT("result[%ld] is: %f\n", i, resultData[i]); |
| 190 | } | 190 | } |


请指明语言类型cpp