昇腾社区首页
中文
注册

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;
    }