nVIDIA CUDA 驱动程序究竟做了啥?

Posted

技术标签:

【中文标题】nVIDIA CUDA 驱动程序究竟做了啥?【英文标题】:What does the nVIDIA CUDA driver do exactly?nVIDIA CUDA 驱动程序究竟做了什么? 【发布时间】:2012-04-03 14:37:02 【问题描述】:

Nvidia CUDA 驱动程序到底是做什么的?从使用CUDA的角度来看。 驱动程序传递内核代码,执行配置(#threads,#blocks)...... 还有什么?

我看到一些帖子说驱动程序应该知道可用 SM 的数量。 但这不是不必要的吗?一旦内核被传递到 GPU,GPU 调度程序只需将工作分散到可用的 SM 上......

【问题讨论】:

【参考方案1】:

GPU 不是一个完全自主的设备,它需要主机驱动程序的大量帮助才能完成 最简单的事情。据我了解,驱动程序至少包含:

JIT 编译器/优化器(PTX 汇编代码可以由驱动程序在运行时编译,如果需要和可能,驱动程序还将重新编译代码以匹配设备的执行架构) 设备内存管理 主机内存管理(DMA 传输缓冲区、固定和映射主机内存、统一寻址模型) 上下文和运行时支持(代码/堆/堆栈/printf 缓冲内存管理)、动态符号管理、流等 内核“网格级”调度程序(包括在支持它的架构上管理多个同步内核) 计算模式管理 显示驱动程序互操作(用于 DirectX 和 OpenGL 资源共享)

这可能代表了将一些用户态设备代码放到 GPU 上并通过主机端 API 运行所需的最低限度。

【讨论】:

如果您不介意,再问一个问题。 “统一寻址模型”有点像虚拟内存,对吧? CUDA 内核中使用的虚拟内存地址将被转换为实际的物理 GPU 内存地址(全局、本地、共享......)。这纯粹是在驱动程序级别完成的吗?我认为驱动程序只需要将统一地址转换为实际物理地址(全局、本地……),而 GPU HW 不需要知道任何关于这些虚拟内容的信息。我理解正确吗?谢谢! 我所说的统一寻址是指 CUDA 4.0 及更高版本中的方案,它允许多个 GPU 和某些其他设备(如网络接口)将自身映射到与主机的公共地址空间。这一切都由司机完成。 Fermi 卡似乎有一个 TLB,用于进行虚拟地址到硬件功能的内部映射。这需要进行编程,这是驱动程序将进入的地方,但地址转换应由设备完成。

以上是关于nVIDIA CUDA 驱动程序究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

nvidia驱动、cuda驱动和cuda工具包之间有啥关系?

不同版本cuda对应的NVIDIA驱动版本

“找不到适合 jdbc:sqlite 的驱动程序”问题。我究竟做错了啥?

Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装

CUDA 程序导致 nvidia 驱动程序崩溃

NVIDIA CUDA:啥是开发者驱动程序?