mstx接口简介
mstx接口是MindStudio提供的一个性能分析接口,它允许用户在应用程序中插入特定的标记,以便在工具进行内存检测时能够更精确地定位特定算子的内存问题。例如,针对二级指针类算子,在不使能mstx接口的情况下,得到的地址空间可能不准确。通过mstx的mstxMemRegionsRegister和mstxMemRegionsUnregister接口,可以将准确的地址空间传递给异常检测工具,实现更精准的内存检测。
mstx接口的使用
- msSanitizer工具默认使能mstx接口,允许用户使用mstx接口自定义算子使用的内存空间地址和大小,可识别并快速定界算子的内存问题。
- mstx当前提供了两种API的使用方式:库文件和头文件,以Link为例:
- 此样例工程不支持
Atlas A3 训练系列产品 。
- 在${git_clone_path}/samples/operator/ascendc/0_introduction/1_add_frameworklaunch/AclNNInvocation/src/CMakeLists.txt路径下新增库文件libms_tools_ext.so,地址为:${INSTALL_DIR}/lib64/libms_tools_ext.so。
# Header path include_directories( ... ${CUST_PKG_PATH}/include ) ... target_link_libraries( ... dl )
- 在${git_clone_path}/samples/operator/ascendc/0_introduction/1_add_frameworklaunch/AclNNInvocation/src/main.cpp路径下,将用户程序编译链接dl库,对应的头文件ms_tools_ext.h地址:${INSTALL_DIR}/include/mstx。
... #include "mstx/ms_tools_ext.h" ...
- ${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。若安装的Ascend-cann-toolkit软件包,以root安装举例,则安装后文件存储路径为:/usr/local/Ascend/ascend-toolkit/latest。
- 此样例工程不支持
整体调用示例
mstxMemVirtualRangeDesc_t rangeDesc = {}; rangeDesc.deviceId = deviceId; // 设备编号 rangeDesc.ptr = gm; // 注册的内存池gm首地址 rangeDesc.size = 1024; // 内存池大小 heapDesc.typeSpecificDesc = &rangeDesc; mstxMemHeapDesc_t heapDesc{}; mstxMemHeapHandle_t memPool = mstxMemHeapRegister(globalDomain, &heapDesc); // 注册内存池 mstxMemVirtualRangeDesc_t rangesDesc[1] = {}; // 二次分配包含的region数量 mstxMemRegionHandle_t regionHandles[1] = {}; rangesDesc[0].deviceId = deviceId; // 设备编号 rangesDesc[0].ptr = gm; // 二次分配gm地址 rangesDesc[0].size = 256; // 二次分配大小 mstxMemRegionsRegisterBatch_t regionsDesc{}; regionsDesc.heap = memPool; regionsDesc.regionType = MSTX_MEM_TYPE_VIRTUAL_ADDRESS; regionsDesc.regionCount = 1; regionsDesc.regionDescArray = rangesDesc; regionsDesc.regionHandleArrayOut = regionHandles; mstxMemRegionsRegister(globalDomain, ®ionsDesc); // 二次分配注册 Do(blockDim, nullptr, stream, gm); // 算子kernel函数 mstxMemRegionRef_t regionRef[1] = {}; regionRef[0].refType = MSTX_MEM_REGION_REF_TYPE_HANDLE; regionRef[0].handle = regionHandles[0]; mstxMemRegionsUnregisterBatch_t refsDesc = {}; refsDesc.refCount = 1; refsDesc.refArray = regionRef; mstxMemRegionsUnregister(globalDomain, &refsDesc); // 注销二次分配 mstxMemHeapUnregister(globalDomain, memPool); // 注销内存池
父主题: 扩展接口(mstx)