HIP(Heterogeneous-compute Interface for Portability)提供了一种日志记录机制,可以帮助追踪 HIP API 和运行时代码的执行情况。
一、HIP Logging Level
日志级别可以通过环境变量 AMD_LOG_LEVEL
来设置。默认情况下,HIP 日志是禁用的。以下是可用的日志级别枚举:
enum LogLevel {
LOG_NONE = 0, // 不记录任何日志
LOG_ERROR = 1, // 仅记录错误信息
LOG_WARNING = 2, // 记录错误和警告信息
LOG_INFO = 3, // 记录错误、警告和一般信息
LOG_DEBUG = 4 // 记录所有信息,包括调试信息
};
二、HIP Logging Mask
日志掩码用于控制记录 HIP 应用程序执行期间不同功能类型的日志。以下是可用的日志掩码枚举:
enum LogMask {
LOG_API = 0x00000001, // API调用
LOG_CMD = 0x00000002, // 内核和拷贝命令以及屏障
// ... 其他日志掩码选项
LOG_ALWAYS = 0xFFFFFFFF, // 即使掩码标志为零也总是记录
};
一旦设置了 AMD_LOG_LEVEL
,日志掩码将默认设置为 0x7FFFFFFF
。然而,根据不同的日志记录功能需求,也可以通过环境变量 AMD_LOG_MASK
来定义日志掩码。
三、HIP Logging Command
HIP 定义了一个 ClPrint
宏来打印日志信息:
#define ClPrint(level, mask, format, ...)
do {
if (AMD_LOG_LEVEL >= level) {
if (AMD_LOG_MASK & mask || mask == amd::LOG_ALWAYS) {
if (AMD_LOG_MASK & amd::LOG_LOCATION) {
amd::log_printf(level, __FILENAME__, __LINE__, format, ##__VA_ARGS__);
} else {
amd::log_printf(level, "", 0, format, ##__VA_ARGS__);
}
}
}
} while (false)
在这个宏中:
level
指定日志级别。mask
指定日志掩码。format
是日志消息的格式字符串。__VA_ARGS__
是格式字符串中占位符的参数。
示例用法
在 HIP 代码中,根据需要使用适当的输入变量调用 ClPrint()
函数,例如:
ClPrint(amd::LOG_INFO, amd::LOG_INIT, "Initializing HSA stack.");
这行代码将在日志级别至少为 LOG_INFO
且启用了 LOG_INIT
掩码时,打印出初始化 HSA 栈的信息。