在CUDA编程中,程序性能与GPU硬件密切相关。不同于CPU,GPU的编程需要深入理解硬件结构。以Fermi架构为例,GPU的硬件层次结构有助于高效管理众多核心。首先,硬件层的结构从设备开始,它由一组SM(流式多处理器)阵列构成,如Fermi有16个SM,还包括全局机载内存和全局调度器Giga Thread引擎。调用内核时,...
cuda编程笔记三:硬件线程组织结构
在CUDA编程中,程序性能与GPU硬件密切相关。不同于CPU,GPU的编程需要深入理解硬件结构。以Fermi架构为例,GPU的硬件层次结构有助于高效管理众多核心。
首先,硬件层的结构从设备开始,它由一组SM(流式多处理器)阵列构成,如Fermi有16个SM,还包括全局机载内存和全局调度器Giga Thread引擎。调用内核时,Giga Thread根据SM的资源分配线程块,目标是最大化并行性,所以线程块数量应是SM数量的整数倍。
深入到第二层,SM是GPU的核心,每个SM包含CUDA核心(SP),负责执行计算。SM能容纳多个线程块,通过线程束调度器管理,每32个线程构成一个线程束。线程束数量受SM资源限制,Fermi SM可以容纳48个线程束,每个SM常驻1536个线程。
线程束是并行处理的基本单元,一个线程块的线程数量应为32的倍数,以避免资源浪费。线程束分化是由于分支结构可能导致的问题,通过调整分支粒度,如(tid/warpSize)%2==0,可以减少线程束分化带来的性能损失。
在软件层,线程块(Block)作为中间层次,提供通信、同步和可扩展性的支持。Block内的线程通过shared memory通信,线程块间的同步通过__syncthreads函数实现。CUDA程序的可拓展性依赖于线程块在不同数量SM上的灵活分布。2024-08-21