MSPTI工具使用(C API)
MSPTI工具C API介绍
当前提供如下类型的API:
- Activity API:异步记录CANN活动,例如:CANN API、Kernel、内存拷贝等。
- Callback API:CANN事件回调机制,用于实时通知用户(订阅者)特定的CANN事件已执行,例如:CANN的runtime内存拷贝。
使用示例
以下接口详细介绍请参见MSPTI C API参考。
- Activity API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#include "mspti.h" void UserBufferRequest(uint8_t **buffer, size_t *size, size_t *maxNumRecords) { constexpr uint32_t SIZE = 5 * 1024 * 1024; uint8_t *pBuffer = (uint8_t *) malloc(SIZE + ALIGN_SIZE); *buffer = ALIGN_BUFFER(pBuffer, ALIGN_SIZE); *size = 5 * 1024 * 1024; *maxNumRecords = 0; } void UserBufferComplete(uint8_t *buffer, size_t size, size_t validSize) { if (validSize > 0) { msptiActivity *pRecord = NULL; msptiResult status = MSPTI_SUCCESS; do { status = msptiActivityGetNextRecord(buffer, validSize, &pRecord); if (status == MSPTI_SUCCESS) { if (pRecord->kind == MSPTI_ACTIVITY_KIND_MARKER) { ... 消费数据逻辑 } } else if (status == MSPTI_ERROR_MAX_LIMIT_REACHED) { break; } } while (1); } free(buffer); } int main() { // 根据自己的实际device填写deviceId int32_t deviceId = 1; aclrtContext context; aclrtStream stream; msptiSubscriberHandle subscriber; msptiSubscribe(&subscriber, nullptr, nullptr); // 注册Request和Complete函数 msptiActivityRegisterCallbacks(UserBufferRequest, UserBufferComplete); // 开启MARKER类型数据采集 msptiActivityEnable(MSPTI_ACTIVITY_KIND_MARKER); auto ret = Init(deviceId, &context, &stream); // acl初始化 for (size_t i = 0; i < 3; ++i) { mstxMarkA("AAA", stream); } aclFinalize(); msptiActivityDisable(MSPTI_ACTIVITY_KIND_MARKER); // 刷新落盘 msptiActivityFlushAll(1); msptiUnsubscribe(subscriber); return 0; }
- Callback API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#include <iostream> #include <vector> #include "acl/acl.h" #include "aclnnop/aclnn_add.h" #include "mspti.h" int Init(int32_t deviceId, aclrtContext* context, aclrtStream* stream) { // acl初始化 auto ret = aclrtSetDevice(deviceId); ret = aclrtCreateContext(context, deviceId); ret = aclrtSetCurrentContext(*context); ret = aclrtCreateStream(stream); ret = aclInit(nullptr); return 0; } // 用户回调函数 void UserCallback(void *pUserData, msptiCallbackDomain domain, msptiCallbackId callbackId, const msptiCallbackData *pCallbackInfo) { if (pCallbackInfo->callbackSite == MSPTI_API_ENTER) { LOG_PRINT("Enter: %s\n", pCallbackInfo->functionName); } else if (pCallbackInfo->callbackSite == MSPTI_API_EXIT) { LOG_PRINT("Exit: %s\n", pCallbackInfo->functionName); } } int main() { // (固定写法)device/context/stream初始化 int32_t deviceId = 0; aclrtContext context; aclrtStream stream; // 订阅MSPTI msptiSubscriberHandle subscriber; msptiSubscribe(&subscriber, UserCallback, nullptr); // 开启MSPTI_CBID_RUNTIME_CONTEXT_CREATED_EX回调 msptiEnableCallback(1, subscriber, MSPTI_CB_DOMAIN_RUNTIME, MSPTI_CBID_RUNTIME_CONTEXT_CREATED_EX); ... msptiEnableCallback(0, subscriber, MSPTI_CB_DOMAIN_RUNTIME, MSPTI_CBID_RUNTIME_CONTEXT_CREATED_EX); auto ret = Init(deviceId, &context, &stream); // 取消订阅 msptiUnsubscribe(subscriber); return 0; }
父主题: 使用MSPTI采集性能数据