AMD HSA 异构计算架构和AMD-KFD内核驱动&NVIDIA内核驱动

AMD HSA架构与KFD内核驱动解析:GPU协同计算新篇章
本文探讨了AMD的HSA异构计算架构和AMD-KFD内核驱动,旨在打破CPU和GPU的界限,实现高效协同工作。HSA允许任何处理单元无缝访问数据,简化编程,提高系统性能。AMD的KFD驱动作为HSA的基础,已集成到Linux内核中,与DRM框架协同工作。同时,文章对比了AMD与NVIDIA的内核驱动策略,强调了AMD在开源方面的优势。

当前的CPU和GPU是分立设计的处理器,不能高效率地协同工作,编写同时运行于CPU和GPU的程序也是相当麻烦。由于CPU和GPU拥有独立的地址空间,应用程序不得不明确地控制数据在CPU和GPU之间的流动。CPU代码通过系统调用向GPU发送任务,此类系统调用一般由GPU驱动程序管理,而驱动程序本身又受到其他调度程序管理。这么多的环节造成了很大的调用开销.

为了充分释放并行处理器的计算能力,架构设计者必须打破既有格局,采用新的思路。设计者必须重塑计算系统,把同一个平台上分立的处理单元紧密整合成为不断演进单颗处理器,同时无需软件开发者的编程方式发生重大的改变,这是HSA(Heterogeneous System Architecture)设计中的首要目标。

2012年6月份,AMD联合ARM、Imagination、联发科、德州仪器共同组建了非营利组织“异构系统架构基金会”(HSA Foundation),随后吸引了三星电子、高通以及大批行业公司、科研机构的加盟。

10年前这个消息公布之后,AMD还给业界画了一个大饼——未来是属于HSA异构运算的,十六年前54亿美元收购ATI公司也是为了CPU+GPU异构运算的大业,其中CPU负责通用运算及管理,GPU则依靠强大的浮点性能提供主要输出。

不过10年过去了,HSA并没有推出什么重要的产品,实际上这几年盟主AMD都不怎么提HSA异构的事了,尽管自家的APU产品还在推。

意大利网站bitchips日前表示AMD的HSA异构运算死了,要被埋葬了,CPU、GPU共处一个核心的APU也会停止了,未来将是CPU+GPU同一封装的天下(猜测可能是chiplets 芯粒基数,GPU和CPU封装在一起,但不是同一颗DIE).

APU是“Accelerated Processing Units”的简称,中文名字叫加速处理器,是AMD融聚未来理念的产品,它第一次将处理器和独显核心做在一个晶片上,协同计算、彼此加速,同时具有高性能处理器和最新支持DX11独立显卡的处理性能,大幅提升电脑运行效率,实现了CPUGPU真正的融合。APU是处理器未来发展的趋势。

相比INTEL的酷睿系列集成显卡,APU的GPU所占面积要大很多,将近50%,毕竟集成进同一颗芯片的是独立显卡,并非是功能受限,阉割严重的核显。

从APU的发展来看,AMD在做的事情是让CPU和GPU彻底融为一体,无论是AMD的Llano,还是Brazos,目标都是一致的。AMD认为,CPU和GPU的融合将分为四步进行:第一步是物理整合过程(Physical Integration),将CPU和GPU集成在同一块硅芯片上,并利用高带宽的内部总线通讯,集成高性能的内存控制器,借助开放的软件系统促成异构计算。第二步称为平台优化(Optimized Platforms),CPU和GPU之间互连接口进一步增强,并且统一进行双向电源管理,GPU也支持高级编程语言。第三步是架构整合(Architectural Integration),实现统一的CPU/GPU寻址空间、GPU使用可分页系统内存、GPU硬件可调度、CPU/GPU/APU内存协同一致。第四步是架构和系统整合(Architectural & OS Integration),主要特点包括GPU计算上下文切换、GPU图形优先计算、独立显卡的PCI-E协同、任务并行运行实时整合等等。

全功能HSA的特点

HSA将CPU和GPU紧密结合在一起,释放强大,灵活的算力:

再看几个脑洞大开的HSA设计思路,除了hUMA一致性存储外,让人眼前一亮的还有CPU算力和GPU算力一视同仁,统一协调分配,GPU可以向CPU dispatch串行WORK,而CPU也可以向GPU发送并行WORK,将并行和串行算力的利用率发挥到极致。

CPU和GPU的交互更加灵活,甚至都可以在GPU kernel中调用CPU的回调函数,这样可以扩大GPU端kernel实现的粒度,不再需要将大KERNEL切分成小KERNEL,在小KERNEL中间执行CPU流程,增加GPU侧的throughput.

HSA Arch BLock:

异构系统架构(HSA,Heterogeneous System Architecture)用一句话来概括就是:一种智能计算架构,通过无缝地分配相应的任务至最适合的处理单元,使CPU、GPU和其他处理器和谐工作在单一芯片上。上一代APU虽然已经将CPU和GPU无缝融合在了一起,但并没有实现“分配相应的任务至最适合的处理单元”,这就是HSA架构的精髓,也是AMD未来APU想要努力实现的方向。

PS:根据这段描述,似乎可以得出结论,APU是 HSA发展过程中的一个阶段,两者关系用欧拉图表示可以表示成:

HSA系统的几大特性:

   1. 任何处理单元的数据可以轻易地被其它处理单元所访问;
   2. 异构计算不仅包括GPU,还包括其它专用处理单元或协处理器;
   3. 编程人员不用知道程序在什么处理单元上运行;
   4. GPU和其它处理单元无缝访问虚拟内存,解决数据搬迁瓶颈,数据无需复制。

在硬件层面,HSA架构当中的异构统一内存访问是一项关键技术。将CPU,GPU和内存全部封装为一体,大幅缩短了DDR内存行程,和CPU-GPU PCIe行程,从而大幅提高了性能和效率。这样做的优势还有很多,以多媒体解码应用为例,在基于PCIE GPU解码加速的卡上,为了缩短数据访问的行程,通常解码在GPU上进行,但是CPU上必须同时保留framebuffer和vbv的buffer,以便做数据缓冲和frambuffer的下一步处理(比如显示,后处理等等),如果CPU和GPU共享一个物理存储,两边访问行程一样,这样会节省两个buffer。

AMD在技术创新上相对intel已经保持了近十年的领先优势,从64位,直连架构,集成内存控制器,到APU,

08-24
<think>我们正在处理一个关于AMD KFD (Kernel Fusion Driver) 的技术详解及开发指南的请求。根据提供的引用,我们可以整合以下信息: 1. KFD的作用:负责异构计算(如ROCm/HSA)下的GPU资源管理,特别是管理用户空间队列提交的任务,高效管理进程的显存(VRAM)系统内存(GTT)资源[^1]。 2. KFD中的event机制:是用户空间与内核、GPU之间进行异步事件通知同步的核心基础,提供事件等待、信号、异常调试等能力[^2]。 3. KFD与DRM的交互:在获取VM(虚拟内存)时,KFD会调用DRM分配的amdgpu_vm并再次初始化[^3]。 4. KFD的中断处理:为每个GPU节点注册中断处理类,不同代GPU有不同的实现,主要区别在中断上半部下半部的处理函数[^4]。 5. Doorbell机制:实现用户空间与硬件高效通信,通过PCIe BAR2映射寄存器区间,驱动负责doorbell索引的分配、映射、权限管理回收[^5]。 现在,我们将根据这些信息构建一个详细的回答,包括KFD的技术概述、核心机制(如event、doorbell、中断)以及开发中的关键点。同时,我们将按照要求使用LaTeX格式行内公式($...$)独立公式($$...$$),并生成相关问题。 注意:由于引用内容有限,我们主要基于提供的引用进行整合,并适当补充通用知识(确保真实可靠)来构建回答。</think>### AMD KFD (Kernel Fusion Driver) 技术详解及开发指南 #### 一、KFD 概述 KFDAMD GPU 驱动中负责异构计算(如 ROCm/HSA)资源管理的核心模块,主要功能包括: 1. **资源虚拟化**:管理用户空间队列提交的任务,高效分配显存(VRAM)系统内存(GTT)资源[^1]。 2. **硬件抽象**:为不同代 GPU(如 GFX10/GFX11)提供统一接口,其架构满足关系: $$ \text{KFD} \subseteq \text{AMDGPU驱动} \subseteq \text{Linux内核} $$ 3. **进程隔离**:通过虚拟内存管理(VM)实现多进程安全隔离,在 `kfd_ioctl_acquire_vm` 中初始化 DRM 分配的 `amdgpu_vm` 对象[^3]。 #### 二、核心机制详解 1. **Event 异步通知机制** - **设计目标**:提供用户空间与 GPU 的低延迟事件同步(如任务完成、异常通知)[^2]。 - **实现流程**: ```mermaid graph LR A[用户空间] -->|注册事件| B[KFD Event] B -->|中断触发| C[ISR 上半部] C -->|Workqueue| D[ISR 下半部] D -->|通知用户进程| A ``` - **中断处理**:每代 GPU 实现独立的 `event_interrupt_class`,包含: - `.interrupt_isr`:快速中断判定(上半部) - `.interrupt_wq`:异步事件处理(下半部)[^4] 2. **Doorbell 通信机制** - **硬件基础**:通过 PCIe BAR2 映射寄存器区间,实现用户空间直接读写。 - **驱动职责**: - Doorbell 索引分配与回收 - 内存映射权限控制(`mmap` 实现) - 多进程并发管理[^5] - **性能优势**:延迟公式 $t_{\text{doorbell}} \ll t_{\text{syscall}}$,实现无锁任务提交。 3. **VM 虚拟内存管理** - **双初始化问题**:DRM 首次初始化 `amdgpu_vm` 后,KFD 在 `acquire_vm` 调用链中再次初始化[^3]。 - **内存隔离**:满足多进程安全要求: $$ \forall P_i \in \text{Processes}, \quad \text{VM}(P_i) \cap \text{VM}(P_j) = \emptyset \quad (i \neq j) $$ #### 三、开发实践指南 1. **中断处理开发** ```c // 示例:GFX11 中断处理类注册 static const struct kfd_event_interrupt_class gfx11_interrupt_class = { .interrupt_isr = gfx11_event_interrupt_isr, .interrupt_wq = gfx11_event_interrupt_wq, }; int kfd_gfx11_interrupt_init(struct kfd_node *dev) { dev->event_interrupt_class = &gfx11_interrupt_class; // 注册到节点 } ``` 2. **Doorbell 映射实现** - **用户空间映射**:通过 `ioctl(KFD_IOC_ALLOC_QUEUE_DOORBELL)` 获取 doorbell ID。 - **内核映射**:`kfd_doorbell_mmap()` 将 PCI BAR2 区域映射到用户空间[^5]。 3. **调试建议** - 使用 `trace_kfd_events` 追踪 event 生命周期 - 通过 `debugfs` 检查 doorbell 分配状态 - 监控 VM 泄漏:`amdgpu_vm_fini` 调用计数 #### 四、性能优化关键 1. **Event 延迟优化**:采用 MSI-X 中断 + 分层处理(ISR 轻量化)。 2. **Doorbell 批处理**:聚合任务提交减少 MMIO 写入次数。 3. **VM 缓存复用**:跨进程共享只读 VM 段,减少重复初始化开销[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值