GPU驱动开发工程师的主要工作是什么?

尝试回答一下这个问题,欢迎前辈们补充指错。
GPU驱动开发9从宏观上面来说,可以分为UMD和KMD,简单可以理解成一个是UserSpace下面
的5o,
个Kernel Space下面的ko,两个部分侧重的功能不太一样,KMD直接和硬件交互,从硬件侧考虑GPU行为,UMD直接和上层应用交互,
度简要说下GPU驱动会涉及到的流程:
,更多从应用API角度考虑,我这里从自底向上的角


KMD侧

1.GPU上电,不管什么硬件,没电都工作不了,为GPU进行上电的工作,是由GPU KMD驱动来执行的。一块GPU中往往分为不同的组件,通常是Cuda Core, Ray Tracing Core,MMU,GPU任务调度器Q等等,这些组件的上电一般是有一个严格的顺序的,你需要在KMD中的合适位置依次配置这些模块的时钟频率“和上电信号,至此,可以算是GPU刚刚启动了。GPU用电这件事情说来简单,实际很复杂,比如GPU在不同负载的工作场景下,所需要的电压可能是不一样的这需要KMD这里做出判断和对GPU的用电负载进行调整,总之,这单独一块,就很复杂.
2.GPU任务调度.
上层应用通过AP1下发任务给GPU后,需要将GPU任务分发给硬件处理,这里往往会是一个状态机+任务队列,其中会涉及到很多同步操作的考虑。(这里我不太道-希望有大佬补充)
3.GPU内存管理9,经典问题,GPU自己有一套MMU机制,需要在KMD这里实现GPU的页表机制。这里举一个最简单的例子,我在上层调用cuda接口,分配了一个1920×1080×4的GPU内存用来存纹理。GPU实际管理内存空间是用Page来管理的,不是按照Size来算的,因此在KMD驱动里,
会将分配的Size换算成Page个数(这里其实不太准确哈,也有可能是在UMD里面
做这个事情的),根据不同的硬件特性,要创建分配GPU内存空间的虚拟地址Q有多级缓存Q,在这条最简单的通路上,“
会需要支持不同的GPU对齐策略Q。拿到Page个数后,
需建立页表项,插入GPU页表等等。但显然现在的GPU都有着纷繁复杂的缓存机制处理,总之也很难。
4.GPU硬件特性的支持,还有一个更加恶心的东西,是不同GPU硬件特性的支持,比如有些GPU支持光追单元,
那我要在KMD里面的流程中添加各种各样支持光追9的宏判断和检查处理,要在又
臭又长的上下电和任务调度的代码里面找要在那些地方添加光追的支持。

UMD侧


UMD侧的处理一股是面向AP1,也用来做和KMD驱区动的桥梁。基本上就是API的实现,UMD侧最
大的工作量就是这个了,但是可能比KMD全部的工作量还要大。一个例子,当你在调用
glTexlmage2D到操作系统执行到KMD的ko前,这个函数都干了些什么,里面会涉及各种合法,不
合法的可能场景的判断,
上,为深度模板数据和·
Vulkan,
OpenGL.话,会死的。
,各种的对齐需求和边界处理”,在其中你甚至要在开辟内存和纹理上传般纹理分两条不同的通路。而现在GPU处理的API会有很多,比如DX12, OpenCL, CUDA
每一种支持的AP|都要进行详尽和完善的实现的
除了上面两个问题之外,还有一大工作内容是解问题单.
比如下面的问题
1.4k视频播放的时候花屏了,这可能是编解码的问题,也可能是GPU的问题
2.游戏加载的时候闪屏了
3.移动端相机打开异常了
这可能是GPU的问题,也可能是Display的问题
这可能是ISP的问题,
也可能是GPU的问题
上述的这些组件和GPU有强交互
组件遇到无法正常工作的问题丢给你,
那么就必须了解GPU驱动流程中和这些模块交互细节,不然其他
和这些组argue。
可能并不是GPU的原因
不清楚这些边界模块的话,都没法
总之,我浅尝即止的感受下来,GPU驱动开发的岗位对你所涉及GPU的底层硬件知识,你所面向平
台的操作系统,以及通用的嵌入式开发9知识,
Games 101,
要求是非常高的。至于图形学Q,
但是要认认真真看完看懂,其余的缺啥补啥)就差不多了
知道基本知识Q应该没有GPU驱动工程师
会自己去手动写复杂的Shader的吧,这部分一
般算法组的同事会提供给的

2 CUDA 系统架构
分层架构
从体系结构的组成来说,CUDA 包含了三个部分:

  1. 开发库 (Libraries):它是基于 CUDA 技术所提供的应用开发库。CUDA 包含两个重要的标准数学运算库——CUFFT(离散快速傅立叶变换)和 CUBLAS(基本线性代数子程序库)。这两个数学运算库解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。
  2. 运行期环境 (Runtime):提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。例如:运行时 API:提供了一系列函数,用于执行设备内存分配、内核启动、事件管理、流控制等操作。核函数:这是在 GPU 上并行执行的函数,由开发者编写,用于执行具体的并行计算任务。
  3. 驱动 (Driver):驱动程序层位于硬件层之上,是 CUDA 架构中的中间件,负责硬件抽象、资源管理、错误处理、CPU 和 GPU 通信。驱动程序层通过 CUDA 运行时 API 与主机代码交互。

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/a284365/article/details/138324736

英伟达开源了kernel层的驱动代码:

GitHub - NVIDIA/open-gpu-kernel-modules: NVIDIA Linux open GPU kernel module source

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值