mstx接口是MindStudio提供的一个性能分析接口,它允许用户在应用程序中插入特定的标记,以便在工具进行内存检测时能够更精确地定位特定算子的内存问题。例如,针对二级指针类算子,在不使能mstx接口的情况下,得到的地址空间可能不准确。通过mstx的mstxMemRegionsRegister和mstxMemRegionsUnregister接口,可以将准确的地址空间传递给异常检测工具,实现更精准的内存检测。
# Header path include_directories( ... ${CUST_PKG_PATH}/include ) ... target_link_libraries( ... dl )
... #include "mstx/ms_tools_ext_h" ...
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); // 注销内存池