深入探究GPU溢出漏洞:风险与应对策略
1. CUDA架构背景
CUDA是英伟达GPU广泛使用的通用计算平台,它由设备驱动(负责与GPU的底层交互)、运行时环境和编译工具链组成。CUDA应用程序包含在CPU上运行的主机代码,以及通常被称为内核的、在GPU上运行的设备代码。
一个运行的内核由大量的GPU线程组成,线程被分组为线程块,线程块又被分组为网格。基本执行单元是线程束,通常包含32个线程。每个线程都有自己的程序计数器、寄存器和本地内存。线程块是独立的并行单元,可以独立于其他线程块执行。每个线程块都有一个私有的共享内存空间,用于在实现并行算法时进行线程间通信和数据共享。网格是可以并发执行相同内核的线程块数组,整个网格由单个GPU处理。
GPU内核执行包括以下四个步骤:
1. 通过DMA将输入数据从主机内存传输到GPU内存。
2. 主机程序指示GPU启动内核。
3. 通过DMA将输出从设备内存传输回主机内存。
CUDA提供了不同的内存空间,在执行过程中,CUDA线程可以从多个内存空间访问数据。具体内存空间如下表所示:
| 内存空间 | 可访问线程范围 | 特点 |
| ---- | ---- | ---- |
| 本地内存 | 单个线程 | 每个线程私有,实际位于全局内存,内核内声明的自动变量映射到本地内存 |
| 共享内存 | 同一线程块内的所有线程 | 片上内存,低延迟访问,类似L1缓存,用于同一线程块内线程间数据共享 |
| 全局内存(设备内存) | 所有线程 | 可被GPU和CPU访问 |
| 常量内存 | 所有线程 | 只读 |
| 纹理内存 | 所有
超级会员免费看
订阅专栏 解锁全文
3394

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



