一、硬件抽象层
硬件抽象层,HAL,Hardware Abstraction Layer。在学习操作系统或计算机原理时,都会学到它。它是操作系统与硬件之间的一层抽象接口。其核心的作用是把硬件设备的不同与上层软件的适配抽象隔离,实现跨平台的可移植性和兼容性。进一步降低软件开发与硬件兼容的复杂度并且避免直接操作硬件增强整体的安全性。
可以简单的把HAL当作一个适配器,它对软硬件进行了形式上的解耦。
二、CUDA中的硬件抽象层
CUDA开发中,当然也存在类似于操作系统一样的软硬件解耦兼容的情况。所以CUDA也提供了类似的硬件抽象层。它提供了上层软件开发与GPU硬件间的一层抽象,将GPU原生的复杂的指令、架构封装为统一的编程接口。通过这层抽象,可以让开发者不再关注GPU硬件的细节,实现了类似JAVA的一次编写多处运行的目的。
CUDA中的HAL,以极低的效率损失换取了超过十倍以上的开发效率。从整体上看,是相当优秀的。其核心的机制就是虚拟指令集PTX。
三、抽象层的分析
CUDA中的硬件抽象层主要分为以下几项核心技术:
- 抽象的编程模型
CUDA将并行计算的模型划分为三层即Grid,Block和Thread。通过它们的动态组合可以实现对并行任务的最大效率处理 - PTX虚拟指令架构和JIT动态编译机制
作为抽象的核心机制,PTX中间状态码提供了不同GPU的自动适配。而JIT机制则保证了PTX中间代码转向原生指令(SASS)代码的运行效率。它是CUDA代码可以对NVIDIA的GPU跨代支持的基础 - SIMT的运行模型
CUDA通过使用Warp的机制,实现了SIMT运行模型。即相同的指令作用在不同的数据上。这种抽象机制可以保证并行的效率 - 分层驱动与运行时API
CUDA提供了Driver API和Runtime API用于在用户态进行相关的接口操作。同时,提供了内核态的驱动,作为连接GPU与操作系统的方式,实现相关的指令处理等操作 - 统一的内存抽象
随着CUDA版本的不断升级。CUDA对内存的抽象管理更加完善,通过对寄存器、缓存和共享内存等等的抽象架构,以及新版本中的统一内存管理。让开发者对内存管理和控制相当便捷
CUDA的硬件抽象层对开发者来说是一种好事,它让开发变得更加容易,减少了异构编程的复杂度。但这不代表其是普适的。特别对于其它厂商的GPU并不能直接应用。这也就限制了其应用的一部分场景。不过,NVIDIA的GPU现在应用最为广泛,这一点也可以暂时不考虑。
四、总结
抽象的目的就是为了达到某种目的的简便。抽象往往意味着性能的损失,但只要控制好损失与收益的平衡,就可以认为抽象是有价值的。世事无非取舍,只看聚焦点在哪即可。

1057

被折叠的 条评论
为什么被折叠?



