已合并
修改run.sh适配自动获取cann路径 #11
zengxiong创建于 4月10日
修改run.sh适配自动获取cann路径 #11
已合并
共 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", |
The file is empty
| @@ -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 | + | ||
| 1 | rm -rf build_out | 22 | rm -rf build_out |
| 2 | -rm -rf /home/zdy/vendor | ||
| 3 | bash build.sh | 23 | bash build.sh |
| 4 | cd build_out | 24 | cd 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 | ||
| 272 | struct memory_ctx *acl_memory_create(struct perftest_parameters *params) | 270 | struct memory_ctx *acl_memory_create(struct perftest_parameters *params) |
| 273 | { | 271 | { |
| @@ -21,7 +21,6 @@ struct perftest_parameters; | |||
| 21 | extern "C" { | 21 | extern "C" { |
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | -// 声明函数,不在头文件中定义,避免重复定义 | ||
| 25 | bool acl_memory_supported(); | 24 | bool acl_memory_supported(); |
| 26 | struct memory_ctx *acl_memory_create(struct perftest_parameters *params); | 25 | struct memory_ctx *acl_memory_create(struct perftest_parameters *params); |
| 27 | void acl_init_nda_ops(struct pingpong_context *ctx, struct perftest_parameters *user_param); | 26 | void acl_init_nda_ops(struct pingpong_context *ctx, struct perftest_parameters *user_param); |
| @@ -1,13 +1,12 @@ | |||
| 1 | 1 | ||
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | -// ACL Context相关函数实现 | ||
| 5 | int acl_wrapper_init(const char *config_path) { | 4 | int acl_wrapper_init(const char *config_path) { |
| 6 | return aclInit(config_path); | 5 | return aclInit(config_path); |
| 7 | } | 6 | } |
| 8 | 7 | ||
| 9 | int acl_wrapper_finalize() { | 8 | int acl_wrapper_finalize() { |
| 10 | - return aclFinalize(); // 修改为正确的函数名 | 9 | + return aclFinalize(); |
| 11 | } | 10 | } |
| 12 | 11 | ||
| 13 | int acl_wrapper_get_device_count(uint32_t *count) { | 12 | int 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相关函数实现 | ||
| 22 | int acl_wrapper_rt_malloc(void **ptr, uint64_t size, int type) { | 20 | int 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 | ||
| 38 | int acl_wrapper_rt_host_register(void *ptr, uint64_t size, int flags) { | 36 | int 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相关函数实现 | ||
| 74 | int acl_wrapper_rt_create_stream(void **stream) { | 70 | int 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 | 12 | ||
| 13 | 13 | ||
| 14 | 14 | ||
| 15 | -// 临时定义可能缺失的宏 | 15 | + |
| 16 | 16 | ||
| 17 | 17 | ||
| 18 | 18 | ||
| @@ -26,21 +26,16 @@ | |||
| 26 | } \ | 26 | } \ |
| 27 | } while (0) | 27 | } while (0) |
| 28 | 28 | ||
| 29 | -// 被测deviceId | ||
| 30 | -// const int deviceId = 0; | ||
| 31 | - | ||
| 32 | aclOpExecutor *handle = NULL; | 29 | aclOpExecutor *handle = NULL; |
| 33 | void *workspace = NULL; | 30 | void *workspace = NULL; |
| 34 | 31 | ||
| 35 | aclTensorDesc *CreateTensorDesc(aclDataType dataType, int numDims, const int64_t *dims, | 32 | aclTensorDesc *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 | 6 | ||
| 7 | 7 | ||
| 8 | 8 | ||
| 9 | - | ||
| 10 | -// 包含nda_op_api.h以获得op_test函数声明 | ||
| 11 | 9 | ||
| 12 | 10 | ||
| 13 | 11 | ||
| @@ -11,7 +11,6 @@ | |||
| 11 | extern "C" { | 11 | extern "C" { |
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | -// 前置声明,避免循环依赖 | ||
| 15 | struct NdaBenchmarkKernelParam; | 14 | struct NdaBenchmarkKernelParam; |
| 16 | struct KernelXscContext; | 15 | struct KernelXscContext; |
| 17 | struct KernelBenchmarkParam; | 16 | struct KernelBenchmarkParam; |
| @@ -9,6 +9,7 @@ | |||
| 9 | 9 | ||
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | + | ||
| 12 | 13 | ||
| 13 | 14 | ||
| 14 | do { \ | 15 | do { \ |
| @@ -33,7 +34,6 @@ extern int GetWorkspaceSize(struct aclTensor *inputTensor_[], const int opCount, | |||
| 33 | 34 | ||
| 34 | int op_test(struct NdaBenchmarkKernelParam *param, struct KernelXscContext *ctx, struct KernelBenchmarkParam *benchMarkParam, int64_t *tpos, int deviceId) | 35 | int 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 | // 释放分配的内存 |