6.3 显存与地址:amd_memory
要让 GPU 干任何活第一步都是准备内存命令流IB/PM4要放在 GPU 能读到的内存里被拷贝的 src/dst 数据也要有 GPU 虚拟地址。裸用 libdrm 做这件事每次都要走「分配 BO → 分配 VA 范围 → 建立映射 →可选CPU 映射」四步还要处理各步失败时的逆序回滚。amd_memory.{c,h}的价值就是把这套样板收敛成一两个函数。这一篇讲清楚它封装了什么、每层 libdrm 调用各自负责什么、以及不同变体该怎么选。一、一个 BO 从分配到可用要过几关在 amdgpu 的模型里「一块能被 GPU 命令直接引用的内存」不是一次调用就绪的它有三个正交的概念amdgpu_bo_alloc分配物理 BO选 heap: VRAM/GTTamdgpu_va_range_alloc分配一段 GPU 虚拟地址amdgpu_bo_va_op MAP把 BO 映射到该 VAamdgpu_bo_cpu_map拿到 CPU 指针可选BObuffer object真实的物理后备分配时用preferred_heap决定放在 VRAM 还是 GTT系统内存用flags指定 CPU 可访问等属性。VA 范围GPU 侧的虚拟地址空间独立于物理 BO 分配。命令流里写的地址如 WRITE_DATA 的目标就是这个 VA。MAP把物理 BO 绑到某段 VA 上页表由此建立GPU 才能通过该地址访问到数据。CPU map可选给测试代码一个void*去填数据 / 读回校验。这四步任何一步失败前面已成功的都要按逆序撤销——这正是最容易写错、也最值得封装的部分。二、主力函数amdgpu_bo_alloc_and_map绝大多数测试用的就是它。一次调用把四步和回滚全包了intamdgpu_bo_alloc_and_map(amdgpu_device_handle dev,unsignedsize,unsignedalignment,unsignedheap,uint64_tflags,amdgpu_bo_handle*bo,void**cpu,uint64_t*mc_address,amdgpu_va_handle*va_handle){structamdgpu_bo_alloc_requestrequest{.alloc_sizesize,.phys_alignmentalignment,.preferred_heapheap,.flagsflags,};amdgpu_bo_handle buf_handle;amdgpu_va_handle handle;uint64_tvmc_addr;intr;ramdgpu_bo_alloc(dev,request,buf_handle);if(r)returnr;ramdgpu_va_range_alloc(dev,amdgpu_gpu_va_range_general,size,alignment,0,vmc_addr,handle,0);if(r)gotoerror_va_alloc;ramdgpu_bo_va_op(buf_handle,0,size,vmc_addr,0,AMDGPU_VA_OP_MAP);if(r)gotoerror_va_map;ramdgpu_bo_cpu_map(buf_handle,cpu);if(r)gotoerror_cpu_map;*bobuf_handle;*mc_addressvmc_addr;*va_handlehandle;return0;error_cpu_map:amdgpu_bo_cpu_unmap(buf_handle);error_va_map:amdgpu_bo_va_op(buf_handle,0,size,vmc_addr,0,AMDGPU_VA_OP_UNMAP);error_va_alloc:amdgpu_bo_free(buf_handle);returnr;}调用方拿回四样东西各有用途输出类型用途*boamdgpu_bo_handle提交时进 BO list让内核知道这次提交引用了它*cpuvoid*CPU 侧填数据 / 读回校验*mc_addressuint64_tGPU 虚拟地址写进 PM4 packet 的地址字段*va_handleamdgpu_va_handle释放时归还 VA 范围关键设计点是那串goto的逆序回滚CPU map 失败就只回滚到 unmapfreeVA map 失败就回滚 VA 分配……保证任何中途失败都不泄漏 BO 或 VA。这段逻辑写一次、所有测试复用是这个库最实在的价值之一。三、释放一句对称的收尾分配的逆操作同样打包好顺序与分配严格镜像voidamdgpu_bo_unmap_and_free(amdgpu_bo_handle bo,amdgpu_va_handle va_handle,uint64_tmc_addr,uint64_tsize){amdgpu_bo_cpu_unmap(bo);amdgpu_bo_va_op(bo,0,size,mc_addr,0,AMDGPU_VA_OP_UNMAP);amdgpu_va_range_free(va_handle);amdgpu_bo_free(bo);}CPU unmap → VA unmap → 归还 VA 范围 → 释放 BO。测试里alloc_and_map/unmap_and_free成对出现就不会漏资源。四、几个变体什么时候用哪个同一主题有几个变体差别只在「映射那一步怎么做」函数差别适用场景amdgpu_bo_alloc_and_map标准 MAP默认读写权限绝大多数测试amdgpu_bo_alloc_and_map_raw用amdgpu_bo_va_op_raw显式带READABLE|WRITEABLE|EXECUTABLE 自定义mapping_flags并按getpagesize()对齐需要可执行页放 shader ISA或自定义映射标志amdgpu_bo_alloc_and_map_sync按sync参数分流走 user-queue 路径_uq或普通路径用户队列UQ提交模型_raw版本的映射长这样注意它显式给出页权限并把大小对齐到系统页ramdgpu_bo_va_op_raw(dev,buf_handle,0,ALIGN(size,getpagesize()),vmc_addr,AMDGPU_VM_PAGE_READABLE|AMDGPU_VM_PAGE_WRITEABLE|AMDGPU_VM_PAGE_EXECUTABLE|mapping_flags,AMDGPU_VA_OP_MAP);放 compute shader 二进制的 BO 必须可执行就得走_raw显式带EXECUTABLE位普通数据 BO 用标准版即可。五、BO list把提交要引用的 BO 打包提交一次命令内核需要知道这次会碰到哪些 BO用于驻留/换页。amd_memory提供了一个最常用的两 BO 打包intamdgpu_get_bo_list(amdgpu_device_handle dev,amdgpu_bo_handle bo1,amdgpu_bo_handle bo2,amdgpu_bo_list_handle*list){amdgpu_bo_handle resources[]{bo1,bo2};returnamdgpu_bo_list_create(dev,bo2?2:1,resources,NULL,list);}bo2传 NULL 就只登记一个。典型场景bo1是命令 IBbo2是数据 BO。这个 list 会交给下一步的命令提交下一篇 6.4 之后的提交框架会用到。六、其它职责amd_memory还兼管几类与内存相关的杂活用到时知道去哪找即可内存信息查询get_available_vram/get_available_system_memory/get_gpu_memory_info用于按可用容量裁剪测试规模。dmabuf / 导入导出create_dmabuf、virtual_mem_to_gpu_bo把一段用户虚拟内存包成 GPU BO服务跨设备共享与 SVM 类场景。裸 CPU 虚拟内存virtual_alloc_memory/virtual_free_memory/wait_on_value用于纯 CPU 侧的辅助缓冲与轮询等待。多 fence 等待amdgpu_command_submission_multi_fence_wait_all。七、关键结论amdgpu 内存有三个正交概念物理 BO、GPU VA 范围、二者的 MAPamd_memory的核心就是把「分配四步 逆序回滚」封成一句amdgpu_bo_alloc_and_map。一次分配返回四样东西各司其职bo进 BO list、cpu填/读、mc_address写进 PM4、va_handle释放用。需要可执行页放 shader或自定义映射标志时用_raw变体用户队列模型用_sync变体。amdgpu_get_bo_list把「这次提交引用了哪些 BO」打包衔接到命令提交环节。

相关新闻

MODBUS地址代码详解:从协议地址到软件地址的映射与实战

MODBUS地址代码详解:从协议地址到软件地址的映射与实战

这次我们来看一个在工业自动化、物联网和嵌入式开发中绕不开的核心技术点:MODBUS地址代码。对于刚接触MODBUS协议的朋友来说,地址代码往往是第一个拦路虎,它直接决定了你的上位机软件能否正确读取到PLC、传感器或智能仪表的数据。网上资料虽然…

2026/8/15 23:29:47 阅读更多 →
跨平台桌面智能体 OpenClaw,Windows 与 Mac 部署要点整理

跨平台桌面智能体 OpenClaw,Windows 与 Mac 部署要点整理

核心亮点:提供全程可视化的图形操作界面,自动补齐全套运行依赖,数据独立存储于本地设备,兼容多款主流大模型,并采用轻量化的 45.7MB 整合压缩包。 教程适配:OpenClaw | 适配 Windows 10/11 与 macOS 双系统…

2026/8/15 23:29:47 阅读更多 →
HTML5前端开发:从基础到企业级实践指南

HTML5前端开发:从基础到企业级实践指南

1. 为什么HTML是前端开发的基石2008年我刚入行时,导师说的第一句话是:"把HTML标签当成乐高积木,你的网页就是搭出来的城堡。"这句话我记了十五年。作为前端三剑客之首,HTML定义了网页的骨架结构,就像建筑中的…

2026/8/17 16:19:19 阅读更多 →

最新新闻

全双工语音Agent评测实战:首音延迟测量与事件级验收框架构建

全双工语音Agent评测实战:首音延迟测量与事件级验收框架构建

1. 从“能对话”到“会对话”:全双工语音Agent评测的挑战与价值最近在跟进几个语音交互项目,从智能座舱到智能家居,再到一些垂类的客服场景,大家不约而同地开始提“全双工”和“语音Agent”。乍一听,这似乎是技术演进的…

2026/8/18 5:44:59 阅读更多 →
Excel VBA Worksheet.Add方法详解:从基础语法到实战应用

Excel VBA Worksheet.Add方法详解:从基础语法到实战应用

1. 从一次数据导入的重复劳动说起如果你经常用Excel处理数据,尤其是需要从多个数据源汇总、或者定期生成格式固定的报表,那你一定对“重复劳动”这四个字深恶痛绝。我印象最深的一次,是每个月都要手动从十几个不同的Excel文件里,把…

2026/8/18 5:44:59 阅读更多 →
AI架构操作系统:从混沌到清晰,构建可控AI系统的四大支柱

AI架构操作系统:从混沌到清晰,构建可控AI系统的四大支柱

1. 从“黑盒”到“地图”:为什么AI需要一个架构操作系统? 最近在跟几个做AI应用落地的朋友聊天,大家普遍有个头疼的问题:项目初期,模型效果惊艳,Demo跑得飞快;一旦要集成到现有业务系统&#xf…

2026/8/18 5:44:59 阅读更多 →
VLAN隔离与互通:三层交换配置实战与原理详解

VLAN隔离与互通:三层交换配置实战与原理详解

这次我们来看一个网络工程师日常工作中绕不开的核心话题:VLAN。很多刚入行的朋友,包括一些备考软考的朋友,都会有一个经典的困惑:既然费了那么大劲用VLAN把网络隔离开,为什么转头又要配置VLAN间的互通呢?这…

2026/8/18 5:44:59 阅读更多 →
构建完全本地AI助手:隐私优先的模块化架构与实战部署指南

构建完全本地AI助手:隐私优先的模块化架构与实战部署指南

1. 项目概述:为什么我们需要一个完全本地的AI助手?最近几年,AI助手几乎成了我们数字生活的标配。从手机上的语音助手到各种在线聊天机器人,它们确实带来了便利。但不知道你有没有过这样的顾虑:每次你问天气、查路线&am…

2026/8/18 5:44:59 阅读更多 →
办公智能体技术架构解析:从Agent框架到多智能体协作

办公智能体技术架构解析:从Agent框架到多智能体协作

1. 从“数字员工”到“办公智能体”:一场正在发生的生产力革命最近两年,如果你关注科技新闻,会发现一个高频词反复出现:“数字员工”或“AI员工”。从互联网大厂到传统软件公司,再到创业团队,几乎都在这个赛…

2026/8/18 5:43:59 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →