1. HsaMemFlags 结构解析
HsaMemFlags 是 ROCm 异构计算环境中内存管理的核心控制结构,定义在 hsakmttypes.h 头文件中。这个位域结构体通过 23 个标志位实现了对内存分配行为的细粒度控制,涵盖了从基本内存属性到高级功能支持的各个维度。
1.1 内存属性控制
内存属性标志位决定了内存的基本行为特征:
c复制unsigned int NonPaged : 1; // 不可分页内存
unsigned int CachePolicy : 2; // 缓存策略
unsigned int ReadOnly : 1; // 只读内存
unsigned int PageSize : 2; // 页面大小
NonPaged 标志尤为重要,它确保内存不会被交换到磁盘,这对 GPU 操作至关重要。GPU 需要确定性的访问延迟,任何页面错误都会导致计算管线停滞。在 VRAM 分配时,这个标志必须设置为 1。
实际开发中发现,未设置 NonPaged 标志的系统内存分配可能导致 GPU 内核执行出现不可预测的延迟,特别是在内存压力较大的系统中。
1.2 访问控制标志
访问控制标志管理着不同处理器对内存的访问权限:
c复制unsigned int HostAccess : 1; // CPU 访问权限
unsigned int ExecuteAccess : 1; // 可执行内存
unsigned int GTTAccess : 1; // GART 映射
HostAccess 标志控制 CPU 是否能访问该内存区域。当设置为 0 时,内存仅对 GPU 可见,这可以避免不必要的 CPU aperture 映射开销,提升性能。但在需要 CPU-GPU 共享数据的场景下,必须将此标志设置为 1。
ExecuteAccess 标志标记内存为可执行区域,这对 AQL 队列内存和内核代码存储至关重要。未设置此标志的内存区域尝试执行指令会导致保护错误。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
