已合并
修改run.sh适配自动获取cann路径 #11
修改run.sh适配自动获取cann路径 #11
已合并
zengxiong创建于 4月10日
10 个文件变更+35-31
@@ -39,7 +39,7 @@
39 },39 },
40 "ASCEND_CANN_PACKAGE_PATH": {40 "ASCEND_CANN_PACKAGE_PATH": {
41 "type": "PATH",41 "type": "PATH",
42- "value": "/home/zdy/cann-9.0.T501"42+ "value": "/usr/local/Ascend/cann-9.0.0"
43 },43 },
44 "ASCEND_PYTHON_EXECUTABLE": {44 "ASCEND_PYTHON_EXECUTABLE": {
45 "type": "STRING",45 "type": "STRING",
@@ -1,5 +1,32 @@
1+#!/bin/bash
2+ 
3+# 读取环境变量 ASCEND_TOOLKIT_HOME
4+if [ -z "$ASCEND_TOOLKIT_HOME" ]; then
5+ echo "Error: ASCEND_TOOLKIT_HOME is not set"
6+ exit 1
7+fi
8+ 
9+# 读取环境变量 ASCEND_OPP_PATH(安装路径)
10+if [ -z "$ASCEND_OPP_PATH" ]; then
11+ echo "Error: ASCEND_OPP_PATH is not set"
12+ echo "Usage: ASCEND_TOOLKIT_HOME=/path/to/cann ASCEND_OPP_PATH=/path/to/opp bash run.sh"
13+ exit 1
14+fi
15+ 
16+# 获取当前 CMakePresets.json 中的 ASCEND_CANN_PACKAGE_PATH 值
17+CURRENT_VALUE=$(grep -A 3 '"ASCEND_CANN_PACKAGE_PATH"' CMakePresets.json | grep '"value"' | head -n 1 | sed 's/.*"value":[[:space:]]*"\([^"]*\)".*/\1/')
18+ 
19+# 更新 CMakePresets.json 中的 ASCEND_CANN_PACKAGE_PATH
20+sed -i "s|\"value\": \"${CURRENT_VALUE}\"|\"value\": \"${ASCEND_TOOLKIT_HOME}\"|" CMakePresets.json
21+ 
1rm -rf build_out22rm -rf build_out
2-rm -rf /home/zdy/vendor
3bash build.sh23bash build.sh
4cd build_out24cd build_out
5-bash custom_opp_ubuntu_x86_64.run --install-path=/home/zdy 25+ 
26+RUN_FILE=$(ls custom_opp_*.run 2>/dev/null | head -n1)
27+if [ -z "$RUN_FILE" ]; then
28+ echo "Error: No custom_opp_*.run file found"
29+ exit 1
30+fi
31+ 
32+bash ${RUN_FILE} --install-path=${ASCEND_OPP_PATH}
@@ -207,7 +207,6 @@ void *acl_nda_mmap(struct doorbell_map_desc *desc)
207 }207 }
208 }208 }
209 209 
210- // std::cout << "register pid: " << getpid() << std::endl;
211 printf("into acl_nda_mmap, acl device id is: %d\n", g_acl_deviceId);210 printf("into acl_nda_mmap, acl device id is: %d\n", g_acl_deviceId);
212 int ret = aclrtSetDevice(g_acl_deviceId);211 int ret = aclrtSetDevice(g_acl_deviceId);
213 if (ret != 0) {212 if (ret != 0) {
@@ -267,7 +266,6 @@ int acl_nda_unmap(void *ptr, struct doorbell_map_desc *desc)
267 fprintf(stderr, "unknown desc type.\n");266 fprintf(stderr, "unknown desc type.\n");
268 return -1;267 return -1;
269}268}
270-//////////////////////////////////////////////////////////////////////////////////
271 269 
272struct memory_ctx *acl_memory_create(struct perftest_parameters *params)270struct memory_ctx *acl_memory_create(struct perftest_parameters *params)
273{271{
@@ -21,7 +21,6 @@ struct perftest_parameters;
21extern "C" {21extern "C" {
22#endif22#endif
23 23 
24-// 声明函数,不在头文件中定义,避免重复定义
25bool acl_memory_supported();24bool acl_memory_supported();
26struct memory_ctx *acl_memory_create(struct perftest_parameters *params);25struct memory_ctx *acl_memory_create(struct perftest_parameters *params);
27void acl_init_nda_ops(struct pingpong_context *ctx, struct perftest_parameters *user_param);26void acl_init_nda_ops(struct pingpong_context *ctx, struct perftest_parameters *user_param);
@@ -1,13 +1,12 @@
1#include "acl_wrapper_basic.h"1#include "acl_wrapper_basic.h"
2#include <acl/acl.h>2#include <acl/acl.h>
3 3 
4-// ACL Context相关函数实现
5int acl_wrapper_init(const char *config_path) {4int acl_wrapper_init(const char *config_path) {
6 return aclInit(config_path);5 return aclInit(config_path);
7}6}
8 7 
9int acl_wrapper_finalize() {8int acl_wrapper_finalize() {
10- return aclFinalize(); // 修改为正确的函数名9+ return aclFinalize();
11}10}
12 11 
13int acl_wrapper_get_device_count(uint32_t *count) {12int acl_wrapper_get_device_count(uint32_t *count) {
@@ -18,7 +17,6 @@ int acl_wrapper_set_device(int32_t device_id) {
18 return aclrtSetDevice(device_id);17 return aclrtSetDevice(device_id);
19}18}
20 19 
21-// ACL Memory相关函数实现
22int acl_wrapper_rt_malloc(void **ptr, uint64_t size, int type) {20int acl_wrapper_rt_malloc(void **ptr, uint64_t size, int type) {
23 return aclrtMalloc(ptr, size, static_cast<aclrtMemMallocPolicy>(type));21 return aclrtMalloc(ptr, size, static_cast<aclrtMemMallocPolicy>(type));
24}22}
@@ -36,7 +34,6 @@ int acl_wrapper_rt_memset(void *ptr, uint64_t count, uint8_t value, uint64_t siz
36}34}
37 35 
38int acl_wrapper_rt_host_register(void *ptr, uint64_t size, int flags) {36int acl_wrapper_rt_host_register(void *ptr, uint64_t size, int flags) {
39- // 使用正确的枚举值,根据flags选择合适的注册类型
40 aclrtHostRegisterType reg_type = ACL_HOST_REGISTER_MAPPED;37 aclrtHostRegisterType reg_type = ACL_HOST_REGISTER_MAPPED;
41 switch(flags) {38 switch(flags) {
42 case 1:39 case 1:
@@ -49,7 +46,7 @@ int acl_wrapper_rt_host_register(void *ptr, uint64_t size, int flags) {
49 reg_type = ACL_HOST_REGISTER_MAPPED;46 reg_type = ACL_HOST_REGISTER_MAPPED;
50 break;47 break;
51 }48 }
52- void **mapped_ptr = nullptr; // 传递一个空指针49+ void **mapped_ptr = nullptr;
53 return aclrtHostRegister(ptr, size, reg_type, mapped_ptr);50 return aclrtHostRegister(ptr, size, reg_type, mapped_ptr);
54}51}
55 52 
@@ -70,7 +67,6 @@ int acl_wrapper_rt_free_host(void *ptr) {
70 return aclrtFreeHost(ptr);67 return aclrtFreeHost(ptr);
71}68}
72 69 
73-// ACL Stream相关函数实现
74int acl_wrapper_rt_create_stream(void **stream) {70int acl_wrapper_rt_create_stream(void **stream) {
75 aclrtStream temp_stream;71 aclrtStream temp_stream;
76 int ret = aclrtCreateStream(&temp_stream);72 int ret = aclrtCreateStream(&temp_stream);
@@ -12,7 +12,7 @@
12#include <stdio.h>12#include <stdio.h>
13#include "aclnn_nda_test_bw.h"13#include "aclnn_nda_test_bw.h"
14 14 
15-// 临时定义可能缺失的宏15+ 
16#ifndef ACL_FUNC_VISIBILITY16#ifndef ACL_FUNC_VISIBILITY
17#define ACL_FUNC_VISIBILITY17#define ACL_FUNC_VISIBILITY
18#endif18#endif
@@ -26,21 +26,16 @@
26 } \26 } \
27 } while (0)27 } while (0)
28 28 
29-// 被测deviceId
30-// const int deviceId = 0;
31- 
32aclOpExecutor *handle = NULL;29aclOpExecutor *handle = NULL;
33void *workspace = NULL;30void *workspace = NULL;
34 31 
35aclTensorDesc *CreateTensorDesc(aclDataType dataType, int numDims, const int64_t *dims,32aclTensorDesc *CreateTensorDesc(aclDataType dataType, int numDims, const int64_t *dims,
36 aclFormat format)33 aclFormat format)
37{34{
38- // 参数校验
39 if (numDims <= 0 || dims == NULL) {35 if (numDims <= 0 || dims == NULL) {
40 printf("[%d] Invalid number of dimensions or dimensions pointer is null.\n", __LINE__);36 printf("[%d] Invalid number of dimensions or dimensions pointer is null.\n", __LINE__);
41 return NULL;37 return NULL;
42 }38 }
43- // 校验每个维度的值是否有效
44 for (int i = 0; i < numDims; ++i) {39 for (int i = 0; i < numDims; ++i) {
45 if (dims[i] <= 0) {40 if (dims[i] <= 0) {
46 printf("[%d] Invalid dimension value at index %d: %ld. It should be greater than 0.\n", __LINE__, i, dims[i]);41 printf("[%d] Invalid dimension value at index %d: %ld. It should be greater than 0.\n", __LINE__, i, dims[i]);
@@ -161,9 +156,6 @@ int SetInputData(struct aclTensorDesc *inputDesc[], void *devInputs_[], struct N
161{156{
162 aclrtMemcpyKind kindInput = ACL_MEMCPY_HOST_TO_DEVICE;157 aclrtMemcpyKind kindInput = ACL_MEMCPY_HOST_TO_DEVICE;
163 158 
164- // printf("host value: %d\n", benchMarkParam->options.iters);
165- // benchMarkParam->tcompleted = (int64_t*)malloc(sizeof(int64_t) * 2);
166- 
167 CHECK_RETURN(aclrtMemcpy, devInputs_[0], aclGetTensorDescSize(inputDesc[0]),159 CHECK_RETURN(aclrtMemcpy, devInputs_[0], aclGetTensorDescSize(inputDesc[0]),
168 (void*)param, aclGetTensorDescSize(inputDesc[0]), kindInput);160 (void*)param, aclGetTensorDescSize(inputDesc[0]), kindInput);
169 CHECK_RETURN(aclrtMemcpy, devInputs_[1], aclGetTensorDescSize(inputDesc[1]),161 CHECK_RETURN(aclrtMemcpy, devInputs_[1], aclGetTensorDescSize(inputDesc[1]),
@@ -6,8 +6,6 @@
6#define NDA_OP_H6#define NDA_OP_H
7 7 
8#include <stdint.h>8#include <stdint.h>
9- 
10-// 包含nda_op_api.h以获得op_test函数声明
11#include "nda_op_api.h"9#include "nda_op_api.h"
12 10 
13#define NPU_ALIGN 811#define NPU_ALIGN 8
@@ -11,7 +11,6 @@
11extern "C" {11extern "C" {
12#endif12#endif
13 13 
14-// 前置声明,避免循环依赖
15struct NdaBenchmarkKernelParam;14struct NdaBenchmarkKernelParam;
16struct KernelXscContext;15struct KernelXscContext;
17struct KernelBenchmarkParam;16struct KernelBenchmarkParam;
@@ -9,6 +9,7 @@
9#include <sys/mman.h>9#include <sys/mman.h>
10#include <stdarg.h>10#include <stdarg.h>
11#include <stdio.h>11#include <stdio.h>
12+#include "aclnn_nda_test_bw.h"
12 13 
13#define CHECK_RETURN(func, ...) \14#define CHECK_RETURN(func, ...) \
14 do { \15 do { \
@@ -33,7 +34,6 @@ extern int GetWorkspaceSize(struct aclTensor *inputTensor_[], const int opCount,
33 34 
34int op_test(struct NdaBenchmarkKernelParam *param, struct KernelXscContext *ctx, struct KernelBenchmarkParam *benchMarkParam, int64_t *tpos, int deviceId)35int op_test(struct NdaBenchmarkKernelParam *param, struct KernelXscContext *ctx, struct KernelBenchmarkParam *benchMarkParam, int64_t *tpos, int deviceId)
35{36{
36- // printf("pid: %d\n", getpid());
37 CHECK_RETURN(aclrtSetDevice, deviceId);37 CHECK_RETURN(aclrtSetDevice, deviceId);
38 int64_t inputShape[1] = { sizeof(struct NdaBenchmarkKernelParam) / sizeof(int64_t) };38 int64_t inputShape[1] = { sizeof(struct NdaBenchmarkKernelParam) / sizeof(int64_t) };
39 int64_t inputShape1[1] = { sizeof(struct KernelXscContext) / sizeof(int64_t) };39 int64_t inputShape1[1] = { sizeof(struct KernelXscContext) / sizeof(int64_t) };
@@ -83,7 +83,6 @@ int op_test(struct NdaBenchmarkKernelParam *param, struct KernelXscContext *ctx,
83 struct aclTensor *inputTensor[3] = {NULL};83 struct aclTensor *inputTensor[3] = {NULL};
84 struct aclTensor *outputTensor[1] = {NULL};84 struct aclTensor *outputTensor[1] = {NULL};
85 85 
86- // 直接使用 aclCreateTensor 创建 tensor
87 int64_t *inputShape_ptr = inputShape;86 int64_t *inputShape_ptr = inputShape;
88 inputTensor[0] = aclCreateTensor(87 inputTensor[0] = aclCreateTensor(
89 inputShape_ptr, 1,88 inputShape_ptr, 1,
@@ -123,11 +122,7 @@ int op_test(struct NdaBenchmarkKernelParam *param, struct KernelXscContext *ctx,
123 CHECK_RETURN(SetInputData, inputDesc, devInputs, param, ctx, benchMarkParam);122 CHECK_RETURN(SetInputData, inputDesc, devInputs, param, ctx, benchMarkParam);
124 size_t workSpaceSize = 0;123 size_t workSpaceSize = 0;
125 CHECK_RETURN(GetWorkspaceSize, inputTensor, 0, outputTensor, &workSpaceSize, 0);124 CHECK_RETURN(GetWorkspaceSize, inputTensor, 0, outputTensor, &workSpaceSize, 0);
126- 125+ CHECK_RETURN(aclnnHbmStressTestPi, workspace, workSpaceSize, handle, stream);
127- // 由于 aclnnHbmStressTestPi 函数可能不存在,我们暂时注释掉这部分
128- // CHECK_RETURN(aclnnHbmStressTestPi, workspace, workSpaceSize, handle, stream);
129-
130- // 替代实现:简单的同步操作
131 CHECK_RETURN(aclrtSynchronizeStream, stream);126 CHECK_RETURN(aclrtSynchronizeStream, stream);
132 127 
133 // 释放分配的内存128 // 释放分配的内存