mstx接口简介

mstx接口是MindStudio提供的一个性能分析接口,它允许用户在应用程序中插入特定的标记,以便在工具进行内存检测时能够更精确地定位特定算子的内存问题。例如,针对二级指针类算子,在不使能mstx接口的情况下,得到的地址空间可能不准确。通过mstx的mstxMemRegionsRegistermstxMemRegionsUnregister接口,可以将准确的地址空间传递给异常检测工具,实现更精准的内存检测。

Kernel直调中的内核调用符场景暂不支持使用mstx接口。

mstx接口的使用

整体调用示例

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);                        // 注销内存池